题目地址: http://poj.org/problem?id=2253
题目大意,给n个点的坐标,要求从第一个点到第二个点所走的所有的边最大的那个边s。
求s的最小值。
用一个maxdis记录当前的最大值,
dis[i]表示的是,从1到i点走的边最大的那条边,
只要遇到2直接返回maxdis即可。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;
/*
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
*/
int n,s[205];
double edge[205][205],dis[205],x[205],y[205];
//这里的dis[i]表示的是,从1到i点走的边最大的那条边
double Dijkstra(int be)
{
int i,j,k;
double temp,maxdis=0;
for(i=1;i<=n;i++)
{
dis[i]=edge[be][i];
s[i]=0;
}
s[be]=1;dis[be]=0;
for(i=1;i<=n;i++)
{
temp=0x7f7f7f7f;
k=1;
for(j=1;j<=n;j++)
if(!s[j]&&dis[j]<temp)
{
k=j;temp=dis[j];
}
if(temp>maxdis)//如果当前最大的大于maxdis
maxdis=temp;
if(k==2)//如果到了2这个点,直接返回maxdis,因为没有要求走哪条路
return maxdis;
s[k]=1;
for(j=1;j<=n;j++)
if(!s[j])
{
double ss=edge[k][j];
if(ss<dis[j])//如果从k到j小于从1到j
dis[j]=ss;
}
}
}
int main()
{
int i,j,casei=0;
while(cin>>n,n)
{
for(i=1;i<=n;i++)
{
edge[i][i]=0;
scanf("%lf%lf",&x[i],&y[i]);
for(j=1;j<i;j++)
{
double temp=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
edge[i][j]=edge[j][i]=temp;
}
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",++casei,Dijkstra(1));
}
return 0;
}