洛谷 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;
}