洛谷__P1525 [NOIP 2010 提高组] 关押罪犯(拓展并查集)
题目链接:P1525 [NOIP 2010 提高组] 关押罪犯 - 洛谷
题目大意:
将罪犯分到两个监狱,使得同一监狱内罪犯之间的最大怨气值最小,
输出这个最小值。若无冲突输出0。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<set>
#include<map>
#include<unordered_set>
#include<unordered_map>
#include<bitset>
#include<tuple>
#define inf 72340172838076673
#define int long long
#define endl '\n'
#define F first
#define S second
#define mst(a,x) memset(a,x,sizeof (a))
using namespace std;
typedef pair<int, int> pii;
const int N = 200086, mod = 998244353;
int n, m;
int f[N];
struct node {
int a, b, c;
bool operator<(const node &b) {
return c > b.c;
}
} e[N];
int find(int u) {
if (f[u] == u) return u;
return f[u] = find(f[u]);
}
void merge(int a, int b) {
a = find(a), b = find(b);
if (a != b) f[a] = b;
}
void solve() {
cin >> n >> m;
for (int i = 1; i <= 2 * n; i++) f[i] = i;
for (int i = 1; i <= m; i++) {
int a, b, c;
cin >> a >> b >> c;
e[i] = {a, b, c};
}
sort(e + 1, e + m + 1);
for (int i = 1; i <= m; i++) {
auto [a, b, c] = e[i];
merge(a, b + n);
merge(a + n, b);
if (find(a) == find(a + n) || find(b) == find(b + n)) {
cout << c << endl;
return ;
}
}
cout << 0 << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T = 1;
// cin >> T;
while (T--) solve();
return 0;
}

浙公网安备 33010602011771号