题目链接:http://poj.org/problem?id=2253
题目大意:第一行开始位置的坐标,第二行终止位置的坐标,剩下的n-2行是水中石头的坐标,求从开始到终止每次选取最小的权值,在每点的最小权值中输出最大的
思路:简单的最短路的比较
具体代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
const int Max=210;
const int INF=0x3f3f3f3f;
using namespace std;
int n;
double dis[Max][Max];
struct node
{
double x,y;
} p[Max];//定义一个结构体来储存坐标x,y
int main()
{
int t=0;
while(scanf("%d",&n)&&n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
dis[i][j]=dis[j][i]=INF;
}
}//对dis初始化
t++;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
dis[i][j]=(double)sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));//dis[i][j]就是i点到j点的距离
}
}
for(int k=0; k<n; k++)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(dis[i][j]>max(dis[i][k],dis[k][j]))
{
dis[i][j]=max(dis[i][k],dis[k][j]);//每次都选出最大的边
}
}
}
}//Floyd求最短路径
printf("Scenario #%d\n",t);
printf("Frog Distance = %.3f\n",dis[0][1]);//输出始点0到终点1的最短路径的最大边
printf("\n");//最后别忘了输出一行换行
}
return 0;
}