POJ 2253 最短路径变形
来源:互联网 发布:c语言中 是什么意思 编辑:程序博客网 时间:2024/05/16 23:36
//11108024c00h00g2253Accepted720K0MSG++1360B2012-12-14 11:50:30//输出lf会wa//题意:从起点到终点会有很多路径,每条路径上的边有一个最大值,求这些最大值中的最小值 //算法过程,每次寻找最小的d值,然后如果d[j]>max(d[v],mat[v][j]),则更新d[j]=max(d[v],mat[v][j])#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm>using namespace std;double mat[205][205];struct Node{ int x,y;};Node stone[205];int n;double d[205];int vis[205];int cases=0;int main(){ while(scanf("%d",&n)!=EOF){ if(n==0) break; cases++; for(int i=0;i<n;i++) scanf("%d%d",&stone[i].x,&stone[i].y); for(int i=0;i<n;i++) for(int j=0;j<n;j++){ mat[i][j]=sqrt((stone[i].x-stone[j].x)*(stone[i].x-stone[j].x)+(stone[i].y-stone[j].y)*(stone[i].y-stone[j].y)); } memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) d[i]=mat[0][i]; vis[0]=1; for(int i=0;i<n-2;i++){ //查找最小值 double minF=999999999; int v=-1; for(int j=1;j<n;j++){ if(d[j]<minF&&vis[j]==0){ minF=d[j]; v=j; } } vis[v]=1; for(int j=1;j<n;j++){ if(vis[j]==0&&d[j]>max(d[v],mat[v][j])){ d[j]=max(d[v],mat[v][j]); } } } printf("Scenario #%d\n",cases); printf("Frog Distance = %.3f\n\n",d[1]); } }