kurskal算法更适合稀疏图

kruskal算法伪代码:

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

具体实现:

 struct edge{
int u, v; //边的两个端点编号
int cost; //边权
}E[MAXV]; bool cmp(edge a, edge b){
return a.cost < b.cost;
}
int father[MAXV]; //并查集数组 //并查集查询函数
int findFather(int x){
int a = x;
while (x != father[x]){
x = father[x];
} //路径压缩
while (a != father[a]){
int z = a;
a = father[a];
father[z] = x;
} return x;
} //kruskal函数返回最小生成树的边权之和,参数n为顶点个数, m为图的边数
int kruskal(int n, int m){
int ans = , Num_Edge = ; //最小边权之和,当前生成树的边数
//初始化并查集
for (int i = ; i <= n; i++){
father[i] = i;
} //对所有边排序
sort(E, E + m, cmp);
//遍历所有的边
for (int i = ; i < m; i++){
int faU = findFather(E[i].u); //查询测试边两个端点所在集合的根节点
int faV = findFather(E[i].v);
if (faU != faV){
father[faV] = faU;
ans += E[i].cost;
Num_Edge++;
if (Num_Edge == n - ) break; //如果已经建成了一棵树,跳出循环
}
}
if (Num_Edge != n - ) return -; //当图不连通时,返回-1
else return ans; //否则返回最小生成树的边权之和
}

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. 跳跃【BFS】

    From 牛客网:https://ac.nowcoder.com/acm/problem/25160

  2. ActiveMQ注意事项

    1.消费者在消费数据的过程当中报错,那么就会自动重试        2.如果消费者报错,会自动重试,但是数据已经真实拿到,可能会造成重复消费,幂等性问题            思路,每一次监听到数据后 ...

  3. 2级搭建类202-Oracle 18c SI ASM 静默搭建(OEL7.7)公开

    Oracle 18c 单实例 ASM UDEV 方式在 OEL 7.7 上的安装

  4. H5_0020:判断安卓苹果平台

    var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > - ...

  5. jQuery---手风琴案例

    手风琴案例 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  6. Eclispe WEB项目 转到 IDEA 后无法部署问题

    IDEA是个强大的IDE  这个就不用多说了 Eclispe 的Web项目  转到IDEA之后,开始部署会出现大量的问题 项目从SVN下载下来的时候,大概就是这个样 第一步是先设置  项目结构  也就 ...

  7. Java 中多态的实现(下)

    Java 中多态的另一个语法实现是重写.重载是通过静态分派实现的,重写则是通过动态分派实现的. 在学习动态分派之前,需要对虚拟机的知识有一个初步的了解. 虚拟机运行时数据区 运行 Java 程序时,虚 ...

  8. Leetcode Week2 Two Sum

    Question Given an array of integers, return indices of the two numbers such that they add up to a sp ...

  9. 实用沙盒工具 —— VMware Workstation15安装教程

    一:简介 VMware Workstation(中文名"威睿工作站")是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发.测试 .部署新 ...

  10. VNote笔记本和画图

    VNote笔记本 跨平台的,以markdown标记语言记录的文本文档.从sourceforget.org开源网址下载即可. 画图集成: 1.集成graphviz http://www.graphviz ...