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");
   }
}

目录
相关文章
|
算法
Kruskal算法(克鲁斯卡尔)最小生成树
Kruskal算法(克鲁斯卡尔)最小生成树
159 0
|
算法 机器学习/深度学习
最小生成树——Kruskal算法
前面介绍了最小生成树和Prim算法,这篇博客继续记录Kruskal算法的相关内容。   算法思想:         1. 先将所有边按权值由小到大排序;         2. 从边集中选出第一条边(即权值最小的边),如果与树中现有的边不构成环,则将其加入树中;         3. 重复步骤2直至树中有n-1条边。
923 0
|
算法 C语言
最小生成树——Prim算法与Kruskal算法
最小生成树——Prim算法与Kruskal算法
400 0
最小生成树——Prim算法与Kruskal算法
|
算法 索引
最小生成树之Prim算法和Kruskal算法
一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决。 Prim算法 输入:一个加权连通图,其中顶点集合为V,边集合为E; 初始化:Vn = {x},其中x为集合V中的任一节点(起始点),Enew = {}; 重复下列操作,直到Vn = V:(在集合E中选取权值最小的边(u
1934 0
|
9月前
|
算法 C语言
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
73 0
|
存储 算法 机器学习/深度学习
【算法导论】最小生成树之Kruskal法
        在图论中,树是指无回路存在的连通图。一个连通图的生成树是指包含了所有顶点的树。如果把生成树的边的权值总和作为生成树的权,那么权值最小的生成树就称为最小生成树。
1199 0
|
算法
最小生成树算法:Prim算法
在图论中,最小生成树(Minimum Spanning Tree,简称MST)是一种常用的算法问题。最小生成树是指在一个加权连通图中选取边的子集,使得所有顶点都被覆盖,并且边的总权值最小。
351 0