关押罪犯

题目链接:https://www.luogu.com.cn/problem/P1525

题意:

每对罪犯间会发生Ci的事件,将所有罪犯分配到两个监狱使事件最大值最小

思路:

种类并查集:A的敌人是B,B的敌人是C,那么A,C就是朋友
扩展原始的并查集便是merge(a,b+n);merge(b,a+n);merge(b,c+n);merge(b+n,c)->(a,c,b+n),(b,a+n,c+n)

本题当a和a+n在同一个集合时是矛盾的输出此时的Ci

struct node{
	int a,b,c;
	bool operator<(const node&other)const{
		return c>other.c;
	}
};
int f[maxn];
int find(int x){
	if(f[x]!=x)f[x]=find(f[x]);
	return f[x];
}
void merge(int x,int y){
	if(find(x)!=find(y)){
		f[find(x)]=find(y);
	}
}
void solve(){
	int n,m;cin>>n>>m;
	rep(i,1,2*n)f[i]=i;
	vector<node>s;
	rep(i,1,m){
		int a,b,c;cin>>a>>b>>c;
		s.pb(node{a,b,c});
	}
	sort(s.begin(),s.end());
	for(int i=0;i<s.size();i++){
		int a=s[i].a,b=s[i].b,c=s[i].c;
		merge(a,b+n);merge(a+n,b);
		if(find(a)==find(a+n)){
			cout<<c<<endl;return;
		}
	}
	cout<<0<<endl;
}
posted @ 2025-03-30 14:48  Marinaco  阅读(19)  评论(0)    收藏  举报
//雪花飘落效果