当前位置:   article > 正文

7-2 最小生成树-kruskal_第一行包含两个整数 n(1<=n<=1x10 4 ),m(1<=m<=2x10 6 ) 表示该图共有

第一行包含两个整数 n(1<=n<=1x10 4 ),m(1<=m<=2x10 6 ) 表示该图共有 n 个结点和

7-2 最小生成树-kruskal

//这题之诡异不在压缩路径,不在算法,只有30分的估计都少在了cin和scanf输入上。

分数 40

全屏浏览题目

切换布局

作者 任唯

单位 河北农业大学

题目给出一个无向连通图,要求求出其最小生成树的权值。

温馨提示:本题请使用kruskal最小生成树算法。

输入格式:

第一行包含两个整数 N(1<=N<=1x106),M(1<=M<=1x106) 表示该图共有 N 个结点和 M 条无向边。

接下来 M 行每行包含三个整数 Xi​,Yi​,Zi​ ,表示有一条长度为 Zi​ 的无向边连接结点 Xi​,Yi​ 。

输出格式:

输出一个整数表示最小生成树的各边的长度之和。

输入样例:

  1. 4 5
  2. 1 2 2
  3. 1 3 2
  4. 1 4 3
  5. 2 3 4
  6. 3 4 3

输出样例:

7

代码长度限制

16 KB

时间限制

500 ms

内存限制

64 MB

  1. #include<bits/stdc++.h>//转载留痕,cv的注意改一下行文
  2. define shuiyun 66666666666
  3. using namespace std;
  4. struct edge {
  5. int u, v;
  6. int value;
  7. }e[1000001];
  8. int f[1000001];
  9. int find(int x)
  10. {
  11. if (x != f[x]) return f[x] = find(f[x]);
  12. return f[x];
  13. }
  14. bool cmp(edge a, edge b)
  15. {
  16. return a.value < b.value;
  17. }
  18. int main() {
  19. int n, m, cnt = 0;
  20. scanf("%d%d", &n, &m);
  21. for (int i = 1; i <= m; i++) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].value);
  22. int num = 0, sum = 0;
  23. sort(e + 1, e + m + 1, cmp);
  24. for (int i = 1; i <= n; i++)f[i] = i;
  25. for (int i = 0; i <= m; i++)
  26. {
  27. int fu = find(e[i].u);
  28. int fv = find(e[i].v);
  29. if (fu != fv)
  30. {
  31. f[fu] = fv;
  32. sum += e[i].value;
  33. num++;
  34. if (num == n - 1)break;
  35. }
  36. }
  37. cout << sum;
  38. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/891147
推荐阅读
相关标签
  

闽ICP备14008679号