题意:求1点到2点的所有能够到2点的所有通路里的的最大路径(这里的路径特指两点之间的线段)的最小值。
这题对我来说收获颇丰,我们可以修改dijkstra里面的松弛函数,使得其变为求每个点的满足条件的值,并用dist数组来记录。详见代码。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define INF 0x3f3f3f3f #define INF2 -0x3f3f3f3f typedef struct Node { double x; double y; }; Node nodes[205*2]; typedef struct Egde { int l; int r; double value; }; double a[205*2][205*2]; double dist[205*2]; bool visited[205*2]; int n,sx,sy,ex,ey; double Max; void dijkstra() { visited[1]=true; for(int i=1; i<=n; i++) { dist[i]=a[1][i]; } for(int i=1; i<=n; i++) { int Min=INF,node=0; for(int j=1; j<=n; j++) { if(!visited[j]&&Min>dist[j]) { Min=dist[j]; node=j; } } if(node==0) return; visited[node]=true; for(int j=1; j<=n; j++) { Max=max(dist[node],a[node][j]);//构成dist[node]和a[node][j]里找最大的边,因为这两条边来构成一条新的dist[j] //用为要去最大边里的最小边,那么我们就要把它和原来的dist[j]进行比较 //再把较小的边赋给dist[j]来成为新的dist[j]以便进行下次更新 dist[j]=min(dist[j],Max); dist[j]=min(dist[j],Max); } } } int main() { int sym=0; while(scanf("%d",&n)&&n!=0) { sym++; memset(nodes,0,sizeof(nodes)); memset(a,0x3f,sizeof(a)); memset(dist,0x3f,sizeof(dist)); memset(visited,false,sizeof(visited)); for(int i=1; i<=n; i++) { scanf("%lf%lf",&nodes[i].x,&nodes[i].y); } for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { double d=sqrt((nodes[i].x-nodes[j].x)*(nodes[i].x-nodes[j].x)+(nodes[i].y-nodes[j].y)*(nodes[i].y-nodes[j].y)); a[i][j]=a[j][i]=d; a[i][i]=0; } } Max=INF; dijkstra(); printf("Scenario #%d\n",sym); printf("Frog Distance = %.3f\n\n",dist[2]); } return 0; }