码迷,mamicode.com
首页 > 编程语言 > 详细

最小生成树——Kruskal算法

时间:2018-02-23 19:06:34      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:define   blog   max   name   顺序   ==   div   pos   efi   

主要思想是贪心。

先将所有的边按照边权从小到大排序。

按照排好的顺序判断每一条边是否能够造成整个图中出现回路,如果不能则将该条边加入图中,并将两个顶点联通(并查集中的”并“)。

如果边的条数达到n-1,则跳出循环。此时得到的生成树便是最小生成树。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define  MAXN 100005

using namespace std;

struct edge {
    int u, v, w;
}a[MAXN];
int n, m, cnt, sum;
int f[MAXN];

int find(int x) {
    if(f[x] == x) return x;
    else return f[x] = find(f[x]);
}

bool cmp(edge x, edge y) {
    if(x.w < y.w) return 1;
    else return 0;
}

int main() {
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++) {
        f[i] = i;
    }
    for(int i=1; i<=m; i++) {
        scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
    }
    sort(a+1, a+1+m, cmp);
    for(int i=1; i<=m; i++) {
        int dx = find(a[i].u);
        int dy = find(a[i].v);
        if(dx != dy) {
            f[dy] = dx;
            cnt++;
            sum = sum+a[i].w;
        }
        if(cnt == n-1) break;
    }
    printf("%d", sum);
    return 0;
}
/*
Input:
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2

Output:
19
*/

 

最小生成树——Kruskal算法

标签:define   blog   max   name   顺序   ==   div   pos   efi   

原文地址:https://www.cnblogs.com/bljfy/p/8462600.html

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