【并查集判断二分图】LUOGU1525[NOIP2010 提高组] 关押罪犯
对于一个点x,我们建立它的虚拟敌人x+n,由于敌人的敌人就是朋友,我们建边x-->y的时候,连接x和y+n,y和x+n,当x和它的虚拟敌人x+n在同一个并查集合里面的时候就说明无法进行二分图对应。
对于该题,先将边逆序排列,然后一旦不成立输出该边权值否则发现是二分图puts("0")
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int n,m;
struct node{
int a,b,c;
}z[maxn];
bool cmp(node aa,node bb) {
return aa.c > bb.c;
}
int fa[maxn];
int gf(int x) { return fa[x]==x?x:fa[x]=gf(fa[x]); }
void merge(int x,int y) {
x = gf(x); y = gf(y);
if(x!=y) fa[x] = y;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++) {
int a,b,c;
cin>>z[i].a>>z[i].b>>z[i].c;
}
for(int i=1;i<=2*n;i++) {
fa[i] = i;
}
sort(z+1,z+1+m,cmp);
for(int i=1;i<=m;i++) {
int a = z[i].a; int b = z[i].b;
int aa = z[i].a+n; int bb = z[i].b+n;
merge(a,bb);
merge(aa,b);
if(gf(a)==gf(aa)||gf(b)==gf(bb)) {
printf("%d",z[i].c);
return 0;
}
}
puts("0");
return 0;
}