这题也是最短路类的题目
但求的不是从一点到另一点的最短路径,而是求从起点到终点的所有的路径中每条路径上的最大边的最小值,好像有点拗口。。
其实这并没有难多少,只需要把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;
}