关押罪犯
题目链接: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;
}

浙公网安备 33010602011771号