Link:http://acm.hdu.edu.cn/showproblem.php?pid=1162
Problem:
Eddy's picture
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7068 Accepted Submission(s): 3575
Problem descriptions as follows: Given you some coordinates pionts on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your duty discover the shortest length which the ink draws?
Input contains multiple test cases. Process to the end of file.
3 1.0 1.0 2.0 2.0 2.0 4.0
3.41
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m,pre[500];
double ans;
struct edge{
int u;
int v;
double w;
}e[5000];
struct node{
double x;
double y;
}point[111];
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
void init()
{
for(int i=0;i<n;i++)
pre[i]=i;
}
int fin(int root)
{
int son,tmp;
son=root;
while(root!=pre[root])
{
root=pre[root];
}
while(son!=root)
{
tmp=pre[son];
pre[son]=root;
son=tmp;
}
return root;
}
bool join(int root1,int root2)
{
int x;
int y;
x=fin(root1);
y=fin(root2);
if(x!=y)
{
pre[x]=y;
return true;
}
return false;
}
void kluscal(int n,int m)
{
sort(e+1,e+m+1,cmp);
ans=0;
for(int i=1;i<=m;i++)
{
if(join(e[i].u,e[i].v))
ans+=e[i].w;
}
}
double dis(double x1,double y1,double x2,double y2)
{
double d;
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return d;
}
int main()
{
int i,j,cnt;
while(scanf("%d",&n)==1)
{
for(i=1;i<=n;i++)
{
scanf("%lf%lf",&point[i].x,&point[i].y);
}
cnt=0;
for(i=2;i<=n;i++)
{
for(j=1;j<i;j++)
{
cnt++;
e[cnt].u=j;
e[cnt].v=i;
e[cnt].w=dis(point[i].x,point[i].y,point[j].x,point[j].y);
}
}
init();
kluscal(n,cnt);
printf("%.2lf\n",ans);
}
return 0;
}