Description
Zy皇帝面临一个严峻的问题,两个互相抵触的贸易团体,YYD工会和FSR工会,他们在同一时间请求在王国各个城市开办自己的办事处。这里有n个城市,其中有一些以双向马路相连,这两个工会要求每个城市应该做到: 1:有这个工会的办事处或 2:和另外一个符合1条件的城市有马路直接相连。(也就是每个城市必须是YYD的公会,但是又和FSR的公会的城市相连,或者是FSR的,和YYD的城市相连,或者和两个工会的城市相连)但是Zy怀疑不正当的竞争,他担心一个城市有两个工会的办事处,(就是说一个城市不能有两个工会的办事处)只将导致贸易的垄断(政治怎么学的),所以他请求他日夜栽培的你给予帮助。
n(1<=n<=200000)
m(1<=m<=500000)
Solution
容易想到一棵树的情况是一定可以的,那么我们在这棵树上加返祖边也不影响性质。即如果没有一个size为1的连通块就一定可行
Code
#include <stdio.h>
#include <string.h>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
const int N=200005;
int size[N],fa[N];
int get_father(int now) {return (!fa[now])?(now):(fa[now]=get_father(fa[now]));}
void merge(int x,int y) {
x=get_father(x); y=get_father(y);
if (x==y) return ;
fa[x]=y;
}
int main(void) {
int n,m; scanf("%d%d",&n,&m);
rep(i,1,m) {
int x,y;
scanf("%d%d",&x,&y);
merge(x,y);
}
rep(i,1,n) size[get_father(i)]++;
rep(i,1,n) if (size[i]==1) {
puts("NIE");
return 0;
}
puts("TAK");
return 0;
}