P2330 [SCOI2005] 繁忙的都市 - 洛谷 (luogu.com.cn)
做几天题终于给我做到保底了。
题意误导人,什么改造的道路尽量少,要联通不就是生成树吗,就只能是 n - 1 条边。
然后这就是最小生成树板题,不会看这里。
虽然最小生成树求的是边权和最小,但贪心算法可以保证最大边权也最小。
毕竟是先排序再从小到大选,选到联通就停手。
(题解还二分,不要看到 "最小最大" / "最大最小" 就二分!有些性质可以通过贪心顺便搞的)
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 8010;
struct edge {
int x, y, c;
} a[N];
bool cmp(edge na, edge nb) {
return na.c < nb.c;
}
int fa[310];
int findfa(int x) {
if (fa[x] == x) {
return fa[x];
}
return fa[x] = findfa(fa[x]);
}
int main () {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
fa[i] = i;
}
for (int i = 1; i <= m; i ++) {
cin >> a[i].x >> a[i].y >> a[i].c;
}
sort(a + 1, a + m + 1, cmp);
int sum = 0;
for (int i = 1; i <= m; i ++) {
int tx = findfa(a[i].x), ty = findfa(a[i].y);
if (tx != ty) {
sum ++;
fa[tx] = ty;
}
if (sum == n - 1) {
cout << n - 1 << " " << a[i].c << "\n";
break;
}
}
return 0;
}