[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 }
View Code

 

posted @ 2018-12-10 22:02  ZincSabian  阅读(191)  评论(0编辑  收藏  举报