题目大意:给一个图,求给出的两个节点之间,所有路径中权值最大的最小值(就是取出每一条路径里的权值最大值,然后答案就是这些最大值的最小值,有些拗口,注意一下)
分析:赤裸裸的Floyd。O(n^3)复杂度,贴出代码:
1 #include<stdio.h> 2 #include<cmath> 3 #include<cstring> 4 #define Max 210 5 int n,k=0; 6 struct Point 7 { 8 double x,y; 9 }point[Max]; 10 double map[Max][Max]; 11 double juli(Point a,Point b) 12 { 13 double x,y; 14 x=(a.x-b.x)*(a.x-b.x); 15 y=(a.y-b.y)*(a.y-b.y); 16 return sqrt(x+y); 17 } 18 void init() 19 { 20 int i,j; 21 for(i=1;i<=n;i++) 22 scanf("%lf%lf",&point[i].x,&point[i].y); 23 for(i=1;i<n;i++) 24 for(j=i+1;j<=n;j++){ 25 map[i][j]=map[j][i]=juli(point[i],point[j]); 26 } 27 } 28 void solve() 29 { 30 int k,i,j; 31 for(k=1;k<=n;k++) 32 for(i=1;i<=n;i++) 33 for(j=i+1;j<=n;j++) 34 if(map[i][k]<map[i][j] && map[k][j]<map[i][j]){ 35 if(map[i][k]<map[k][j]) map[j][i]=map[i][j]=map[k][j]; 36 else map[j][i]=map[i][j]=map[i][k]; 37 38 } 39 } 40 void outit() 41 { 42 printf("Scenario #%d ",++k); 43 printf("Frog Distance = %.3lf ",map[1][2]); 44 } 45 int main() 46 { 47 while(scanf("%d",&n) && n){ 48 init(); 49 solve(); 50 outit(); 51 } 52 return 0; 53 }