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算法按照到目前构建的最小生成树的距离的大小访问节点
代码如下:
时间复杂度:
Kruskal
该算法考虑按照每条边的权重顺序添加边到最小生成树中
- 将每条边按照权重递增顺序考虑
- 每次添加最短边进入最小生成树,除非会产生环
- 重复直到v-1条边
这里也使用了割的性质:我们将已经加入最小生成树的顶点设为同一颜色,未加入的设为另一颜色,寻找最小权重的横切边加入最小生成树,同时能够组成环的两个顶点一定是在同一颜色的集合中
代码如下:
时间复杂度:\(O(E\log E)\)