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

Kruskal算法

时间:2019-03-05 09:40:09      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:cstring   lin   ==   ons   code   ++   空间   key   for   

空间复杂度:O(N+E)

时间复杂度:O(ElogE)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5e3+5, maxm=2e5+5;
int f[maxn], n, m;                              //f为并查集数组 

struct Edge{ int x, y, key; }edge[maxm];

inline bool cmp(Edge a, Edge b){ return a.key < b.key; }

inline int find(int x)                          //并查集的路径压缩 
{
    if(f[x]==x) return x;
    else        return f[x]=find(f[x]);
}

//inline int find(int x) { return f[x]==x ? x : f[x]=find(f[x]); }

int kruskal()
{
    sort(edge+1, edge+m+1, cmp);                //边排序 
    for(int i=1; i<=n; i++) f[i] = i;           //每个点初始化为独立集合 
    int cnt=0, ans=0;                           //ans统计加入的边数,满足mst时等于n-1 
    for(int i=1; i<=m && cnt!=n-1; i++)
    {
        int x=edge[i].x, y=edge[i].y, key=edge[i].key;
        if(find(x)!=find(y))
            ans+=key, cnt++, f[find(x)] = find(y);
    }
    return cnt==n-1 ? ans : -1;
}

int main(void)
{
    scanf("%d%d", &n, &m);
    for(int i=1; i<=m; i++) scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].key);
    int ans=kruskal();
    if(ans==-1)     printf("orz\n");
    else            printf("%d\n", ans);
    return 0;
}

Kruskal算法

标签:cstring   lin   ==   ons   code   ++   空间   key   for   

原文地址:https://www.cnblogs.com/lfyzoi/p/10474539.html

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