首页 > 编程语言 > 详细

最小生成树 $Kruskal$ 算法

时间:2018-10-05 13:44:14      阅读:156      评论:0      收藏:0      [点我收藏+]
#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\n");
  } else {
    for(int i = 0; i < n; i ++) {
      printf("%d%s", ans[i], i == n - 1 ? "\n" : " ");
    }
  }
}

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$ 算法

原文:https://www.cnblogs.com/zlrrrr/p/9744391.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!