Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 21206 | Accepted: 6903 |
Description算法
Inputapp
Outputide
Sample Inputspa
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Outputcode
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
Sourcethree
/* 題意:給出一個無向圖,求一條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); } }