最小生成树kruskal算法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33506160/article/details/52240442
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,sum,tol;
int fth[10000];
struct node
{
    int f;
    int t;
    int v;

} edge[100];
int cmp(node a,node b)
{
    return a.v<b.v;
}
int find(int x)
{
    if(fth[x]==x)
        return fth[x];
    return fth[x]=find(fth[x]);

}
int kruskal()
{
    sum=0;
    tol=0;
    for(int i=1; i<=m; i++)
    {
        int f=edge[i].f;
        int t=edge[i].t;
        if(find(f)!=find(t))
        {
            fth[find(f)]=find(t);
            sum+=edge[i].v;
            tol++;
        }
        if(tol==n-1)
            return sum;
    }
    return -1;

}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1; i<=n; i++)
        {
            fth[i]=i;
        }
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d%d",&edge[i].f,&edge[i].t,&edge[i].v);

        }
        sort(edge+1,edge+m+1,cmp);
        int ans=kruskal();
        printf("%d\n",ans);
    }
    return 0;
}

展开阅读全文

没有更多推荐了,返回首页