10034 - Freckles 克鲁斯克尔最小生成树!~

简介:

/*
10034 - Freckles
克鲁斯克尔最小生成树!~ 
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

struct node{
   double x, y;
};

struct tree{
   int u, v;
   double d;
};

node nd[105];
int f[105];
tree tt[5010];

bool cmp(tree a, tree b){
   return a.d < b.d;
}

int getFather(int x){
   return x==f[x] ? x : f[x]=getFather(f[x]);
}

int Union(int a, int b){
   int fa=getFather(a), fb=getFather(b);
   if(fa!=fb){
      f[fa]=fb;
      return 1;
   }
   return 0;
} 

int main(){
   int t;
   cin>>t;
   while(t--){
      int n;
      cin>>n;
      for(int i=1; i<=n; ++i){
         cin>>nd[i].x>>nd[i].y;
         f[i]=i;
      }
      int cnt=0;
      for(int i=1; i<n; ++i)
         for(int j=i+1; j<=n; ++j){
            tt[cnt].u=i;
            tt[cnt].v=j;
            tt[cnt++].d=sqrt((nd[i].x-nd[j].x)*(nd[i].x-nd[j].x) + (nd[i].y-nd[j].y)*(nd[i].y-nd[j].y)); 
         }
      sort(tt, tt+cnt, cmp);
      double sum=0.0;
      for(int i=0; i<cnt; ++i){
         if(Union(tt[i].u, tt[i].v))
            sum+=tt[i].d;
      }
      printf("%.2lf\n", sum);
      if(t) printf("\n");
   }
}

目录
相关文章
|
6月前
|
算法
最小生成树算法:Prim算法
在图论中,最小生成树(Minimum Spanning Tree,简称MST)是一种常用的算法问题。最小生成树是指在一个加权连通图中选取边的子集,使得所有顶点都被覆盖,并且边的总权值最小。
159 0
|
4月前
|
算法 搜索推荐
Kruskal算法
Kruskal算法
|
10月前
|
算法
Prim算法和Kruskal算法到底哪个好?
Prim算法和Kruskal算法到底哪个好?
135 0
kruskal算法的实现
kruskal算法的实现
|
算法 C语言
最小生成树——Prim算法与Kruskal算法
最小生成树——Prim算法与Kruskal算法
305 0
最小生成树——Prim算法与Kruskal算法
|
算法
Kruskal算法(克鲁斯卡尔)最小生成树
Kruskal算法(克鲁斯卡尔)最小生成树
105 0
|
算法
Prim算法(普利姆)最小生成树
Prim算法(普利姆)最小生成树
90 0
|
机器学习/深度学习 算法
无向图的算法:Kruskal算法与Prim算法生成最小生成树
无向图的算法:Kruskal算法与Prim算法生成最小生成树
151 0
|
算法
Prim算法(最小生成树)
Prim算法(最小生成树)
91 0
Prim算法(最小生成树)

热门文章

最新文章