首页 > 代码库 > poj2253
poj2253
题意:给定n个点,规定两点间的距离为从一个点到另一个点的一系列路径中相邻两点之间欧几里得距离的最大值。现求一号点和二号点之间的最小距离。
思路:prim算法改一下,从一号点开始求最小生成树,直到找到二号点。(ans保存所求路径中的最大值,而不是最后一个)
例:3
999 999
1 1
3 3
output:1408.557
1 //prim 改 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 const int MAXN = 205; 6 const int inf = 100000000; 7 int x[MAXN]; 8 int y[MAXN]; 9 double a[MAXN][MAXN]; 10 bool vis[MAXN]; 11 double dis[MAXN]; 12 int n; 13 double max(double a,double b) 14 { 15 return a>b?a:b; 16 } 17 void pre() 18 { 19 for (int i=0;i<n;i++) 20 { 21 for (int j=0;j<n;j++) 22 { 23 a[i][j]=sqrt((double )(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); 24 } 25 } 26 } 27 double prim(int src,int end) 28 { 29 double ans; 30 memset(vis,0,sizeof(vis)); 31 for (int i=0;i<n;i++) 32 dis[i]=(double )inf; 33 dis[src]=0; 34 for (int i=0;i<n;i++) 35 { 36 double temp=(double )inf; 37 int k; 38 for (int j=0;j<n;j++) 39 { 40 if (vis[j]) continue; 41 if (temp>dis[j]) 42 { 43 temp=dis[j]; 44 k=j; 45 } 46 } 47 ans=max(ans,temp); 48 if (k==end) return ans; 49 vis[k]=1; 50 for (int j=0;j<n;j++) 51 { 52 if (vis[j]) continue; 53 if (dis[j]>a[k][j]) 54 dis[j]=a[k][j]; 55 } 56 } 57 return ans; 58 } 59 int main() 60 { 61 int t=0; 62 while (scanf("%d",&n),n) 63 { 64 for (int i=0;i<n;i++) 65 { 66 scanf("%d%d",&x[i],&y[i]); 67 } 68 pre(); 69 double ans=prim(0,1); 70 71 printf("Scenario #%d\n",++t); 72 printf("Frog Distance = %.3f\n\n",ans); 73 } 74 return 0; 75 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。