最小生成树 $Kruskal$ 算法
Posted zlrrrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小生成树 $Kruskal$ 算法相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h> using namespace std; const int maxn = 5e5 + 10; int h[maxn], v[maxn], nx[maxn], in[maxn]; int n, m, sz; void add(int a, int b) { v[sz] = b; nx[sz] = h[a]; h[a] = sz; in[b] ++; sz ++; } void init() { for(int i = 1; i <= n; i ++) { h[i] = -1; in[i] = 0; } sz = 0; } void work() { queue<int> Q; vector<int> ans; for(int i = 1; i <= n; i ++) { if(in[i] == 0) { Q.push(i); } } while(!Q.empty()) { int tp = Q.front(); Q.pop(); ans.push_back(tp); for(int i = h[tp]; i != -1; i = nx[i]) { in[v[i]] --; if(in[v[i]] == 0) { Q.push(v[i]); } } } if(ans.size() != n) { printf("failed "); } else { for(int i = 0; i < n; i ++) { printf("%d%s", ans[i], i == n - 1 ? " " : " "); } } } int main() { while(~scanf("%d%d", &n, &m)) { init(); for(int i = 1; i <= m; i ++) { int a, b; scanf("%d%d", &a, &b); add(a, b); } work(); } return 0; }
以上是关于最小生成树 $Kruskal$ 算法的主要内容,如果未能解决你的问题,请参考以下文章