最小生成树--Kruskal
来源:互联网 发布:深度linux系统写python 编辑:程序博客网 时间:2024/05/21 06:49
Kruskal 代码模板
基本思路:
新手初学,使用优先队列,免去排序;并查集判环,过程中进行了路径压缩,以提高效率; 然后贪心建立最小生成树, min为最小权值;
算法演示: http://sjjg.js.zwu.edu.cn/SFXX/sf1/kruskal.html
另外,同为最小生成树的Prime算法和Kruskal算法的适用问题:
因为Prime算法只于顶点有关,所以它更适用于稠密图;
而Kruskal算法依据于边的权值,所以边越少它速度越快,更适合稀疏图。
#include <stdio.h>#include <queue>#define N 100using namespace std;struct Node{int start;int end;int price;friend bool operator < (const Node& a, const Node& b){return a.price > b.price;}};priority_queue<Node>q;int v, l;// v为顶点数, l为边数int father[N];int get_father(int cur){return cur == father[cur] ? cur : father[cur] = get_father(father[cur]);// 路径压缩}int join(int start, int end){int root1 = get_father(start);int root2 = get_father(end);if(root1 == root2)return 0;father[root1] = root2;return 1;}int kruskal(){int ans = 0;Node cur;while(!q.empty()){// 此处可记录边数,以优化cur = q.top();q.pop();if(join(cur.start, cur.end)){printf("%d -> %d\n", cur.start, cur.end);// 输出路径ans += cur.price;}}return ans;}int main(){int i;Node a;scanf("%d%d", &v, &l);for(i = 0; i < v; i ++){father[i] = i;}for(i = 0; i < l; i ++){scanf("%d%d%d", &a.start, &a.end, &a.price);q.push(a);}printf("\nRoad: \n");int min = kruskal();// 最小生成树printf("LowLoad: %d\n", min);printf("\nFather: \n");// 输出father数组for(i = 0; i < v; i ++)printf("%d ", father[i]);printf("\n");return 0;}
0 0
- 最小生成树Kruskal
- kruskal 最小生成树
- 最小生成树 kruskal
- kruskal 最小生成树
- 最小生成树-Kruskal
- 最小生成树kruskal
- 最小生成树---Kruskal
- Kruskal 最小生成树
- 最小生成树 Kruskal
- 最小生成树--Kruskal
- Kruskal 最小生成树
- 最小生成树-Kruskal
- 最小生成树Kruskal
- Kruskal 最小生成树
- kruskal最小生成树
- 最小生成树-Kruskal
- 最小生成树 kruskal()
- 最小生成树 - Kruskal()
- 虚函数,纯虚函数,虚基类
- 三元表的高效转置
- AsyncTask的使用
- ASE sysmon监控分析_网络IO
- XSD工具使用方法介绍
- 最小生成树--Kruskal
- 利用辗转相除法求最小公倍数,最大公约数
- 非阻塞 TCP协议下多用户的服务器
- C++头文件
- 『Linux』用SecureCRT远程登录,自动切到root账户的问题
- 【创业公司如何分配股份期权?】
- 线程与进程的区别于联系
- 详解Adorner Layer
- Work Progress