P1547 Out of Hay

题目描述

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

Bessie希望计算出该图中最小生成树中的最长边的长度。

输入输出格式

输入格式:

两个整数N和M。

接下来M行,每行三个用空格隔开的整数A_i, B_i和L_i,表示A_i和 B_i之间有一条道路长度为L_i。

输出格式:

一个整数,表示最小生成树中的最长边的长度。

输入输出样例

输入样例#1: 复制
3 3
1 2 23
2 3 1000
1 3 43
输出样例#1: 复制
43

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 2147483647
const ll INF = 0x3f3f3f3f3f3f3f3fll;
#define ri register int
template <class T> inline T min(T a, T b, T c)
{
    return min(min(a, b), c);
}
template <class T> inline T max(T a, T b, T c)
{
    return max(max(a, b), c);
}
template <class T> inline T min(T a, T b, T c, T d)
{
    return min(min(a, b), min(c, d));
}
template <class T> inline T max(T a, T b, T c, T d)
{
    return max(max(a, b), max(c, d));
}
#define pi acos(-1)
#define me(x, y) memset(x, y, sizeof(x));
#define For(i, a, b) for (int i = a; i <= b; i++)
#define FFor(i, a, b) for (int i = a; i >= b; i--)
#define mp make_pair
#define pb push_back
const int maxn = 100005;
#define mod 100003
const int N=500000;

// name*******************************
struct edge
{
    int from,to,dis;
} e[N];
int pre[N];
int Rank[N];
int n,m;
int ans;
// function******************************
void init(int x)
{
    pre[x]=-1;
    Rank[x]=0;
}
int find(int x)
{
    int t=x;
    while(pre[t]!=-1)t=pre[t];
    while(x!=t)
    {
        int k=pre[x];
        pre[x]=t;
        x=k;
    }
    return t;
}
void unionone(int a,int b)
{
    int t1=find(a);
    int t2=find(b);
    if(Rank[t1]>Rank[t2])
        pre[t2]=t1;
    else pre[t1]=t2;
    if(Rank[t1]==Rank[t2])
        Rank[t2]++;
}
bool cmp(edge x,edge y)
{
    return x.dis<y.dis;
}
//***************************************
int main()
{
//    freopen("test.txt", "r", stdin);
    cin>>n>>m;
    For(i,1,n)
    init(i);
    For(i,1,m)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        e[i].from=a;
        e[i].to=b;
        e[i].dis=c;
    }
    sort(e+1,e+1+m,cmp);
    int cnt=0;
    For(i,1,m)
    {
        if(find(e[i].from)!=find(e[i].to))
        {
            unionone(e[i].from,e[i].to);
            cnt++;
            ans=e[i].dis;//因为已经排了序,直接赋值就好
            if(cnt==n-1)break; //押尾
        }
    }
    cout<<ans;

    return 0;
}
原文地址:https://www.cnblogs.com/planche/p/8688992.html