【并查集判断二分图】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;
}
posted @ 2021-11-02 09:01  Newuser233  阅读(25)  评论(0编辑  收藏  举报