最短路变形 POJ 2253 Frogger

这题也是最短路类的题目

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

其实这并没有难多少,只需要把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 1e18
int 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;
}


你可能感兴趣的:(ACM,poj,2253,frogger)