Description
Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 你要把其中一些road变成单向边使得:每个town都有且只有一个入度
Input
第一行输入n m.1 <= n<= 100000,1 <= m <= 200000 下面M行用于描述M条边.
Output
TAK或者NIE 常做POI的同学,应该知道这两个单词的了...
Sample Input
4 5
1 2
2 3
1 3
3 4
1 4
1 2
2 3
1 3
3 4
1 4
Sample Output
TAK
上图给出了一种连接方式.
Solve
并查集,如果一个联通块有环则一定可以,否则就一定不行
上图给出了一种连接方式.
Solve
并查集,如果一个联通块有环则一定可以,否则就一定不行
#include<iostream>
#include<cstdio>
using namespace std;
int fa[100005],n,m,x,y,t1,t2;
bool flag[100005];
inline int get_fa(int x){
return (fa[x]==x)?(fa[x]):(fa[x]=get_fa(fa[x]));
}
int main (){
scanf ("%d%d",&n,&m);
for (int i=1;i<=n;++i)fa[i]=i;
for (int i=1;i<=m;++i){
scanf ("%d%d",&x,&y);
t1=get_fa(x);
t2=get_fa(y);
if (t1!=t2){
fa[t1]=t2;
flag[t2]=(flag[t1]||flag[t2]);
}
else flag[t1]=1;
}
for (int i=1;i<=n;++i)
if (!flag[get_fa(i)]){
puts("NIE");
return 0;
}
puts("TAK");
return 0;
}