本题需要维护的不是最短路径的估计值,而是路径最大边权的最小估计值
因此只需要修改一下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 ",nodes[2].d); op++; } return 0; }
Heavy Transportation
本题需要维护的是路径最小边权的最大估计值
同样是修改relax为:
nodes[v].d=max(nodes[v].d, min(nodes[u].d,w) );
#include<iostream> #include<vector> #include<queue> #include<cmath> #include<cstring> using namespace std; #define inf 0x3f3f3f3f int n,m; struct node{ int num; int d; bool operator < (const node & re) const{ return re.d>d; } }; node nodes[1007]; struct side{ int v; int w; side(int _v,int _w):v(_v),w(_w){} }; vector<side>sides[1006]; bool can[1006]; void dij() { memset(can,0,sizeof(can)); for(int i=1;i<=n;i++){ nodes[i].num=i; nodes[i].d=0; } nodes[1].d=inf; 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=0;i<sides[t.num].size();i++) { int u=t.num,v=sides[t.num][i].v,w=sides[t.num][i].w; nodes[v].d=max(nodes[v].d, min(nodes[u].d,w) ); Q.push(nodes[v]); } } } int main() { int T; cin>>T; for(int yy=1;yy<=T;yy++) { for(int i=0;i<1005;i++) sides[i].clear(); cin>>n>>m; for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; sides[a].push_back(side(b,c)); sides[b].push_back(side(a,c)); } dij(); cout<<"Scenario #"<<yy<<": "<<nodes[n].d<<endl<<endl; } return 0; }