您的位置:首页 > 其它

hdu 1162

2017-11-28 17:34 204 查看
点击打开链接
//保留两位小数
//kruskal 并查集
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef pair<double,double>PII;
const int maxe=6000+5;
const int maxv=100+5;
struct Edge{
int from,to;
double weight;
};
bool operator<(const Edge&E1,const Edge&E2)
{
return E1.weight<E2.weight;
}
Edge edges[maxe];
int parent[maxv];
PII num[maxv];
int find(int x)
{
return x==parent[x]?x:parent[x]=find(parent[x]);
}
int main()
{
int v;
while(scanf("%d",&v)==1)
{
for(int i=0;i<v;i++)
{
cin>>num[i].first>>num[i].second;
}
for(int i=1;i<=v;i++)
parent[i]=i;
int ans=0;
for(int i=0;i<v-1;i++)
for(int j=i+1;j<v;j++)
{
edges[ans].from=i+1;
edges[ans].to=j+1;
edges[ans].weight=hypot(num[i].first-num[j].first,num[i].second-num[j].second);
ans++;
}
sort(edges,edges+ans);
double sum=0;
for(int i=0;i<ans;i++)
{
int p1=find(edges[i].from);
int p2=find(edges[i].to);
if(p1==p2) continue;
parent[p1]=p2;
sum+=edges[i].weight;
}
printf("%.2f\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息