/*
思路:最小生成树入门~~~~~先把点跟点的距离算出来,然后求最小生成树 即可。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
struct edge
{
int from,to;
double w;
};
struct dian
{
double x,y;
};
int n,m;
dian bb[101];
vector<edge>edges;
int map[101][101];
int top;
int pre[101];
void addedge(int x,int y,double w)
{
edge v={x,y,w};
edges.push_back(v);
}
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
int find(int x)
{
if(x==pre[x])
{
return x;
}
else
{
pre[x]=find(pre[x]);
return pre[x];
}
}
void kluska()
{ double sum=0;
top=n;
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=0;i<edges.size();i++)
{
edge v=edges[i];
int f1=find(v.from);
int f2=find(v.to);
if(f1!=f2)
{
pre[f2]=f1;
top--;
sum+=v.w;
}
if(top==1) break;
}
if(top==1) printf("%.2lf\n",sum);
else printf("-1\n");
}
int main()
{
while(scanf("%d",&n)!=EOF)
{ for(int i=1;i<=n;i++)
{
scanf("%lf %lf",&bb[i].x,&bb[i].y);
}
edges.clear();
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
double sum=sqrt((bb[j].x-bb[i].x)*(bb[j].x-bb[i].x)+(bb[j].y-bb[i].y)*(bb[j].y-bb[i].y));
addedge(i,j,sum);
}
}
sort(edges.begin(),edges.end(),cmp);
kluska();
}
}
06-03
503
10-17
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交