思路:
如果 每个联通块 边数>=点数 就OK 用并查集搞//By SiriusRen#include#include #include using namespace std;const int N=100050;int n,m,xx,yy,sizep[N],sizee[N],f[N];int find(int x){ return x==f[x]?x:f[x]=find(f[x]);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)f[i]=i,sizep[i]=1; for(int i=1;i<=m;i++){ scanf("%d%d",&xx,&yy); int fx=find(xx),fy=find(yy); if(fx!=fy){ f[fx]=fy; sizep[fy]+=sizep[fx]; sizee[fy]+=sizee[fx]+1; } else sizee[fx]++; } for(int i=1;i<=n;i++){ int fx=find(i); if(sizep[fx]>sizee[fx]){ puts("NIE");return 0;} } puts("TAK");}