题意:给出青蛙A,B和若干石头的坐标,现青蛙A想到青蛙B那,A可通过任意石头到达B,
问从A到B多条路径中的最长边中最短的边
因为n<=200,故用佛洛依德水一哈。
佛洛依德是来求多源最短路,把ai和aj两点的最短距离通过松弛来求,用另一个点k作为中间节点
i-k,k-j来松弛ij之间的距离,整体上是dp的思想.
核心代码是三个循环
本题比较特殊 是求最长边里面的最短边 所以要修改最后的转台转移的条件和状态转移方程
if(d[i][j]>max(d[i][k],d[k][j])d[i][j]=max(d[i][k],d[k][j]);
code:
using namespace std; typedef long long ll; const double INF = 0x7fffffff; double d[215][215]; int n; double counter(int i, int j) { return sqrt((double)(corr[i].x - corr[j].x)*(corr[i].x - corr[j].x) + (corr[i].y - corr[j].y)*(corr[i].y - corr[j].y)); } int main() { int iCase = 0; while (scanf("%d", &n) != EOF&&n) { int i, j,k; iCase++; printf("Scenario #%d\n", iCase); for (i = 1; i <= n; i++) { scanf("%d%d",&corr[i].x,&corr[i].y); } for (i = 1; i <= n; i++) { for (j = i; j <= n; j++) { if (i == j) d[i][j] =counter(i,j); else d[j][i]=d[i][j] = counter(i, j); } } for (i = 1; i <= n; i++) { for ( j = 1; j <= n; j++) { for ( k = 1; k <= n; k++) { if (d[j][k] > max(d[j][i],d[i][k])) { d[j][k] = max(d[j][i], d[i][k]); } } } } printf("Frog Distance = %.3f\n\n", d[1][2]); } }
更新一组测试数据:
2
0 0
3 4
3
17 4
19 4
18 5
8
1 1
4 0
1 2
2 2
3 2
4 2
3 0
5 1
3
9 10
10 10
100 10
6
5 5
100 100
4 4
3 3
2 2
1 1
5
1 2
2 1
3 2
4 1
5 2
3
999 999
1 1
3 3
0
答案
Scenario #1
Frog Distance = 5.000
Scenario #2
Frog Distance = 1.414
Scenario #3
Frog Distance = 1.414
Scenario #4
Frog Distance = 1.000
Scenario #5
Frog Distance = 134.350
Scenario #6
Frog Distance = 1.414
Scenario #7
Frog Distance = 1408.557