[BZOJ1116]CLO[并查集]
看了样例突然发现= =无向边不会增加入度。
然后发现是环套环。
一个环所有点入度都为2。
最后的图无视所有无向边的话大概是这样的(将就一下
然后就可以并查集维护一下联通性...
当x , y属于一个联通块(假设是一条链),那么这条链中的每一个点都能作为根节点$root$。因为n个节点的链n-1条边只有root是入度为0的。
否则,对合并后的块(假设y所在的块并入x所在的块),对x的块打标机。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 inline ll _() { 5 ll x=0,f=1; char ch=getchar(); 6 for(;ch<'0'||ch>'9';ch=getchar()) 7 if(ch=='-')f=-f; 8 for(;ch>='0'&&ch<='9';ch=getchar()) 9 x=x*10+ch-'0'; 10 return x*f; 11 } 12 #define _ _() 13 const int N=1e5+5; 14 int f[N],vis[N]; 15 inline int find( int x ) { return f[x]==x?x:f[x]=find(f[x]); } 16 int main() { 17 int n=_,m=_; 18 for(int i=1;i<=n;i++) f[i]=i,vis[i]=0; 19 for(int i=1,x,y;i<=m;i++) { 20 x=find(_); y=find(_); 21 if(x==y) vis[x]=1; 22 else { f[y]=x; vis[x]=vis[x]|vis[y]; } 23 } 24 for(int i=1;i<=n;i++) if(!vis[find(i)]) return puts("NIE"),0; 25 puts("TAK"); 26 }