poj2253佛洛依德

题意:给出青蛙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

猜你喜欢

转载自blog.csdn.net/qq_17175221/article/details/80377212