鱼C论坛

 找回密码
 立即注册
查看: 891|回复: 1

[已解决]克鲁斯卡尔算法求助!

[复制链接]
发表于 2021-9-7 21:18:23 | 显示全部楼层    本楼为最佳答案   
  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. #define IOS \
  6.     ios::sync_with_stdio(false); \
  7.     cin.tie(0); \
  8.     cout.tie(0)
  9. const int N = 1e5+5,M = 2e5+5;
  10. int n,m;
  11. int p[N],path[N];

  12. int find(int a){
  13.     if (p[a] != a) p[a] = find(p[a]);
  14.     return p[a];
  15. }

  16. struct Edge{
  17.     int a,b,w;// 需要对边排序,用结构体存储
  18.     bool operator< (const Edge& W) const{
  19.         return w < W.w;// 重载小于号
  20.     }
  21. }edge[M];

  22. int kruskal(){
  23.     sort(edge + 1,edge + m + 1);// 数组从下标为1开始存边
  24.     for (int i = 1; i <= n; i ++ ) p[i] = i;// 初始化并查集
  25.    
  26.     int res = 0,cnt = 0;// res存放最小生成树的边权之和,cnt存放最小生成树的边数
  27.     for (int i = 1;i <= m;i ++){
  28.         int a = edge[i].a,b = edge[i].b,w = edge[i].w;
  29.         a = find(a),b = find(b);
  30.         if (a != b){
  31.             p[a] = b;
  32.             res += w;
  33.             cnt ++;
  34.             path[cnt] = i;
  35.         }// n个点一共n-1条边
  36.         if (cnt == n-1) break;// 处理完提前退出
  37.     }
  38.     return res;
  39. }

  40. int main(){
  41.     IOS;
  42.    
  43.     cin >> n >> m;
  44.     int u,v,w;
  45.     for (int i = 1; i <= m; i ++ ){
  46.         cin >> u >> v >> w;
  47.         edge[i] = {u,v,w};
  48.     }
  49.    
  50.     int res = kruskal();

  51.     for (int i = 1;i <= n-1;i ++){
  52.         int id = path[i];
  53.         cout << edge[id].a << ' ' << edge[id].b << ' ' << edge[id].w << '\n';
  54.     }
  55.     cout << res << '\n';
  56.     return 0;
  57. }
复制代码


自己写的,没有按照你给的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-24 03:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表