不一定要一颗树 连通块是树就行
但树根没有入度 说明至少还要有一条没出现过的边连接各连通块内的点 故一个连通块边数大于等于其点数时就满足条件
注意:1.不是非按佚合并不可
2.其实不用存边,边读入边处理即可
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; const int M=2e5+5; struct P{ int x,y; }e[M]; int f[N],flag[N]; int find(int x){ int now=x,t; while(x!=f[x])x=f[x]; while(now!=x){ t=f[now]; f[now]=x; now=t; } return x; } /*void unio(int x,int y){ int fx=find(x),fy=find(y); if(rank[fx]<rank[fy])f[fx]=fy; else{ if(rank[fx]==rank[fy]) rank[fx]++; f[fy]=fx; } }*/ int main(){ int n,m,ans=0; cin>>n>>m; for(int i=1;i<=m;i++)cin>>e[i].x>>e[i].y; for(int i=1;i<=n;i++)f[i]=i; for(int i=1;i<=m;i++){ int fx=find(e[i].x),fy=find(e[i].y); if(fx==fy)flag[fx]=1; else{ if(flag[fx])f[fy]=fx; else f[fx]=fy; } } for(int i=1;i<=n;i++) if(find(i)==i&&!flag[i])ans=1; cout<<(ans?"NIE":"TAK"); return 0; }