笔记——最小生成树

来源:互联网 发布:厦门软件企业协会 编辑:程序博客网 时间:2024/06/16 17:24
#include <stdio.h>
#include <algorithm>
using namespace std;


#define MAXN 50000//最大顶点数
#define MAXM 100000//最大边数




struct node
{
    int u,v,w;//无向图的两个节点u,v,和权值w
};


node G[MAXM];
int n,m;
int rt[MAXN];//节点所属


void init()//初始化节点
{
    for(int i=0;i<n;i++)
    {
        rt[i]=i;//初始节点都属于自己
    }
}


int find(int x)//查找节点所属
{
    if(x!=rt[x])
    {
        rt[x]=find(rt[x]);//将节点直接引向所属节点,不用一步步寻找,加快速度
    }
    return rt[x];
}


bool cmp(node a,node b)//按权重排序
{
    return a.w<b.w;
}


int Kruskal()//最小生成树算法
{
    int sum=0;
    for(int i=0;i<m;i++)
    {
        int a=find(G[i].u);
        int b=find(G[i].v);
        if(a!=b)//两个节点所属不一样,可以连接(一样如果连接会形成环)
        {
            rt[a]=b;//将两个节点所属相连
            sum+=G[i].w;
        }
    }


    return sum;
}


int main()
{
    while(~scanf("%d %d",&n,&m))
    {
        init();


        for(int i=0;i<m;i++)
        {
            scanf("%d %d %d",&G[i].u,&G[i].v,&G[i].w);
        }


        sort(G,G+m,cmp);


        printf("%d\n",Kruskal());
    }


    return 0;
}
原创粉丝点击