C++ 实现MST kruskal's algorithm

#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.

	//span
	int 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;
	}
	else
		return 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

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ 实现MST kruskal's algorithm

时间: 2024-10-28 20:33:21

C++ 实现MST kruskal's algorithm的相关文章

uva 3592 (MST, kruskal)

题意:平面上有若干个点,求最小生成树.有最多8个套餐,每个套餐有一个价格和若干个点,一旦购买套餐内的点就会相互连通. 思路:由于套餐不是很多,所以枚举一下即可,然后最小生成树就行了. 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-

poj——2031 最小生成树(MST) Kruskal算法

poj——2031 最小生成树(MST)  Kruskal算法 Building a Space Station Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4985   Accepted: 2503 Description You are a member of the space station engineering team, and are assigned a task in the constructio

POJ 1679 The Unique MST (Kruskal 判最小生成树是否唯一)

The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21646 Accepted: 7661 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undirected

POJ1679 The Unique MST(Kruskal)(最小生成树的唯一性)

The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27141   Accepted: 9712 Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definition 1 (Spanning Tree): Consider a connected, undire

最小生成树 (Minimum Spanning Tree,MST) ---Kruskal算法

引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考虑这样一个问题,如何在最省经费的前提下建立这个通信网. 基于问题所建立的定义: 可以用联通网来表示N个城市以及N个城市之间可能设置的连通线路,其中网的顶点表示城市,边表示两城市之间的线路,赋予边的权值表示相应的代价.对于N个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网.现在,要选择这样一颗生成树,也就是使总的耗费最少,这个问题就是构造连通网的的最小代价生成树的问题,即最小生

贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal&amp;#39;s algorithm)

克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikipedia上的那个.很清晰且直观. 首先第一步,我们有一张图,有若干点和边 例如以下图所看到的: 第一步我们要做的事情就是将全部的边的长度排序,用排序的结果作为我们选择边的根据.这里再次体现了贪心算法的思想.资源排序,对局部最优的资源进行选择. 排序完毕后,我们领先选择了边AD. 这样我们的图就变成了 第

The Unique MST

#include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <queue> const int INF=0x3f3f3f3f; using namespace std; const int M=110; int n,m; vector<int> v[M]; int G[M][M]; struct Node { int u,v;

BZOJ 1601: [Usaco2008 Oct]灌水( MST )

MST , kruskal 直接跑 ---------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<vector> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i <

BZOJ 1083: [SCOI2005]繁忙的都市(MST)

裸的最小生成树..直接跑就行了 ---------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<vector> #define rep(i,n) for(int i=0;i<n;i++) #define addEdge(u,v,w) MST.edges.push_back((KRUSKAL::Ed