修复公路

修复公路

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;
}
posted @ 2023-02-05 16:21  TFOREVERY  阅读(22)  评论(0编辑  收藏  举报