最小生成树 Kruskal算法
还有一个Prim算法,以后补上
#include <iostream> #include <algorithm> #define debug(x) cout << #x << ": " << x << endl; const int maxn = 1000001; int father[maxn];//father数组存放的是父亲结点 using namespace std; struct Edge{ int u; //左端点 int v; //右端点 int dis; //权值 }ed[maxn]; bool cmp(Edge a,Edge b){ // 结构体排序 return a.dis < b.dis; } void init(int n){ // 初始化 for(int i=1;i<=n;i++) father[i] = i; } int find_father(int x){ // 并查集核心操作 if(x == father[x]) return x; int temp = find_father(father[x]);// 路径压缩 return temp; } int Kruskal(int n,int m){ int ans = 0; // 记入最小生成树的权值 int num_Edge = 0;//边的数目 for(int i = 0; i < m; i++){ int fu = find_father(ed[i].u);//找最终父亲 int fv = find_father(ed[i].v);//找最终父亲 if(fu != fv){ father[fu] = fv;//合并 ans += ed[i].dis; num_Edge++; if(num_Edge == n-1) break; } } if (num_Edge != n-1) return -1;//退出条件 else return ans; } int main(){ int n, m; while (cin >> n >> m) { init(n); for (int i=0;i<m;i++) cin >> ed[i].u >> ed[i].v>> ed[i].dis; //输入 sort(ed, ed+m, cmp); //排序 cout << Kruskal(n, m) << endl; } return 0; }
参考自 CSDN:https://blog.csdn.net/qq_49786613/article/details/115309103