kurskal算法更适合稀疏图

kruskal算法伪代码:

  1. int kruskal(){
  2. 令最小生成树的边权之和为ans, 最小生成树的当前边数为Num_Edge;
  3. 将所有边按边权从小到大排序;
  4. for (从小到大枚举所有的边){
  5. if (当前测试边的两个端点在不同的连通块中){
  6. 将测试边加入最小生成树中;
  7. ans += 测试边的边权;
  8. 最小生成树的当前边数Num_Edge加一;
  9. 当前边数Num_Edge等于顶点数减1是结束循环;
  10. }
  11.  
  12. }
  13. return ans;
  14. }

具体实现:

  1. struct edge{
  2. int u, v; //边的两个端点编号
  3. int cost; //边权
  4. }E[MAXV];
  5.  
  6. bool cmp(edge a, edge b){
  7. return a.cost < b.cost;
  8. }
  9. int father[MAXV]; //并查集数组
  10.  
  11. //并查集查询函数
  12. int findFather(int x){
  13. int a = x;
  14. while (x != father[x]){
  15. x = father[x];
  16. }
  17.  
  18. //路径压缩
  19. while (a != father[a]){
  20. int z = a;
  21. a = father[a];
  22. father[z] = x;
  23. }
  24.  
  25. return x;
  26. }
  27.  
  28. //kruskal函数返回最小生成树的边权之和,参数n为顶点个数, m为图的边数
  29. int kruskal(int n, int m){
  30. int ans = , Num_Edge = ; //最小边权之和,当前生成树的边数
  31. //初始化并查集
  32. for (int i = ; i <= n; i++){
  33. father[i] = i;
  34. }
  35.  
  36. //对所有边排序
  37. sort(E, E + m, cmp);
  38. //遍历所有的边
  39. for (int i = ; i < m; i++){
  40. int faU = findFather(E[i].u); //查询测试边两个端点所在集合的根节点
  41. int faV = findFather(E[i].v);
  42. if (faU != faV){
  43. father[faV] = faU;
  44. ans += E[i].cost;
  45. Num_Edge++;
  46. if (Num_Edge == n - ) break; //如果已经建成了一棵树,跳出循环
  47. }
  48. }
  49. if (Num_Edge != n - ) return -; //当图不连通时,返回-1
  50. else return ans; //否则返回最小生成树的边权之和
  51. }

kruskal算法生成最小生成树的更多相关文章

  1. 利用Kruskal算法求最小生成树解决聪明的猴子问题 -- 数据结构

    题目:聪明的猴子 链接:https://ac.nowcoder.com/acm/problem/19964 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个 ...

  2. Kruskal算法:最小生成树

    //Kruskal算法按照边的权值从小到大查看一遍,如果不产生圈(重边等也算在内),就把当前这条表加入到生成树中. //如果判断是否产生圈.假设现在要把连接顶点u和顶点v的边e加入生成树中.如果加入之 ...

  3. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

  4. kruskal算法【最小生成树2】

    设G=(V,E)是无向连通带权图,V={1,2,…,n}: 设最小生成树T=(V,TE),该树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),Kruskal算法将这n个顶点看成是n个孤立的连 ...

  5. Kruskal算法构造最小生成树

    Kruskal算法来构造最小生成树,我总结了分为以下步骤: (1)建图,构造Kruskal边集,边集元素应该包括该边的起始顶点.终止顶点.权值: (2)将边集按权值从小到大的顺序进行排序: (3)从小 ...

  6. kruskal算法求最小生成树(jungle roads的kruskal解法)

    注意: 注意数组越界问题(提交出现runtimeError代表数组越界) 刚开始提交的时候,边集中边的数目和点集中点的数目用的同一个宏定义,但是宏定义是按照点的最大数定义的,所以提交的时候出现了数组越 ...

  7. 克鲁斯卡尔(Kruskal)算法求最小生成树

    /* *Kruskal算法求MST */ #include <iostream> #include <cstdio> #include <cstring> #inc ...

  8. Prim算法、Kruskal算法和最小生成树 | Minimum Spanning Tree

    graph to tree非常有趣! 距离的度量会极大地影响后续的分析,欧式距离会放大差异,相关性会缩小差异,导致某些细胞群分不开. 先直观看一下,第一个是Prim,第二个是Kruskal.但是肯定都 ...

  9. hdu 1875 畅通project再续(kruskal算法计算最小生成树)

    畅通project再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

随机推荐

  1. javascript 权威指南一

    1. JavaScript是面向web(网页)的编程语言. 2.html: 描述网页内容,css:描述网页样式,JavaScript:描述网页行为 3.JavaScript非常适合面向对象和函数式的编 ...

  2. cc.fade.fade

    用cc.fadeIn之前要先把setOpacity(0),笑哭,啊啊啊啊啊.因为这个东西卡了好久,啊啊啊

  3. 一个简易git服务器的搭建

    查看本机ssh公钥,生成公钥 查看ssh公钥方法: 1. 打开git bash窗口 2. 进入.ssh目录: cd ~/.ssh 3. 找到id_rsa.pub文件: ls 4. 查看公钥:cat i ...

  4. Ubuntu18.04安装mysql(AWS云)

    1.执行如下三条命令 sudo apt-get install mysql-server sudo apt install mysql-client sudo apt install libmysql ...

  5. jQuery---自定义动画 animate();

    自定义动画 animate(); 第一个参数:{对象},里面可以传需要动画的样式 第二个参数:speed 动画的执行时间 第三个参数:easing 动画的执行效果 第四个参数:callback 回调函 ...

  6. JDK线程池和Spring线程池的使用

    JDK线程池和Spring线程池实例,异步调用,可以直接使用 (1)JDK线程池的使用,此处采用单例的方式提供,见示例: public class ThreadPoolUtil { private s ...

  7. [CF1304E] 1-Trees and Queries - LCA

    由于可以走重边,所以任意一条路径长 + 2 仍然对应至少一条合法路径 很显然我们有 \(3\) 种基本路径 不经过 \((x,y)\) 经过 \(x \to y\) 经过 \(y \to x\) 假设 ...

  8. Qtree1 - 树链剖分

    树剖裸题?(复习练练手) // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; ],size[], ...

  9. 为什么 RMAN 控制文件自动备份的名称格式没有遵循 %F 规则

    在 Oracle 中越是简单的问题,往往越难找到答案,举个例子: 你是否留意观察过在 RMAN 进行备份的时候,自动生成的控制文件名称是否是按照 %F 规则来生成的? 关于控制文件自动备份路径格式,在 ...

  10. eureka server 单节点与多节点部署演示

    环境搭建 目录结构(ad-eureka为子模块) --ad-spring-cloud --ad-eureka --pom.xml --pom.xml 主pom.xml <?xml version ...