您的位置:首页 > 其它

pku 2253 Frogger(Dijkstra+heap)

2009-07-31 23:20 288 查看
WA了无数次。改变量类型,改输出控制,检查数组初始化。还是WA。

最后发现,原来还是queue没有初始化。

多case的情况就得注意变量初始化呀。

#include "math.h"
#include <queue>
#include <iostream>
#define Distance(x,y,x2,y2) ((x-x2)*(x-x2)+(y-y2)*(y-y2))
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;
int position[200+5][2];//这里没有存边集,而是在需要的时候直接用坐标运算
bool used[200+5];
int dist[200+5];
struct node
{
int dist;
int index;
};
bool operator>(const node& a,const node& b)
{
return a.dist>b.dist;
}
priority_queue<node,vector<node>,greater<vector<node>::value_type>> my_queue;
int stone_num;
void solve();
int main()
{
int k=1;
while(scanf("%d",&stone_num)&&stone_num!=0)
{
for(int i=0;i<stone_num;i++)
{
scanf("%d%d",&position[i][0],&position[i][1]);
}
solve();
printf("Scenario #%d/n",k++);
printf("Frog Distance = %.3lf/n/n",sqrt(double(dist[1])));
}
return 0;
}
void solve()
{
while(!my_queue.empty()) my_queue.pop();//多case,所以每次使用前要初始化queue
node temp,temp2;
for(int i=1;i<stone_num;i++)//这道题目中默认起点编号为0,终点编号为1
{
dist[i]=INT_MAX;
}
memset(used,0,sizeof(used));
dist[0]=0;
temp.dist=0;
temp.index=0;
my_queue.push(temp);//把起点加到优先队列中
while(1)
{
temp=my_queue.top();
my_queue.pop();
if(used[temp.index]) continue;//因为一个节点在它的dist每更新一次的时候都会加进heap,所以heap中可能存在index相同的情况,因此scan过的点直接跳过就可以了
else used[temp.index]=true;//标记scan过的点
if(temp.index==1) return;
for(int i=1;i<stone_num;i++)
{
if(used[i]) continue;
if(Max(dist[temp.index],Distance(position[temp.index][0],position[temp.index][1],position[i][0],position[i][1]))<dist[i])//这个地方和通常意义上的Dijkstra不一样,这里取大值
{
dist[i]=Max(dist[temp.index],Distance(position[temp.index][0],position[temp.index][1],position[i][0],position[i][1]));
temp2.dist=dist[i];
temp2.index=i;
my_queue.push(temp2);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  distance math.h struct