最小生成树 $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$ 算法的主要内容,如果未能解决你的问题,请参考以下文章

最小生成树详解 prim+ kruskal代码模板

(最小生成树)Kruskal算法

最小生成树及Prim算法及Kruskal算法的代码实现

最小生成树算法:Kruskal算法 Prim算法

最小生成树

图解:如何实现最小生成树(Prim算法与Kruskal算法)