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

来源:互联网 发布:linux c debug 编辑:程序博客网 时间:2024/05/20 10:53

题目: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 100000struct 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},只有选择最大跳才能保证连通


0 0
原创粉丝点击