Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 19928 | Accepted: 6464 |
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
题目大意:
给出两只青蛙的坐标A、B,和其他的n-2个坐标,任一两个坐标点间都是双向连通的。显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中又有一个最大距离。
现在要求求出所有通路的最大距离,并把这些最大距离作比较,把最小的一个最大距离作为青蛙的最小跳远距离。
Floyd算法
用Floyd算法求出两两最短路,再求出从每个点开始的最长路,最后从这n个最长路中求出最小的那个即为所求。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; struct node{ int x,y; }point[210]; double dis[210][210]; double Cal(node a,node b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main(){ //freopen("input.txt","r",stdin); int n,cases=0; while(~scanf("%d",&n) && n){ for(int i=1;i<=n;i++) scanf("%d%d",&point[i].x,&point[i].y); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) dis[i][j]=dis[j][i]=Cal(point[i],point[j]); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) //主要针对由i到j的松弛,最终任意两点间的权值都会被分别松弛为最大跳的最小(但每个两点的最小不一定相同) for(int j=1;j<=n;j++) if(dis[i][k]<dis[i][j] && dis[k][j]<dis[i][j]) //当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线 dis[i][j]=dis[j][i]=max(dis[i][k],dis[k][j]); //当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通 printf("Scenario #%d\n",++cases); printf("Frog Distance = %.3f\n\n",dis[1][2]); } return 0; }
#include <stdio.h> #include <math.h> #define MAX 1000000 #define M 205 struct node { int x,y; }stone[M]; double edge[M][M]; double dis(node a,node b) //算两点间的距离 { double len = (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y); len = sqrt (len); return len; } double prim (int n) { int start = 0,end = 1; //起始和终了位置 int mark[M],k,i,j; double d[M],ans; for (i = 0;i < n;i ++) { mark[i] = 0; d[i] = edge[start][i]; } mark[start] = 1; ans = 0; for (i = 1;i < n;i ++) { double min = MAX; for (j = 1;j < n;j ++) if (!mark[j]&&d[j] < min) { min = d[j]; k = j; } mark[k] = 1; ans = ans > d[k]?ans:d[k]; //最知道路径中最大的 if (k == end) break; //到终点了退出 for (j = 1;j < n;j ++) if (d[j] > edge[k][j]) d[j] = edge[k][j]; } return ans; } int main () { int n,count = 1; int i,j,k; while (scanf ("%d",&n)&&n) { for (i = 0;i < n;i ++) for (j = 0;j < n;j ++) edge[i][j] = MAX; for (i = 0;i < n;i ++) scanf ("%d%d",&stone[i].x,&stone[i].y); k = 0; for (i = 0;i < n;i ++) for (j = i+1;j < n;j ++) { double len = dis (stone[i],stone[j]); edge[i][j] = len; edge[j][i] = len; } double ans = prim(n); printf ("Scenario #%d\n",count++); printf ("Frog Distance = %.3f\n\n",ans); //POJ上不能用%.3lf,,这题WA到我崩溃。。。。。 } }