本题需要维护的不是最短路径的估计值,而是路径最大边权的最小值估计值
因此只需要修改一下relax即可
#include<iostream> #include<vector> #include<queue> #include<cmath> #include<cstring> using namespace std; #define inf 0x3f3f3f3f int n; struct node{ int num; float x,y; float d; bool operator < (const node & re) const{ return re.d<d; } }; node nodes[1006]; bool can[1007]; void dijkstra() { memset(can,0,sizeof(can)); for(int i=1;i<=n;i++) { nodes[i].d=inf,nodes[i].num=i; cin>>nodes[i].x>>nodes[i].y; } nodes[1].d=0; priority_queue<node>Q; Q.push(nodes[1]); while(!Q.empty()) { node t=Q.top(); Q.pop(); if(can[t.num]) continue; can[t.num]=1; for(int i=1;i<=n;i++){ if(i==t.num) continue; nodes[i].d=min(nodes[i].d,max(nodes[t.num].d,sqrt((nodes[i].x-nodes[t.num].x)*(nodes[i].x-nodes[t.num].x)+(nodes[i].y-nodes[t.num].y)*(nodes[i].y-nodes[t.num].y) ) )); Q.push(nodes[i]); } } } int main() { int op=1; while(1) { cin>>n; if(n==0) break; dijkstra(); cout<<"Scenario #"<<op<<endl; cout<<"Frog Distance = "; printf("%.3f\n\n",nodes[2].d); op++; } return 0; }