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('\n'); }