| 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