P1111 修复公路 最小生成树

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10,inf = 0x3f3f3f3f;
struct node{
    int x,y,z;
};
node a[N];
int f[N];
int n,m;
bool cmp(node a,node b)
{
    return a.z < b.z; 
}
int find(int x)
{
    if(f[x] != x) f[x] = find(f[x]);
    return f[x];
}
void merge(int x,int y)
{
    f[find(y)] = find(x);
}
void kruskal()
{
    for(int i = 1; i <= n; i++) f[i] = i;
    int sum = 0,ans = 0;
    for(int i = 1; i <= m; i++)
    {
        if(find(a[i].x) != find(a[i].y))
        {
            sum++;
            ans = max(ans,a[i].z);
            merge(a[i].x,a[i].y);
            if(sum == n - 1)break;
        }
    }
    if(sum != n - 1) cout << -1;
    else cout << ans;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= m; i++) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
    sort(a + 1,a + 1 + m, cmp);
    kruskal();
    return 0;
}

 

posted @ 2025-05-21 14:48  CRt0729  阅读(12)  评论(0)    收藏  举报