题目意思翻译过来后就是让你判断一个图是否联通,且恰只包含一个环。比较笨的方法是先判联通,然后找出那个环,然后再dfs判环是否唯一。但是其实在判联通后,只需再看n是否等于m即可,因为图如果联通,且点数等于边数,又无重边和自环,则图中一定有且只有一个环。
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include <iostream>
#include<algorithm>
#include <map>
#include <cmath>
#include<set>
using namespace std;
typedef long long LL;
const int maxn = 100 + 5;
const int INF = 1000000000;
vector<int> G[maxn];
int vis[maxn];
int ans;
int sum;
void dfs(int x){
vis[x] = 1;
sum++;
for(int i = 0;i < G[x].size();i++){
int to = G[x][i];
if(vis[to] == 0) dfs(to);
}
}
int main(){
int n,m;
while(cin >> n >> m){
for(int i = 0;i < n;i++) G[i].clear();
for(int i = 0;i < m;i++){
int x,y;
cin >> x >> y;
x--;y--;
G[x].push_back(y);
G[y].push_back(x);
}
ans = 1;
memset(vis,0,sizeof(vis));
sum = 0;
dfs(0);
if(sum != n) ans = 0;
if(n != m) ans = 0;
if(ans == 1) cout << "FHTAGN!\n";
else cout << "NO\n";
}
return 0;
}