【模板】最小生成树

题目链接
最小生成树一般是利用贪心的克鲁斯卡尔算法Prim不会写,克鲁斯卡尔是一个离线算法,首先将边读入,按边值排序,再从小往大加边,若两个端点在一起了,则不加,否则加,直至加了n-1条边,若不行,则无最小生成树。
时间:500ms。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int f[5001];
struct node
{
    int x,y,z;
}al[200001];
bool cmp(node a,node b)
{
    return a.z<b.z;
}
int find(int a)
{
    if(f[a]==a)
    {
        return a;
    }
    return f[a]=find(f[a]);
}
int main()
{
    int ans,n,m,i,j,k;
    cin>>n>>m;
    for(i=1;i<=5000;i++)
    {
        f[i]=i;
    }
    for(i=1;i<=m;i++)
    {
        cin>>al[i].x>>al[i].y>>al[i].z;
    }
    sort(al+1,al+1+m,cmp);
    k=n;
    for(i=1;i<=m;i++)
    {
        if(find(al[i].x)==find(al[i].y))
        {
            continue;
        }
        f[find(al[i].x)]=find(al[i].y);
        k--;
        ans+=al[i].z;
        if(k==1)
        {
            break;
        }
    }
    cout<<ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sjzezwzy/article/details/80966653