BZOJ 1116: [POI2008]CLO 并查集

成立时当且仅当每个联通块都有环存在。一个连通块若有m个点,则必有多于m条有向边,可用并查集来维护。

#include<cstdio>
#include<iostream>
#define R register int
#define pc(x) putchar(x)
const int N=100010;
using namespace std;
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m;
int fa[N],r[N];
bool flg;
int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
signed main() {
    n=g(),m=g(); for(R i=1;i<=n;++i) fa[i]=i;
    for(R i=1;i<=m;++i) {
        R u=getf(g()),v=getf(g());
        if(u==v) r[u]=1;
        else fa[u]=v,r[v]|=r[u];
    } for(R i=1;i<=n;++i) if(!r[getf(i)]) {flg=true; break;}
    flg?(pc('N'),pc('I'),pc('E')):(pc('T'),pc('A'),pc('K')); pc('
');
}
原文地址:https://www.cnblogs.com/Jackpei/p/10727153.html