【洛谷模板题 最小生成树】kruskal算法入门

版权声明: https://blog.csdn.net/leelitian3/article/details/82254811

Kruskal算法

 最小生成树算法知识点: 算法导论第23章:最小生成树

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;

struct Edge
{
	int begin,end,length;
	bool operator < (const Edge& t)
	{
		return length < t.length;
	}
} edge[200005];

int parent[5005];
int Rank[5005];

inline int find_set(int a)	//路径压缩优化 
{
	return a == parent[a] ? a : parent[a] = find_set(parent[a]);
}

inline void union_set(int a, int b)	//按秩合并优化 
{
	int pa = find_set(a);
	int pb = find_set(b);
	
	if(Rank[pa] < Rank[pb])
		parent[pa] = pb;
	else
	{
		parent[pb] = pa;
		if(Rank[pa]==Rank[pb])
			++Rank[pa];
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int n,m;
	cin>>n>>m;
	for(int i=1; i<=n; ++i)
		parent[i] = i;

	for(int i=0; i<m; ++i)
		cin>>edge[i].begin>>edge[i].end>>edge[i].length;
	sort(edge,edge+m);

	int sum = 0, cnt = 0;
	for(int i=0; i<m && cnt<n-1; ++i)
	{
		if(find_set(edge[i].begin) != find_set(edge[i].end))
		{
			++cnt;
			sum += edge[i].length;
			union_set(edge[i].begin,edge[i].end);
		}
	}

	if(cnt == n-1) cout<<sum;
	else cout<<"orz";
	return 0;
}

在实际编程题中,“按秩合并“并不能起到很好的优化效果

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/82254811