题目描述:
思路:
pre数组:
用来存放当前数字的上一个祖先数字,例:pre[i]=x;即数字i的上一个祖先数字为x;若当前数字的上一个祖先数字为自己本身,即:pre[i]=i,则该数字i为根数字
注意:
pre数组需要初始化,最初所有村庄是不相互连接的,根数字是他本身
find函数:
寻找当前数字的根数字
int find(int x) {
if (x == pre[x]) {
return x; //如果根数字和本身相等,则他本身就是根数字
}
return pre[x] = find(pre[x]); //否则就让该数字直接连接到根数字上
}
tong函数:
看所有数字是否连通,即所有村庄是否连通
int tong() {
for (int i = 1; i <= n; i++) {
if (find(1) != find(i)) { //即看他们的根数字是否相等
return 0;
}
}
return 1;
}
满分代码:
#include <iostream>
#include <algorithm>
struct in {
int x, y, t;
}a[100005];
int n, m;
int pre[100005];
bool cmp(in a, in b) {
return a.t < b.t;
}
int find(int x) {
if (x == pre[x]) {
return x; //如果根数字和本身相等,则他本身就是根数字
}
return pre[x] = find(pre[x]); //否则就让该数字直接连接到根数字上
}
int tong() {
for (int i = 1; i <= n; i++) {
if (find(1) != find(i)) {
return 0;
}
}
return 1;
}
using namespace std;
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> a[i].x >> a[i].y >> a[i].t;
}
sort(a, a + m, cmp);
for (int i = 0; i < m; i++) {
pre[i] = i;
}
for (int i = 0; i < m; i++) {
while (find(a[i].x) != find(a[i].y)) {
pre[find(a[i].x)] = find(a[i].y); //如果x,y不连通,让x的根数字和y的根数字相等
if (tong() == 1) {
printf("%d", a[i].t);
return 0;
}
}
}
printf("-1");
}