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