Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 21206 | Accepted: 6903 |
Description
Input
Output
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Output
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
Source
/* 题意:给出一个无向图,求一条1~2的路径使得路径上的最大边权最小. 分析:floyd变形,将更新距离的过程改为取最大值即可. */ #include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; const double DNF = 2000; const int maxn = 210; double w[maxn][maxn]; int n; struct Point{ double x,y; }p[maxn]; double dist(Point a, Point b) { return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); } void floyd() { for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) w[i][j] = min(w[i][j], max(w[i][k], w[k][j])); //更新i——j路径上最小的最大边权 } int main() { int kcase = 0; while(scanf("%d", &n) != EOF) { if(n == 0) break; for(int i = 1; i <= n; i++) { scanf("%lf%lf", &p[i].x, &p[i].y); } for(int i = 1; i <= n; i++) { w[i][i] = 0; for(int j = i+1; j <= n; j++) { w[i][j] = dist(p[i],p[j]); w[j][i] = dist(p[i],p[j]); } } floyd(); printf("Scenario #%d\n", ++kcase); printf("Frog Distance = %.3lf\n\n", w[1][2]); } }
/* 题意:给出一个无向图,求一条1~2的路径使得路径上的最大边权最小. 分析:dijkstra变形,将更新距离的过程改为取最大值即可. */ #include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; const double DNF = 2000; const int maxn = 210; double w[maxn][maxn]; double d[maxn]; int vis[maxn]; int n; double ans; struct Point{ double x,y; }p[maxn]; double dist(Point a, Point b) { return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); } void Dijkstra() { for(int i = 1; i <= n; i++) d[i] = DNF; d[1] = 0; memset(vis,0,sizeof(vis)); for(int i = 1; i <= n; i++) { int x; double m = DNF; for(int y = 1; y <= n; y++) if(!vis[y] && d[y] <= m) m = d[x=y]; vis[x] = 1; if(ans < d[x] && d[x]!= DNF) // ans 是这条路径上的最大权 { ans = d[x]; } if(x == 2) return; //走到目的地即可 for(int y = 1; y <= n; y++) if(!vis[y]) d[y] = min(d[y], w[x][y]); //更新未接入的点的dist } } int main() { int kcase = 0; while(scanf("%d", &n) != EOF) { if(n == 0) break; for(int i = 1; i <= n; i++) { scanf("%lf%lf", &p[i].x, &p[i].y); } for(int i = 1; i <= n; i++) { w[i][i] = 0; for(int j = i+1; j <= n; j++) { w[i][j] = dist(p[i],p[j]); w[j][i] = dist(p[i],p[j]); } } ans = 0; Dijkstra(); printf("Scenario #%d\n", ++kcase); printf("Frog Distance = %.3lf\n\n", ans); } }