洛谷 P1111 修复公路

思路:

标准的并查集处理连通块问题,先按照修路时间排序,每次合并成功会使连通块减一,初始连通块数量就是N,当连通块数量为1时,全部连通。当路全部修完,连通块数量都达不到1的话,无法全部连通。

AcCode:

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
struct edge{
    int v1, v2, t;
};
edge e[100010];
int unionList[1010];

int find(int x){
    if(!unionList[x]) return x;
    return unionList[x] = find(unionList[x]);
}

bool mergin(int v1, int v2){
    int rt1 = find(v1), rt2 = find(v2);
    if(rt1 != rt2){
        unionList[rt2] = rt1;
        return true;
    }
    return false;
}

bool Cmp(const edge &a, const edge &b){
    return a.t < b.t;
}

int main(){
    int N, M;
    cin >> N >> M;
    for(int i = 1; i <= M; i++){
        int v1, v2, t;
        cin >> v1 >> v2 >> t;
        e[i] = {v1, v2, t};
    }
    sort(e + 1, e + M + 1, Cmp);
    for(int i = 1; i <= M; i++){
        if(mergin(e[i].v1, e[i].v2)) N--;
        if(N == 1){
            cout << e[i].t << endl;
            return 0;
        }
    }
    cout << -1 << endl;
    return 0;
}
posted @ 2025-05-27 00:34  Yuhhhhh  阅读(19)  评论(0)    收藏  举报