最短路变形 POJ 2253 Frogger

来源:互联网 发布:linux终端删除~$ 编辑:程序博客网 时间:2024/05/02 01:54

这题也是最短路类的题目

但求的不是从一点到另一点的最短路径,而是求从起点到终点的所有的路径中每条路径上的最大边的最小值,好像有点拗口。。

其实这并没有难多少,只需要把dijstra的松弛过程改一下就可以了

核心代码是

int  k = max(  d[x] , W[x][y] );
d[y]=min( k,d[y] );

另外这题我的代码在poj上只能用G++交才能通过,C++会WA的

具体细节看代码的注释

另外和这题十分相似但又相反的是POJ 1797 我的上一篇博文也就是我的第一篇博文就是介绍的那个题目,哈哈~~

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define INF 1e18int W[300][300],d[300];bool vis[300];int node_num,edge_num;using namespace std;struct POINT { int a,b;}po[300];double dist(POINT a,POINT b){return (a.a-b.a)*(a.a-b.a)+(a.b-b.b)*(a.b-b.b);}void read(){int i=0;while(++i<=node_num)cin>>po[i].a>>po[i].b;for(int i=1;i<=node_num;i++)for(int j=1;j<=node_num;j++)W[i][j]=dist(po[i],po[j]);//计算任意2点的距离的平方}void dijstra(){    memset(vis,0,sizeof(vis));    for(int i=1;i<=node_num;i++)d[i]=W[1][i];//初始化青蛙从起点跳到每个点的距离    for(int i=1;i<=node_num;i++)    {        int x,m=INF;        for(int y=1;y<=node_num;y++) if(!vis[y]&&d[y]<=m) m=d[x=y];        vis[x]=1;        for(int y=1;y<=node_num;y++)        {int k=max(d[x],W[x][y]);//k 是当前能到此处的最大距离d[y]=min(k,d[y]);//选择能到此处的最短距离        }    }}int main(){int ii=0;while(cin>>node_num,node_num){read();dijstra();printf("Scenario #%d\nFrog Distance = %.3f\n\n",++ii,sqrt(d[2]));//输出要注意下的}return 0;}


原创粉丝点击