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;
}
在实际编程题中,“按秩合并“并不能起到很好的优化效果