题目描述
给出 A 地区的村庄数 N,和公路数 M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)。
输入格式
第 11 行两个正整数N,M。
下面 M 行,每行 33 个正整数 x,y,t,告诉你这条公路连着 x,y 两个村庄,在时间t时能修复完成这条公路。
输出格式
如果全部公路修复完毕仍然存在两个村庄无法通车,则输出 −1−1,否则输出最早什么时候任意两个村庄能够通车。
输入输出样例
输入 #1复制
4 4 1 2 6 1 3 4 1 4 5 4 2 3
输出 #1复制
5
#include <stdio.h>
#include <stdlib.h>
#define N 1001
int lu[N], n, m;
struct note
{
int x, y, t;
};
int cmp(const void *a, const void *b)
{
return ((struct note *)a)->t - ((struct note *)b)->t;
}
void init(int n)
{
for (int i = 1; i <= n; i++)
lu[i] = i;
}
int find(int x)
{
if (lu[x] == x)
return x;
return lu[x] = find(lu[x]);
}
void unionn(int i, int j)
{
int i_lu = find(i); // 找到i的根节点
int j_lu = find(j); // 找到j的根节点
lu[i_lu] = j_lu; // 将i的根节点指向j的根节点
}
int check()
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
if (lu[i] == i)
sum++;
if (sum == 2)
return 0;
}
return 1;
}
int main()
{
scanf("%d", &n);
init(n);
scanf("%d", &m);
struct note a[100010];
for (int i = 1; i <= m; i++)
scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].t);
qsort(a + 1, m, sizeof(struct note), cmp);
for (int i = 1; i <= m; i++)
{
unionn(a[i].x, a[i].y);
if (check())
{
printf("%d\n", a[i].t);
return 0;
}
}
printf("-1\n");
return 0;
}