最小生成树MST

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;
}

posted @ 2020-03-14 11:47  牛大了的牛大  阅读(209)  评论(0编辑  收藏  举报