思路:
要求他是一个环,那么只要找出这个环,然后删掉一条边。整张图就变成了一颗树。
codecodecode
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int MAXN = 1e2 + 10;
int n, m;
vector<int> b[MAXN];
int v[MAXN], a[MAXN][MAXN];
bool flag;
void dfs(int x, int fa) {
if(flag) return ;
v[x] = 1;
for(int y = 1; y <= n; y ++) {
if(a[x][y]) {
if((y == fa && a[x][y] >= 2) || (y != fa && v[y] == 1)) {
a[x][y] --, a[y][x] --;
flag = 1;
return ;
}
if(y == fa) continue;
dfs(y, x);
if(flag) return ;
}
}
}
void dfs1(int x, int fa) {
v[x] = 1;
for(int y = 1; y <= n; y ++) {
if(a[x][y]) {
if((y == fa && a[x][y] >= 2) || (y != fa && v[y] == 1)) {
printf("NO");
exit(0);
return ;
}
if(y == fa) continue;
dfs1(y, x);
}
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i ++) {
int x, y;
scanf("%d%d", &x, &y);
a[x][y] ++;
a[y][x] ++;
}
dfs(1, 0);
if(!flag) { printf("NO"); return 0; };
memset(v, 0, sizeof(v));
dfs1(1, 0);
for(int i = 1; i <= n; i ++) if(!v[i]) { printf("NO"); return 0; };
printf("FHTAGN!");
return 0;
}