红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【CS61B】Lec25 Minimum Spanning Trees

Lec25 Minimum Spanning Trees

## 判断一个无向图是否存在环

方法1:DFS

  • 持续搜索知道发现被标记的顶点
  • 注意不要回头看刚来过的地方,防止提前结束

最坏时间复杂度\(O(V+E)\)

方法2:加权并查集

  • 对每一条边v-w,检查连通性
    • 若不连通,则合并v与w
    • 若连通,说明存在环

最坏时间复杂度\(O(V+E\alpha(V))\)

最小生成树

定义

给予一个无向图G,生成树T是G的一个子图,其中T:

  • 是连通的
  • 是无环的
  • 包括所有顶点
生成树

其中最小生成树是包含最小权值和的生成树

  • 割指的是将节点分配到两个非空集合
  • 横切边指的是跨越割的两个集合的两个顶点间连成的边
  • 切分定理:给定任意的割,横切边中权值最小的边一定属于最小生成树(假设边的权值互不相同)

生成最小生成树

朴素算法

即按照割的性质,给所有顶点随机涂色,并找到最小权重的边

  • 寻找生成树中没有横切边的一个割
  • 将最小权重的横切边加入最小生成树
  • 重复直到V-1条边

可以实现,但是效率很差

Prim

从任意一个节点开始,均初始化为无穷

  • 添加已在最小生成树里的存在节点的边中的最短边
  • 重复直到V-1条边

这中间,用到了类似于dijkstra的松弛,不同之处在于每次试图添加每条边时,Prim算法按照到目前构建的最小生成树的距离的大小访问节点

代码如下:

code1 code2

时间复杂度:

image-20250929201047333

Kruskal

该算法考虑按照每条边的权重顺序添加边到最小生成树中

  • 将每条边按照权重递增顺序考虑
  • 每次添加最短边进入最小生成树,除非会产生环
  • 重复直到v-1条边

这里也使用了割的性质:我们将已经加入最小生成树的顶点设为同一颜色,未加入的设为另一颜色,寻找最小权重的横切边加入最小生成树,同时能够组成环的两个顶点一定是在同一颜色的集合中

代码如下:

code

时间复杂度:\(O(E\log E)\)

时间复杂度