UVa 10034 Freckles (最小生成树+kruskal)

来源:互联网 发布:二战三巨头知乎 编辑:程序博客网 时间:2024/05/29 08:35
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<climits>#include<queue>#include<map>#include<vector>#include<iostream>#include<stack>#include<string>#include<set>using namespace std;const int maxe=10000+10;const int maxn=100+10;struct Point{double x,y;Point(double x=0.0,double y=0.0):x(x),y(y){}};struct edge{int u,v;double cost;edge(int u=0,int v=0,double cost=0.0):u(u),v(v),cost(cost){}};bool cmp(const edge& e1,const edge& e2){return e1.cost<e2.cost;}edge es[maxe];int E;int p[maxn];int n;Point point[maxn];int find(int x){return p[x]==x? x:p[x]=find(p[x]);}double kruskal(){sort(es,es+E,cmp);for(int i=0;i<n;i++)p[i]=i;double res=0;for(int i=0;i<E;i++){edge e=es[i];int x=find(es[i].u);int y=find(es[i].v);if(x!=y){res+=es[i].cost;p[x]=y;}}return res;}int main(){int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%lf%lf",&point[i].x,&point[i].y);}E=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){double d=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));es[E++]=edge(i,j,d);}}printf("%.2lf\n",kruskal());if(t)printf("\n");}return 0;}

0 0