标签:
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
题意:一个青蛙在石头1上,它想要拜访在石头2上的青蛙,但是他的弹跳能力有限,可能这两个石头离得很远,所以它可以借助其他的石头来帮助自己,那么现在求它至少能跳多远才能去拜访另一只青蛙,即求两点之间所有路径之间最大值的最小值(最短路问题有很多都是求最大值中的最小值或者是最小值中的最大值,原理差不多的~~~~)
#include<stdio.h> #include<math.h> #define INF 0x3f3f3f3f #define N 210 #define max(a, b) (a > b ? a : b) double G[N][N], dist[N]; //dist数组存放的是两点之间所有路径之间最大距离的最小值的平方(两点间的距离计算时最好用平方,结果别忘了开方就行) int visit[N], n; void Init() { int i; for (i = 0; i <= n; i++) { dist[i] = INF; visit[i] = 0; } } void Dist() { int i, j, idex; double Min; dist[1] = 0; for (i = 1; i <= n; i++) { Min = INF; for (j = 1; j <= n; j++) { if (!visit[j] && dist[j] < Min) { Min = dist[j]; idex = j; } } //第一个for循环是为了标记每一个已经确定的dist值,若n个都确定好了就可以结束了 visit[idex] = 1; for (j = 1; j <= n; j++) { if (!visit[j] && dist[j] > max(dist[idex], G[idex][j])) dist[j] = max(dist[idex], G[idex][j]); } //第二个for循环是为了给dist数组存入数据 } } int main () { double a[N], b[N]; int k = 0, i, j; while (scanf("%d", &n), n) { Init(); k++; for (i = 1; i <= n; i++) scanf("%lf %lf", &a[i], &b[i]); for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) G[i][j] = (a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]); } Dist(); printf("Scenario #%d\n", k); printf("Frog Distance = %.3lf\n", sqrt(dist[2])); printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4678278.html