码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1212 无向图最小生成树

时间:2018-11-12 21:45:40      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:void   turn   cst   ++   nbsp   opera   clu   amp   顶点   

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 无向图最小生成树

标签:void   turn   cst   ++   nbsp   opera   clu   amp   顶点   

原文地址:https://www.cnblogs.com/8023spz/p/9949257.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!