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); } } } }