社区讨论

样例不过+WA0分,玄关求条,码风良好

P1525[NOIP 2010 提高组] 关押罪犯参与者 3已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mhjs5z65
此快照首次捕获于
2025/11/04 07:37
4 个月前
此快照最后确认于
2025/11/04 10:23
4 个月前
查看原帖
求大佬解答,蒟蒻代码:
C
#include <bits/stdc++.h>
using namespace std;
int n, m, a[100005], b[100005], c[100005], l = INT_MAX, r = -1, fa[20005];
int Find(int root) {
	if(fa[root]==root) return root;
	return fa[root] = Find(fa[root]);
}
void merge(int x, int y) {
	int fx = Find(x), fy = Find(y);
	if(fx!=fy) fa[fy] = fx;
}
bool check(int x) {
	for(int i=1; i<=n; i++) fa[i] = i;
	for(int i=1; i<=m; i++)
		if(c[i]<=x) merge(a[i], b[i]);
	int cnt = 0;
	for(int i=1; i<=n; i++)
		if(fa[i]==i) cnt ++;
	return cnt<=2;
}
int main() {
    scanf("%d %d", &n, &m);
    if(m==0) {
    	printf("0");
    	return 0;
	}
    for(int i=1; i<=m; i++) {
    	scanf("%d %d %d", &a[i], &b[i], &c[i]);
    	l = min(l, c[i]), r = max(r, c[i]);
	}
	while(l<=r) {
		int mid = l+r>>1;
		if(check(mid)) r = mid-1;
		else l = mid+1;
	}
	printf("%d", l);
    return 0;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...