题目地址: 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; }