修改条件的DIJKSTRA。。。这都搞了一下午。。。郁闷了。。。
松弛条件修改为:dist[i]=max(dist[minp],edge[minp][i]) (dist用来记录构成路径的最短边集合中的最长边(很绕口啊。。。公认的))
还有 要注意边界处理 先把dist[i]设置为edge[0][i]
呃。。大概就这么多。。好久不写最短路了。。缺乏练习啊。。
#include <stdio.h> #include <string.h> #include <math.h> #define MAXN 210 #define inf 1000000000 struct Tpoint { double x,y; } point[MAXN]; double edge[MAXN][MAXN]; double dist[MAXN]; int used[MAXN]; int n; double max(double a,double b) { return a>b? a:b; } double length(Tpoint a, Tpoint b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } void addedge(int i,int j) { edge[i][j]=length(point[i],point[j]); } void dijkstra() { memset(used,0,sizeof(used)); for(int i=0; i<n; i++) dist[i]=edge[0][i]; dist[0]=0; used[0]=1; for(int i=0; i<n; i++) { double min=inf; int minp; for(int j=0; j<n; j++) { if(!used[j] && dist[j]<min) { min=dist[j]; minp=j; } } used[minp]=1; if(min==inf) break; for(int j=0; j<n; j++) { if(!used[j] && max(dist[minp],edge[minp][j]) < dist[j]) { dist[j] = max(dist[minp],edge[minp][j]); } } } } int main() { int ppp=1; while(scanf("%d",&n),n) { for(int i=0; i<n; i++) for(int j=0; j<n; j++) edge[i][j]=inf; for(int i=0; i<n; i++) { scanf("%lf%lf",&point[i].x,&point[i].y); for(int j=0; j<i; j++) { addedge(j,i); addedge(i,j); } } //test //for(int i=0; i<n; i++) // for(int j=0; j<n; j++) // if(edge[i][j]<inf) // printf("%d %d %.0f %.0f %.0f %.0f %.3f\n",i,j,point[i].x,point[i].y,point[j].x,point[j].y,edge[i][j]); dijkstra(); printf("Scenario #%d\nFrog Distance = %.3f\n\n",ppp++,dist[1]); //for (int i=0; i<n; i++) { // printf("%.3lf\n",dist[i]); //} } }