最小生成树MST

若如初见. 提交于 2020-03-14 12:45:04

Description

生成树:一个有n个结点的连通图的生成树是原图的极小连通子图,包含原图中的所有n个结点,并且有保持图连通的最少的边。

最小生成树:生成树中权值最小的一种方案。

给定一个无向图,请输出最小生成熟的权值。

存在重边

Input

第一行包含三个整数N、M,分别表示点的个数、边的个数;

接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条边的两个点和长度。

Output

输出最小生成熟的权值,如果答案不存在,请输出-1。

Sample Input

4 6
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4

Sample Output
5

Hint
对于100%的数据:N<=1000,M<=400000
Source
#include <bits/stdc++.h>
using namespace std;
int n,m;
struct point
{
    int a,b,val;
};
point p[400001];
int f[1001];
bool cmp(point x,point y)
{
    return x.val<y.val;
}
int find(int x)
{
    if(x==f[x]) return x;
    f[x]=find(f[x]);
    return f[x];
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].val);  
    }
    sort(p+1,p+1+m,cmp);
    for(int i=0;i<=n;i++)
    f[i]=i;
    int ans=0,cnt=0;
    for(int i=1;i<=m;i++)
    {
        int fa=find(p[i].a);
        int fb=find(p[i].b);
        if(fa!=fb)
        {
            ans+=p[i].val;
            f[fa]=fb;
            cnt++;
        }
    }
    if(cnt=n-1)
    cout<<ans<<endl;
    else cout<<-1<<endl;
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!