51nod 1212 无向图最小生成树

Posted 8023spz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}

 

以上是关于51nod 1212 无向图最小生成树的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1212 无向图最小生成树

51Nod 1212 无向图最小生成树

51Nod 1212无向图最小生成树

(图论)51NOD 1212 无向图最小生成树

1212 无向图最小生成树

非精写版-51nod基础训练