修复公路
修复公路
(https://www.luogu.com.cn/problem/P1111)
首先来解读一下题目,他说的好像有点误差 --> 我看到的第一眼理解的是任意两个村庄都有一条存在的路,看到死,样例都不对,然后换个思路去想,任意两个村庄可以互通(即可以利用其他村庄的路通过)即可(这才是答案)
那么问题就简单化了,利用快速排序,从小到大的去排修路的时间,(注意这里要将该条路上的两个村庄一起排序,所以应该用结构体快速排序)
排好后,通过并集去合并村庄(这里注意,一定要在合并的时候去检查是否所有村庄都能被合并了(也就是只有一个独立的大集合)),合并过程中去检查是否所有村庄都被合并了,如果在某次循环的时候完成所有村庄的合并,那么那次循环对应的时间就是最少时间,如果循环结束都没有输出,那么直接输出-1即可
Acode
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
struct ty{
int x,y,t;
}ve[100005];
bool cmp(ty x,ty y){
return x.t < y.t;
}
vector<int> ve1(100005);
int see(int x){
if(ve1[x] == x)return x;
ve1[x] = see(ve1[x]);
return ve1[x];
}
int main() {
int n,m; cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x,y,t; cin >> x >> y >> t;
ve[i].x = x,ve[i].y = y,ve[i].t = t;
}
sort(ve+1,ve+1+m,cmp);
for (int i = 1; i <= n; i++) {
ve1[i] = i;
}
for (int i = 1; i <= m; i++) {
ve1[see(ve[i].x)] = see(ve[i].y);
int count = 0;
for (int j = 1; j <= n; j++) {
if(ve1[j] == j)count ++;
}
if(count == 1){
cout << ve[i].t << endl;
exit(0);
}
}
cout << -1 << endl;
return 0;
}