016-kruskal算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
来源:互联网 发布:武汉大学网络自助服务 编辑:程序博客网 时间:2024/04/29 18:54
最小生成树:
在一给定的连通无向图G = (V, E)中,(u, v)代表连接顶点u与顶点v的边,而w(u, v)代表此边的权重,若存在T为G的子集且为无循环图,使得w(T)最小,则此T为G的最小生成树。
基本思路:
kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e步,其中e是网络中边的数目。按耗费递增的顺序来考虑这e条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。
概括如下:
1. 对G的边按权重非降序排列。
2. 一次取权重最小的边,如果把它放入T不会形成回路的话,则把它放入T中,否则将它丢弃。
判断是否形成回路用并查集。
伪代码:
算法分析:
主要耗费在边的排序,时间复杂度为O(mlogm)。
C++代码:
struct edge {int u, v, c;bool operator < (const edge &b) const {return c < b.c;}}e[mxe];int n, m;int fa[mnx];int find(int x) {if(fa[x] != x) fa[x] = find(fa[x]);return fa[x];}// kruskal 复杂度O(|E|log|E|), |E|:边数int kruskal() {sort(e + 1, e + m + 1); // 边排序for(int i = 1; i <= n; ++i) fa[i] = i; //并查集初始化int ret = 0;for(int i = 1; i <= m; ++i) {int u = e[i].u, v = e[i].v, c = e[i].c;u = find(u), v = find(v);if(u != v) { //不在同一个集合里面,则把这一条边加入成为最小生成树的一部分ret += c;fa[u] = v;}}return ret;}
0 0
- 016-kruskal算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 015-Dijkstra算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 017-Prim算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 018-Huffman树-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 013--Floyd算法-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 001-整数快速幂-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 003-生成排列-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 004-寻找多数元素-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 005-二分搜索-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 008-大整数乘法-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 009-矩阵乘法-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 012-矩阵链相乘-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 014-背包问题-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 019-dfs.bfs-图的遍历-《算法设计技巧与分析》M.H.A学习笔记
- 020-寻找图的关节点-dfs-《算法设计技巧与分析》M.H.A学习笔记
- 022-3着色问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- 023-8皇后问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- 021-回溯法与深搜的关系-《算法设计技巧与分析》M.H.A学习笔记
- 第六天打字练习
- pthread_mutex_t 和 pthread_cond_t 配合使用的简要分析
- 怎样保存sql server profiler的跟踪结果
- 239. Sliding Window Maximum
- C++函数参数中的: 值传递,地址传递,双向传递
- 016-kruskal算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- Redis一个异常的解决办法,异常描述:Could not get a resource from the pool
- 编译原理复习(1)
- Python黑客编程3网络数据监听和过滤
- 【Unity技巧】制作一个简单的NPC
- AJAX POST 到特定链接,一直提示400错误,但是单独在浏览器里面又可以打开这个链接!
- h
- java 高级特性-反射
- 安卓开发基础