任何一个连通块没有环就不行。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 100500 #define maxe 400500 using namespace std; int n,m,x,y,g[maxv],nume=0,dis[maxv],flag; bool vis[maxv]; struct edge { int v,nxt; }e[maxe]; void addedge(int u,int v) { e[++nume].v=v; e[nume].nxt=g[u]; g[u]=nume; } void dfs(int x,int fath) { vis[x]=true; for (int i=g[x];i;i=e[i].nxt) { int v=e[i].v; if (!vis[v]) { dis[v]=dis[x]+1; dfs(v,x); } else if ((dis[v]<dis[x]) && (v!=fath)) flag=true; } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d",&x,&y); addedge(x,y);addedge(y,x); } for (int i=1;i<=n;i++) { if (!vis[i]) { flag=false;dfs(i,-1); if (!flag) {printf("NIE\n");return 0;} } } printf("TAK\n"); return 0; }