Author: lllyouo
Date: 20250425
tag: 二分答案、二分图、染色法
link: https://www.luogu.com.cn/problem/P1525问题描述
分析
略
参考代码
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 20010, M = 100010;
int h[N], e[M * 2], w[M * 2], ne[M * 2], idx;
int n, m, v[N];
void add(int a, int b, int c) {
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx++;
}
bool dfs(int x, int color, int limit) {
v[x] = color;
for (int i = h[x]; i != -1; i = ne[i]) {
if (w[i] > limit) {
int y = e[i];
if (!v[y]) {
if (!dfs(y, 3 - color, limit)) return false;
}
else if (v[y] == color) return false;
}
}
return true;
}
bool check(int mid) {
memset(v, 0, sizeof v);
for (int i = 1; i <= n; i++) {
if (!v[i]) {
if (!dfs(i, 1, mid)) return false;
}
}
return true;
}
int main() {
memset(h, -1, sizeof h);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int a, b, c; cin >> a >> b >> c;
add(a, b, c);
add(b, a, c);
}
int l = 0, r = 1e9;
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
return 0;
}