并查集知识点回顾(最小生成树)

题目链接: https://www.luogu.org/problem/P1111

思路: 先以时间排序,然后一条一条连接,直到连接了n-1条边,即可输出最小时间,否则输出-1;n个点要使得任意一个点与另一个相连,那最少需要n-1条边!

代码

#include <bits/stdc++.h>
using namespace std;
int vis[100005];
struct node{
    int x;
    int y;
    int v;
};
int findx(int x)
{
    int r = x;
    while(r != vis[r])
        r = vis[r];
    int k = x, tmp;
    while(k != r){
        tmp = vis[k];
        vis[k] = r;
        k = tmp;
    }

    return r;
}
int marge(int a, int b){
    int x = findx(a);
    int y = findx(b);
    if(x != y){
        vis[y] = x;
        return -1;
    }
    return 0;
}
int cmp(node a, node b){
    return a.v < b.v;
}
int main()
{
    ios::sync_with_stdio(false);
    int n, m;
    while(cin >> n >> m){
        vector<node> ve;
        for(int i = 1; i <= n; i++) vis[i] = i;
        for(int i = 1; i <= m; i++){
            int a, b, c;
            cin >> a >> b >> c;
            ve.push_back(node{a, b, c});
        }
        sort(ve.begin(), ve.end(), cmp);
        for(int i = 0; i < m; i++){
            n += marge(ve[i].x, ve[i].y);
            //cout << n << endl;
            if(n == 1){
                cout << ve[i].v << endl;
                break;
            }
        }
        if(n != 1){
            cout << -1 << endl;
        }
    }
    return 0;
}

发布了27 篇原创文章 · 获赞 5 · 访问量 2491

猜你喜欢

转载自blog.csdn.net/HKer_YM/article/details/102074113