克鲁斯卡尔(Kruskal)算法之加权连通图的最小生成树问题

本文介绍了克鲁斯卡尔算法在解决加权连通图的最小生成树问题上的应用。首先定义了图的连通性、强连通性、连通网、生成树和最小生成树等概念,接着讲解了并查集的基本知识。克鲁斯卡尔算法采用贪心策略,按边权值从小到大选择边,通过并查集判断添加边时是否形成回路,最终构建最小生成树。文章还提到了算法的实现细节和避免回路的方法。
摘要由CSDN通过智能技术生成

1.图的几个概念

(1)连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图
(2)强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图
(3)连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数值,称为,权代表着连接两个顶点的代价,称这种连通图叫做连通网
(4)生成树:一个连通图的生成树是指一个连通子图,它含有图中全部 n 个顶点,但只有足以构成一棵树的n-1条边。一棵有n个顶点的生成树有且仅有 n-1 条边,如果生成树中再添加一条边,则必定成环
(5)最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树(Minimum Cost Spanning Tree),简称 MST

è¿éåå¾çæè¿°

2.并查集的基本介绍

需要详情,自行百度

// 初始化的模板
int[] pre = new int[n];
for(int i = 0; i < n; i++) {
   pre[i] = i;
}

// 查询的模板(含路径压缩)
int find(int x){
   if(pre[x] == x) {
	   return x;
   }
   // 递归
   return pre[x] = find(pre[x]);
}

// 合并的模板
void merge(int x, int y){
   int fx = find(x),
   int fy = find(y);
   if(fx != fy) {
       pre[fx] = fy;
   }
}

3.克鲁斯卡尔(Kruskal)算法的概述

用于求解图的最小生成树
贪心策略:每次都选择权值最小的边作为最小生成树的边

4.克鲁斯卡尔(Kruskal)算法的基本思路

(1)构造只有 n 个(图 graph 的顶点集合的大小)顶点的森林,即构造一个数组结构的并查集,初始化为各个顶点的终点为顶点自身
(2)把图 graph 中顶点连通的边按照权值从小到大进行排序
(3)按边的权值从小到大取出来,加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止
(4)此时最小生成树有 n 个顶点,n-1 条边,并且 n-1 条边不构成回路
加入边需要注意的事项
a.判断待加入的边 edge ,加入到当前子图后是否会构成回路,如果构成回路,则取出下一条权值较小的边继续判断,
b.如果不构成回路,则加入当前边 edge 到当前子图中,逐渐构成最小生成树
c.构成回路的判断标准:当前待加入的边所对应的两个顶点在当前子图中的终点是否相同
d.终点的理解:在当前子图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值