洛谷 1547_Out of Hay_最小生成树

发布于 2019-05-21  910 次阅读


题目描述

Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发。农场之间总共有M (1 <= M <= 10,000)条双向道路,所有道路的总长度不超过1,000,000,000。有些农场之间存在着多条道路,所有的农场之间都是连通的。 Bessie希望计算出该图中最小生成树中的最长边的长度。


思路

带并查集的最小生成树然后选择不加边而是将每一条加入的边和最小值比较

#include <stdio.h>
#include <algorithm>
#include <string>
#define INF 0x7f7f7f7f
#define maxn 1000001
#define max(x,y) x>y?x:y
using namespace std;
int ans=0;
int f[maxn];
struct arr
{
    int x,y,w;
}a[maxn];
inline int read()
{
    int x=0; char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0'; ch=getchar();}
    return x;
}
int cmp(arr a,arr b)
{
    return a.w<b.w;
}
int find(int x)
{
    if (!f[x]) return x;
    f[x]=find(f[x]);
    return f[x];
}
int insert(int x,int y)
{
    if (find(x)!=find(y))
    {
        f[find(x)]=find(y);
        return 1;
    }
    return 0;
}
int main()
{
    int n=read(),m=read();

    for (int i=1;i<=m;i++)
        a[i].x=read(),a[i].y=read(),a[i].w=read();

    sort(a+1,a+m+1,cmp);
    for (int i=1;i<=m;i++)
    {
        if (find(a[i].x)!=find(a[i].y))
        {
            ans=max(ans,a[i].w);
            insert(a[i].x,a[i].y);
        }
    }
    printf("%d\n",ans);
}