• 51nod 1212 无向图最小生成树


    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。

     
     
     

    输入

    第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)
    第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)

    输出

    输出最小生成树的所有边的权值之和。

    输入样例

    9 14
    1 2 4
    2 3 8
    3 4 7
    4 5 9
    5 6 10
    6 7 2
    7 8 1
    8 9 7
    2 8 11
    3 9 2
    7 9 6
    3 6 4
    4 6 14
    1 8 8

    输出样例

    37

    排序,并查集。
    代码:
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define MAX 50000
    using namespace std;
    struct edge {
        int u,v,w;
    }e[MAX + 5];
    struct cmp {
        bool operator ()(const edge &a,const edge &b) const {
            return a.w < b.w;
        }
    };
    int f[MAX];
    void init(int n) {
        for(int i = 1;i <= n;i ++) {
            f[i] = i;
        }
    }
    int getf(int x) {
        if(f[x] != x) f[x] = getf(f[x]);
        return f[x];
    }
    int Merge(int x,int y) {
        int xx = getf(x),yy = getf(y);
        if(xx == yy) return 0;
        f[xx] = yy;
        return 1;
    }
    int main() {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i = 0;i < m;i ++) {
            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
        }
        sort(e,e + m,cmp());
        init(n);
        int ans = 0;
        for(int i = 0;i < m;i ++) {
            if(Merge(e[i].u,e[i].v)) {
                ans += e[i].w;
            }
        }
        printf("%d",ans);
    }
  • 相关阅读:
    css 盒模型
    Dom事件类-文档对象模型
    BFC-边距重叠解决方案
    三栏布局的五种方式--左右固定,中间自适应
    为什么必须先写组件再写vue的实例
    H5跳小程序安卓机出现白屏的问题
    关于iframe标签的src属性
    子组件让父组件进行刷新vuex
    html 插件
    git 其他merge
  • 原文地址:https://www.cnblogs.com/8023spz/p/9949257.html
Copyright © 2020-2023  润新知