hdu1875 畅通工程再续最小生成树
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu1875 畅通工程再续最小生成树相关的知识,希望对你有一定的参考价值。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1875
题意:中文题
解析:建图后直接跑kruskal最小生成树,然后判断并查集后有是否有多个集合
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
struct node
int u,v;
double c;
node()
node(int _u,int _v,double _c)
u = _u;
v = _v;
c = _c;
bool operator < (const node &b)const
return c<b.c;
res[maxn];
struct point
double x,y;
a[maxn];
double dis(point p1,point p2)
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
int fa[maxn];
int getFa(int x)
if(x==fa[x])
return fa[x];
return fa[x] = getFa(fa[x]);
int main(void)
int t;
scanf("%d",&t);
while(t--)
int n;
scanf("%d",&n);
for(int i=0;i<=n;i++)
fa[i] = i;
for(int i=1;i<=n;i++)
scanf("%lf %lf",&a[i].x,&a[i].y);
int cnt = 0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
double d = dis(a[i],a[j]);
if(d>=10 && d<=1000)
res[cnt++] = node(i,j,d*100.0);
sort(res,res+cnt);
double ans = 0;
for(int i=0;i<cnt;i++)
int t1 = getFa(res[i].u);
int t2 = getFa(res[i].v);
if(t1!=t2)
ans += res[i].c;
fa[t1] = t2;
cnt = 0;
for(int i=1;i<=n;i++)
if(fa[i]==i)
cnt++;
if(cnt>1)
puts("oh!");
else
printf("%.1f\\n",ans);
return 0;
以上是关于hdu1875 畅通工程再续最小生成树的主要内容,如果未能解决你的问题,请参考以下文章