hdu 1875 畅通工程再续(最小生成树)
hdu 1875 畅通工程再续
http://acm.hdu.edu.cn/showproblem.php?pid=1875
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
最小生成树问题,下面用 kruskal算法解答
ac代码:#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define INF 99999
struct
{
double x,y;
}dd[110];
int parent[110];
struct nod
{
int x,y;
double dv;
}node[5010];
int findp(int a)
{
while(a!=parent[a])
a=parent[a];
return a;
}
double deal(nod a)
{
int x=findp(a.x);
int y=findp(a.y);
if(x!=y)
{
parent[y]=x;
return a.dv;
}
return 0;
}
double distance(double x1,double y1,double x2,double y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
int comp(nod a,nod b){return a.dv<b.dv;}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&dd[i].x,&dd[i].y);
parent[i]=i;
}
int k=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
node[k].x=i;
node[k].y=j;
node[k].dv=distance(dd[i].x,dd[i].y,dd[j].x,dd[j].y);
if(node[k].dv<10||node[k].dv>1000)
node[k].dv=INF+1;
k++;
}
int m=k;
sort(node,node+m,comp);
double sum=0,stemp;
for(i=0;i<m;i++)
{
stemp=deal(node[i]);
if(stemp>INF)
break;
else
sum+=stemp;
}
if(i<m)
printf("oh!\n");
else
printf("%.1lf\n",100*sum);
}
return 0;
}