码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1875: 畅通工程再续

时间:2017-09-16 20:26:34      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:std   amp   second   fixed   bool   back   for   clu   cond   


///@author Sycamore
///@date 9/16/2017
///@link http://acm.hdu.edu.cn/showproblem.php?pid=1875
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-7;
struct Edge
{
int from,to;
double length;
friend bool operator<(const Edge &u,const Edge &v)
{
return u.length<v.length;
}
}edge[5000];

int c,n=0,parent[100];
void AddEdges()
{
cin>>c;
vector<pair<int,int>>island(c);
for(auto &e:island)cin>>e.first>>e.second;
for(int i=0;i<c;i++)
for(int j=i+1;j<c;j++)
{
double dist=hypot(island[i].first-island[j].first,island[i].second-island[j].second);
if(dist>10-eps&&dist<1000+eps)
edge[n++]=Edge{i,j,dist};
}
}
int Find(int x)
{
return parent[x]==-1?x:parent[x]=Find(parent[x]);
}
void Union(int x,int y)
{
parent[Find(x)]=Find(y);
}
double Kruskal()
{
double price=0;
sort(edge,edge+n);
fill(parent,parent+c,-1);
int counter=0;
for(int i=0;i<n;i++)
{
int u=Find(edge[i].from),v=Find(edge[i].to);
if(u==v)continue;
else
{
counter++;
Union(u,v);
price+=edge[i].length;
}
}
if(counter<c-1)return -1;
return price*100;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
while(T--)
{
n=0;
AddEdges();
double result=Kruskal();
if(result<0)
cout<<"oh!\n";
else cout<<fixed<<setprecision(1)<<result<<\n;
}
return 0;
}

 

HDU 1875: 畅通工程再续

标签:std   amp   second   fixed   bool   back   for   clu   cond   

原文地址:http://www.cnblogs.com/zjnu/p/7532345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!