判断一个联通图合法的依据就是枚举到x,y时有find(x)==find(y),那么就打标记就行了。
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
template<class T>inline void read(T &res){
static char ch;T flag=1;
while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48;
while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;
}
const int N = 100005,INF = 0x3f3f3f3f;
int fa[N],vis[N],flag=1,n,m;
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
read(n);read(m);
for(register int i=1;i<=n;i++)fa[i]=i;
for(register int x,y,i=1;i<=m;++i){
read(x),read(y);
if(find(x)!=find(y))vis[find(y)]=vis[find(y)]|vis[find(x)],fa[find(x)]=find(y);
else vis[find(x)]=1;
}
for(register int i=1;i<=n;i++)if(!vis[find(i)])flag=0;
if(flag)cout<<"TAK"<<endl;
else cout<<"NIE"<<endl;
return 0;
}