C++ 实现MST kruskal's algorithm
来源:互联网 发布:日本代购眼霜 知乎 编辑:程序博客网 时间:2024/05/21 14:44
#include<iostream>#include<vector>#include<list>#include<iomanip>#include<algorithm>using namespace std;enum{ INF = INT_MAX };struct Edge{int from;int to;int Wgt;Edge(int _from, int _to, int _Wgt = INF) :from(_from), to(_to), Wgt(_Wgt) {}bool operator <(const Edge & rhs) const {return Wgt < rhs.Wgt;}};int root(vector<int> & Fr, int vrt) {while (Fr[vrt] != -1) {vrt = Fr[vrt];}return vrt;}bool Kruskal(vector<vector<int> > & G, vector<int> & Fr) {//init forest.vector<int>(G.size(), -1).swap(Fr);//build Edge list;list<Edge> EL;for (int i = 0; i < G.size(); ++i) {for (int j = 0; j < G.size(); ++j) {if (G[i][j] != INF && G[i][j] != 0)EL.push_back(Edge(i, j, G[i][j]));}}EL.sort();//ascending order.//spanint Ecnt = 0;while (Ecnt < G.size() - 1 && !EL.empty()) {//extract edge.Edge e(EL.front());EL.pop_front();if (root(Fr, e.from) != root(Fr, e.to)) {++Ecnt;//append edge.Fr[e.to] = e.from;//merge tree.}}if (Ecnt < G.size() - 1) {cout << "Not connected graph." << endl;return false;}elsereturn true;}int main(void) {cout << "Kruskal algorithm." << endl;int n, m;while (cin >> n >> m) {vector<vector<int> > G(n, vector<int>(n, INF));for (int i = 0; i < n; ++i) G[i][i] = 0;//input edges.for (int i = 0; i < m; ++i) {int s, t;cin >> s >> t;cin >> G[s][t];}//display matrix.cout << "Adj: " << endl;for (int i = 0; i < G.size(); ++i) {for (int j = 0; j < G.size(); ++j) {cout << " " << setw(3) << G[i][j];}cout << endl;}cout << endl;vector<int> Fr;if (Kruskal(G, Fr)) {cout << "Parenthoods of the spanning tree:" << endl;for (int i = 0; i < Fr.size(); ++i) {cout << "Vertex: " << i << " Parent: " << Fr[i] << endl;}}}system("pause");return 0;}
很直观的算法,关键在于森林的构造.
输入样例:
8 32
0 1 10
1 0 10
0 3 10
3 0 10
0 5 14
5 0 14
0 7 11
7 0 11
1 2 10
2 1 10
1 4 7
4 1 7
1 6 7
6 1 7
2 3 11
3 2 11
2 5 9
5 2 9
2 7 8
7 2 8
3 4 12
4 3 12
3 6 15
6 3 15
4 5 13
5 4 13
4 7 16
7 4 16
5 6 13
6 5 13
6 7 12
7 6 12
0 0
- C++ 实现MST kruskal's algorithm
- MST(Kruskal’s Minimum Spanning Tree Algorithm)
- MST Kruskal普遍实现
- Minimum Spanning Tree (MST) -- Prim's Algorithm (c++实现)
- MST implementation with Kruskal and Boruvka algorithm
- Kruskal【MST】
- kruskal 【MST】
- Kruskal’s Minimum Spanning Tree Algorithm
- kruskal's algorithm.[克鲁斯卡尔算法]
- 最小生成树-克鲁斯卡尔算法(kruskal's algorithm)实现
- Kruskal algorithm
- 【贪心法求解最小生成树之Kruskal算法详细分析】---Greedy Algorithm for MST
- Geeks : Kruskal’s Minimum Spanning Tree Algorithm 最小生成树
- Kruskal’s Algorithm for finding Minimum Spanning Tree
- Kruskal算法实现最小生成树MST(java)
- 最小生成树(MST)的Kruskal实现
- HLGOJ 1133 MST(kruskal)
- poj 1287 MST(kruskal)
- linux下查看文件夹及文件大小
- iOS系类教程之用instruments来检验你的app
- Revolution Platform
- 4.85亿!将到账 米兰领跑巴卡追逐战再追一猛将
- windows下动态链接库的创建和使用
- C++ 实现MST kruskal's algorithm
- 6000万欧元英超热钱滋润德甲 菲尔米诺创新高
- FAT16 FAT32 文件系统
- Jboss 7配置日志
- 日乒赛-马龙爆冷止步次轮 朱雨玲陈梦率先进8强
- 感知中国·俄罗斯行”开幕式在圣彼得堡举行 刘..
- [NOIP2013]车站分级 解题报告
- jquery学习之-普通选择器
- ASP.NET项目中使用CKEditor +CKFinder 实现上传图片