Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 30438 | Accepted: 9810 |
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处,求出1和2所在的最小树中最大的边!
代码:
prim:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define MAX 0x3f3f3f3f using namespace std; int n,cot=0; double map[250][250]; int prim() { double lowcost[100000],min; double w[100000]; int i,j,mark; for(i=2;i<=n;i++) lowcost[i]=map[1][i]; lowcost[1]=0; int t=0; for(i=2;i<=n;i++) { min=MAX; for(j=2;j<=n;j++)//寻找最短距离 { if(lowcost[j]<min&&lowcost[j]!=0) { min=lowcost[j]; mark=j; } } lowcost[mark]=0; w[t++]=min; if(mark==2)//当1和2连在一个树上时,树的最大的边即为要求 { sort(w,w+t);//排序求最大的边 break; } for(j=2;j<=n;j++) { if(map[mark][j]<lowcost[j]) lowcost[j]=map[mark][j]; } } return printf("Scenario #%d\nFrog Distance = %.3f\n\n",cot,w[t-1]); } int main() { int x[250],y[250],i,j; while(scanf("%d",&n),n) { cot++; memset(map,0,sizeof(map)); for(i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); for(i=1;i<=n;i++) { for(j=i;j<=n;j++) { double dis=sqrt((x[i]-x[j])*1.0*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); map[i][j]=map[j][i]=dis; } } prim(); } return 0; }克鲁斯卡尔:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #include<math.h> int n,set[250]; double x[250],y[250]; struct line { int bg; int ed; double dis; }num[250000]; int cmp(line a,line b)//排序 { return a.dis <b.dis ; } double d(int i,int j) { double c; return c=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } int find(int p)//寻找距离最小的点 { int t; int child=p; while(p!=set[p]) p=set[p]; while(child!=p) { t=set[child]; set[child]=p; child=t; } return p; } int merge(int x,int y)//合并 { int fx=find(x); int fy=find(y); if(fx!=fy) { set[fx]=fy; return 1; } return 0; } int main() { int i,j; int v=1; while(scanf("%d",&n),n) { for(i=0;i<=n;i++) { set[i]=i; } for(i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); } int t=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { num[t].bg =i; num[t].ed =j; num[t].dis =d(i,j); t++; } sort(num,num+t,cmp); double mxe; for(i=0,j=0;i<t;i++) { if(merge(num[i].bg ,num[i].ed )) { if(find(1)==find(2))//当1和2连在一个树上时,树的最大的边即为要求 { mxe=num[i].dis ; break; } } } if(v) printf("Scenario #%d\n",v++); printf("Frog Distance = %.3f\n\n",mxe ); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhangxiaoxiang123/article/details/47618299