hdu1875畅通工程再续——基础并查集

题意:给你c个岛,在10~1000米内的连在一起即可,求最短米数,乘100,就是钱数;

思路;这道题给的还是坐标,和我以前发过的一道题类似。

先用坐标利用勾股定理求出岛之间的距离,然后用结构体存。注意存的时候不要存坐标,存编号(呵呵了吧,写写就知道了);

然后sort一遍,之后就是简单的并查集了;

坑点:没有坑点。

代码:(很简单,看过思路的话,你能写上)

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
struct node
{
int x,y;
double length;
}land[102*102];
int x[102],y[102];
int root[102];
int num[102];
bool cmp(node a,node b)
{
return a.length<b.length;
}
int find_root(int son)
{
if(root[son]!=son)
{
root[son]=find_root(root[son]);
}
return root[son];
}
int main()
{
int times,c;
scanf("%d",&times);
while(times--)
{
scanf("%d",&c);
for(int i=1;i<=c;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
for(int i=1;i<=c;i++)
{
num[i]=1;
root[i]=i;
}
int n=1;
for(int i=1;i<c;i++)
{
for(int j=i+1;j<=c;j++)
{
land[n].x=i;
land[n].y=j;
land[n].length=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
n++;
}
}
sort(land+1,land+n,cmp);
int fx,fy;double money=0;
for(int i=1;i<n;i++)
{
if(land[i].length>=10&&land[i].length<=1000)
{
fx=find_root(land[i].x);
fy=find_root(land[i].y);
if(fx!=fy)
{
money+=land[i].length*100;
root[fx]=fy;
num[fy]+=num[fx];
}
if(num[fy]>=c||num[fx]>=c)
{
break;
}
}
}
if(num[fy]>=c||num[fx]>=c)
{
printf("%.1lf\n",money);
}
else
{
printf("oh!\n");
}
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值