2 条题解

  • 0
    @ 2024-11-11 23:50:57

    方法二:

    //方法2:
    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1e4;
    struct Edge {
        int u, v, w;
    };
    Edge b[MAXN];
    int pa[MAXN], size[MAXN];
    int n, m, total, sum;
    
    void init() {
        for (int i = 0; i < n; i++) {
            pa[i] = i;
            size[i] = 1;
        }
    }
    
    //查找x的树根
    int find(int x) {
        if (pa[x] != x) pa[x] = find(pa[x]);
        return pa[x];
    }
    
    //合并两个集合/两棵树
    void join(int x, int y) {
        int px = find(x), py = find(y);
        if (px == py) return;
        if (size[px] < size[py]) swap(px, py);
        pa[py] = px;  //小的树py接到大树px上
        size[px] += size[py];
    }
    
    bool cmp(Edge x, Edge y) { return x.w < y.w; }
    void kruskal() {
        int cnt = 0;
        for (int i = 0; i < m; i++) {
            int u = b[i].u, v = b[i].v, w = b[i].w;
            if (find(u) != find(v)) {
                join(u, v);
                cnt++;
                sum += w;
                if (cnt == n - 1) break;
            }
        }
    }
    int main() {
        cin >> n >> m;
        for (int i = 0; i < m; i++) {
            cin >> b[i].u >> b[i].v >> b[i].w;
            total += b[i].w;
        }
        init();
        sort(b, b + m, cmp);
        kruskal();
        cout << total - sum << endl;
        return 0;
    }
    
    
    • 0
      @ 2024-11-11 23:50:36

      方法一:

      //方法1:
      #include <bits/stdc++.h>
      using namespace std;
      const int N = 101, M = 1e4 + 5;
      int n, k;
      int pa[N], size1[N];
      
      struct Edge {
          int i, j, m;
      } a[M];
      
      bool cmp(Edge e1, Edge e2) {
          return e1.m < e2.m;
      }
      
      void init() {
          for(int i=0; i<n; i++) {
              pa[i] = i;
              size1[i] = 1;
          }
      }
      
      int find(int x) {
          if(pa[x] != x) pa[x] = find(pa[x]);
          return pa[x];
      }
      
      void join(int x, int y) {
          int px = find(x), py = find(y);
          if(px == py) return;
          if(size1[px] < size1[py]) swap(px, py);
          pa[py] = px;
          size1[px] += size1[py];
      }
      
      int main(){
          cin>>n>>k;
          init();
          for(int i=0; i<k; i++) {
              cin>>a[i].i>>a[i].j>>a[i].m;
          }
          sort(a, a+k, cmp);
          
          int sum = 0;
          for(int i=0; i<k; i++) {
              int px = find(a[i].i), py = find(a[i].j);
              if(px != py) join(px, py);
              else sum += a[i].m;
          }
          cout<<sum;
          return 0;
      }
      
      
      
      • 1

      信息

      ID
      869
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者