題意是否存在多棵樹,它們的根形成一個環,簡單來說就是求無向圖中是否存在只有一個環,而且各點連通。
方法:樹中只有一環的性質是邊數=點數,滿足這個還不能下定論,因為有可能存在多個環野滿足這樣的條件,所以接下來就dfs判連通性。
#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen ("input.txt","r",stdin)#define FF freopen ("output.txt","w",stdout)#define eps 1e-8#define N 105int g[N][N];bool vis[N];int cnt;int n;void dfs(int x) { int i,j; vis[x] = 1; cnt++; for (i = 1; i <= n; i++) { if (!vis[i] && g[x][i]) { dfs(i); } }}int main(){ int m; while(scanf("%d%d",&n,&m) != -1) { int i,j,k; int mm = m; memset(vis,0,sizeof(vis)); while (m--) { int a,b; scanf("%d%d",&a,&b); g[a][b] = g[b][a] = 1; } if (n == mm) { cnt = 0; dfs(1); if(cnt == n) puts("FHTAGN!"); else puts("NO"); } else puts("NO"); } return 0;}