您的位置:首页 > 其它

POJ 2253 Frogger【最短路径变形-要连通】

2014-07-24 17:41 423 查看
题目:http://poj.org/problem?id=2253

题意:青蛙从A处到B处有多条路,求最短路

如 A -> B 那么如果A经过CD到B的路比直接到B短,那么选这条路

↓ ↑ 然后因为是青蛙跳,所以最少跳的长度为A到C,C到D,D到B中最大的

C -> D 不然会掉水

这里用Floyd算法,还有Dijkstra等其他解法,见百度:最短路径

#include<stdio.h>
#include<math.h>
#define Max 100000
struct zuobiao
{
int x,y;
}map[201];
double min(double x,double y)
{
return x<y?x:y;
}
double max(double x,double y)
{
return x>y?x:y;
}
int main()
{
int n,i,j,k,time=0;
double d,Floyd[201][201];
while(scanf("%d",&n)!=EOF && n)
{
time++;
for(i=1;i<=n;i++)
scanf("%d%d",&map[i].x,&map[i].y);
for(i=1;i<=n;i++)
{
Floyd[i][i]=0;
for(j=1;j<=n;j++)
Floyd[i][j]=Max;   //先设原路径为无穷远
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
d = sqrt ( ( map[i].x-map[j].x ) * ( map[i].x-map[j].x ) + (map[i].y-map[j].y) * (map[i].y-map[j].y) );
Floyd[i][j]=d;
Floyd[j][i]=d;
}
for(k=1;k<=n;k++)		//k为第三点
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
Floyd[i][j] = min ( max(Floyd[i][k],Floyd[k][j]), Floyd[i][j] );
printf("Scenario #%d\n",time);
printf("Frog Distance = %.3f\n\n",Floyd[1][2]);
}		//POJ输出double用%f
}
//当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线
//当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: