您的位置:首页 > 其它

HDU 1875-kruskal

2015-06-09 20:33 225 查看

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1875

思路:还是简单的最小生成树;

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include<cmath>
using namespace std;
const int  maxn=10009;
struct Node
{
int x,y;
double w;
bool operator<(const Node &a)const
{
return w<a.w;
}
} sd[maxn];
struct node
{
int a,b;
} sk[maxn];
int p[maxn],n,m;
int Find(int x)
{
if(p[x]==-1)
{
return x;
}
return p[x]=Find(p[x]);
}
void Kruskal(int k)
{
double ans=0;
int  cnt=0;
for(int i=0; i<k; i++)
{
int x=Find(sd[i].x);
int y=Find(sd[i].y);
if(x!=y)
{
cnt++;
ans+=sd[i].w;
p[x]=y;
}
}
if(cnt<n-1)
printf("oh!\n");
else printf("%.1lf\n",ans);
}
double gh(double a,double b,double c,double d)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
int main()
{
while(scanf("%d",&m)!=EOF)
{
for(int i=0; i<m; i++)
{
scanf("%d",&n);
memset(p,-1,sizeof(p));
for(int i=0; i<n; i++)
scanf("%d%d",&sk[i].a,&sk[i].b);
int k=0;
for(int i=0; i<n-1; i++)
{
for(int j=i+1; j<n; j++)
{
double df=gh(sk[i].a,sk[i].b,sk[j].a,sk[j].b);
// printf("&&&%d\n",df);
if(df>=10&&df<=1000)
{

sd[k].w=df*100.0;
sd[k].x=i;
sd[k].y=j;
k++;
}
}
}
sort(sd,sd+k);
Kruskal(k);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kruskal 算法