按照权值排序可得,就有如下顺序:

1. 1-2 1

2. 1-4 2

3. 1-5 2

4. 2-5 3

5. 2-3 4

6. 4-5 4

每次选取最小边泉,判断是否同属一个集合,如果不属于同一集合,就把它加到左端点集合中,也就是说,两个点不属于一个集合说明这条边不在树中,即可将其加入左端点集合。

下面我们模拟算法过程:

每次,直接把每次找到的边找到,就可以了!

对于Kruscal它更适合于稀疏图,借助贪心与并查集实现,我们看懂了上述算法实现过程,很容易写出算法!

代码实现

  1. #include<iostream>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<set>
  5. #include<cmath>
  6. #include<vector>
  7. #include<map>
  8. #include<stack>
  9. #include<bitset>
  10. #include<cstdio>
  11. #include<cstring>
  12. //---------------------------------Sexy operation--------------------------//
  13. #define cini(n) scanf("%d",&n)
  14. #define cinl(n) scanf("%lld",&n)
  15. #define cinc(n) scanf("%c",&n)
  16. #define cins(s) scanf("%s",s)
  17. #define coui(n) printf("%d",n)
  18. #define couc(n) printf("%c",n)
  19. #define coul(n) printf("%lld",n)
  20. #define debug(n) printf("%d_________________________________\n",n);
  21. #define speed ios_base::sync_with_stdio(0)
  22. #define file freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
  23. //-------------------------------Actual option------------------------------//
  24. #define rep(i,a,n) for(int i=a;i<=n;i++)
  25. #define per(i,n,a) for(int i=n;i>=a;i--)
  26. #define Swap(a,b) a^=b^=a^=b
  27. #define Max(a,b) (a>b?a:b)
  28. #define Min(a,b) a<b?a:b
  29. #define mem(n,x) memset(n,x,sizeof(n))
  30. #define mp(a,b) make_pair(a,b)
  31. #define pb(n) push_back(n)
  32. #define dis(a,b,c,d) ((double)sqrt((a-c)*(a-c)+(b-d)*(b-d)))
  33. //--------------------------------constant----------------------------------//
  34. #define INF 0x3f3f3f3f
  35. #define esp 1e-9
  36. #define PI acos(-1)
  37. using namespace std;
  38. typedef pair<int,int>PII;
  39. typedef pair<string,int>PSI;
  40. typedef long long ll;
  41. //___________________________Dividing Line__________________________________/
  42. int n,m;
  43. int father[1100000];
  44. struct node
  45. {
  46. int x;
  47. int y;
  48. int k;
  49. }Q[1100000];
  50. int find(int x)
  51. {
  52. if(father[x]==x)
  53. return x;
  54. return father[x]=find(father[x]);
  55. }
  56. bool cmp(node a,node b)
  57. {
  58. return a.k<b.k;
  59. }
  60. int main()
  61. {
  62. while(~scanf("%d %d",&n,&m))
  63. {
  64. int cont=0,sum=0,st=0;
  65. for(int i=0;i<m;i++)
  66. {
  67. scanf("%d %d %d",&Q[i].x,&Q[i].y,&Q[i].k);
  68. cont+=Q[i].k;
  69. }
  70. sort(Q,Q+m,cmp);
  71. for(int i=1;i<=n;i++) father[i]=i;
  72. for(int i=0;i<m;i++)
  73. {
  74. int tx=find(Q[i].x);
  75. int ty=find(Q[i].y);
  76. if(tx!=ty)
  77. {
  78. sum+=Q[i].k;
  79. st++;
  80. father[tx]=ty;
  81. if(st==n-1)
  82. break;
  83. }
  84. }
  85. printf("%d\n",sum);
  86. }
  87. return 0;
  88. }

疯子的算法总结10--最小生成树Kruscal的更多相关文章

  1. HDU 5253 最小生成树 kruscal

    Description 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老天格外的不开眼,大旱.所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行 ...

  2. [技术栈]C#利用Luhn算法(模10算法)对IMEI校验

    1.Luhn算法(模10算法) 通过查看ISO/IEC 7812-1:2017文件可以看到对于luhn算法的解释,如下图: 算法主要分为三步: 第一步:从右边第一位(最低位)开始隔位乘2: 第二步:把 ...

  3. 最小生成树——Kruscal(克鲁斯卡尔算法)

    一.核心思想 ​ 将输入的数据由小到大进行排序,再使用并查集算法(传送门)将每个点连接起来,同时求和. ​ 个人认为这个算法比较偏向暴力,有些题可能会超时. 二.例题 洛谷-P3366 题目地址:ht ...

  4. 贪心算法(2)-Kruskal最小生成树

    什么是最小生成树? 生成树是相对图来说的,一个图的生成树是一个树并把图的所有顶点连接在一起.一个图可以有许多不同的生成树.一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n ...

  5. 【UVA 10307 Killing Aliens in Borg Maze】最小生成树, kruscal, bfs

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20846 POJ 3026是同样的题,但是内存要求比较严格,并是没有 ...

  6. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

  7. 【算法导论】最小生成树之Prime法

    关于最小生成树的概念,在前一篇文章中已经讲到,就不在赘述了.下面介绍Prime算法:         其基本思想为:从一个顶点出发,选择由该顶点出发的最小权值边,并将该边的另一个顶点包含进来,然后找出 ...

  8. 【算法导论】最小生成树之Kruskal法

    在图论中,树是指无回路存在的连通图.一个连通图的生成树是指包含了所有顶点的树.如果把生成树的边的权值总和作为生成树的权,那么权值最小的生成树就称为最小生成树.因为最小生成树在实际中有很多应用,所以我们 ...

  9. POJ - 2421 Constructing Roads 【最小生成树Kruscal】

    Constructing Roads Description There are N villages, which are numbered from 1 to N, and you should ...

随机推荐

  1. go 结构开发规范

    机构规范: // 当前程序的包名 package main //导入其他的包 import "fmt" //常量的定义 const PI=3.14 //全局变量的声明和赋值 var ...

  2. SQL表的简单操作

    创建数据库表,进行增删改查是我们操作数据库的最基础的操作,很简单,熟悉的请关闭,免得让费时间. 1.创建表: sql中创建数值类型字段要根据该字段值的增长情况选择类型: tinyint 占1个字节,长 ...

  3. rancher 和 Kubernetes有什么区别?

    总体来说,Rancher和k8s都是用来作为容器的调度与编排系统.但是rancher不仅能够管理应用容器,更重要的一点是能够管理k8s集群.Rancher2.x底层基于k8s调度引擎,通过Ranche ...

  4. Flutter 吐血整理组件继承关系图

    老孟导读:前几天一个读者和我说能不能整理一个各个控件之间的继承关系,这2天抽时间整理了一下,不整理不知道,一整理真的吓一跳啊,仅仅Widget的子类(包括间接子类)就高达353个,今天发群里给大家浏览 ...

  5. synchronized 与 volatile 区别 还有 volatile 的含义

    熟悉并发的同学一定知道在java中处理并发主要有两种方式: 1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到. 2,volatile修饰符的使用,相信这个修饰符大家平时在项目 ...

  6. 【题解】P1291 百事世界杯之旅 - 期望dp

    P1291 [SHOI2002]百事世界杯之旅 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 "--在 \ ...

  7. webpack之Loader

    我们知道webpack的优点之一就是专注于处理模块化的项目,能做到开箱即用,但同时这也是webpack的缺点,只能用于模块化开发的项目,例如:Vue,React,Angular.Webpack在进行打 ...

  8. pytorch LSTM情感分类全部代码

    先运行main.py进行文本序列化,再train.py模型训练 dataset.py from torch.utils.data import DataLoader,Dataset import to ...

  9. 基于layui,Jquery 表格动态编辑 设置 编辑值为 int 或者 double 类型及默认值

    首先先推荐大家在看这篇笔记时,阅读过我写的这篇 Layui表格编辑[不依赖Layui的动态table加载] 阅读过上面那篇笔记之后呢,才能更好的理解我现在所要说的这个东西 接下来废话不多说,上代码. ...

  10. SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...