标签:
Time Limit: 1000MS Memory Limit: 65536K
Description
Input
Output
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Output
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
题意:就是让你求从1到2的路径所经过的最大权值的最小值
分析:用Dijkstra的变形,每个路径的长度是这条路径所经过的最大权值
#include<stdio.h> #include<string.h> #include<iostream> #include<math.h> using namespace std; const int MAXN = 210; pair<int,int>p[MAXN]; double getdist(pair<int,int>p1,pair<int,int>p2) { return sqrt((double)(p1.first-p2.first)*(p1.first-p2.first)+(p1.second-p2.second)*(p1.second-p2.second)); } const double INF = 1e20; double cost[MAXN][MAXN]; double dis[MAXN]; bool vis[MAXN]; void Dijkstra(int n,int st) { for(int i=1;i<=n;i++){ dis[i]=INF; vis[i]=false; } dis[st]=0; for(int j=0;j<n;j++){ int k=-1; double Min=INF; for(int i=1;i<=n;i++){ if(!vis[i]&&Min>dis[i]){ Min=dis[i]; k=i; } } if(k==-1) break; vis[k]=true; for(int i=1;i<=n;i++) if(!vis[i]&&max(dis[k],cost[k][i])<dis[i]) dis[i]=max(dis[k],cost[k][i]); } } int main() { int n; int x,y; int iCase=0; while(scanf("%d",&n)==1&&n){ iCase++; for(int i=1;i<=n;i++){ scanf("%d%d",&x,&y); p[i]=make_pair(x,y); } for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ if(i==j) cost[i][j]=0.0; else cost[i][j]=cost[j][i]=getdist(p[i],p[j]); } } Dijkstra(n,1); printf("Scenario #%d\n",iCase); printf("Frog Distance = %.3f\n\n",dis[2]); } return 0; }
POJ 2253 Frogger (求每条路径中最大值的最小值,Dijkstra变形)
标签:
原文地址:http://www.cnblogs.com/wangdongkai/p/5635654.html