首页 > 编程语言 > 详细

Kruskal算法——最小生成树

时间:2017-01-25 17:31:08      阅读:181      评论:0      收藏:0      [点我收藏+]
#include <bits/stdc++.h>
using namespace std;
int flag;
const int maxn=100000+15;
const int maxm=100000+15;
struct Edge
{
    int x,y,z;
}edge[maxm];
int n,m;
bool cmp(Edge a,Edge b)
{
    return a.z<b.z;
}
int top[maxn];
int rec[maxn];
int found(int x)
{
    if (top[x]==x) return x;
    return top[x]=found(top[x]);
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);
     } 
    sort(edge+1,edge+m+1,cmp);  //O(mlogm)
    for (int i=1;i<=n;i++) top[i]=i;
    int ans=0;
    int tot=0;
    for (int i=1;i<=m;i++)
    {
        int fx=found(edge[i].x),fy=found(edge[i].y);
        if (fx!=fy)
        {
            tot++;
            rec[i]=tot;
            ans+=edge[i].z;
            top[fx]=fy;
            if (tot==n-1) break;    
        }
    }
    cout<<ans;
    return 0;
 } 
′Kruskal算法主要分为两步:
′给所有边按照边权从小到大的顺序排序;
′从小到大依次考虑每条边(u,v)(最开始没有任何的边):
′如果u与v已经连通了,那么加入(u,v)后会出现环,不添加;
′如果u与v没有连通,那么加入(u,v)使其连通。
′然后,对于判断是否联通,我们可以通过并查集来维护。

Kruskal算法——最小生成树

原文:http://www.cnblogs.com/9pounds15pence/p/6349678.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!