1535 深海探险
很久很久以前的一天,一位美男子来到海边,海上狂风大作。美男子希望在海中找到美人鱼,但是很不幸他只找到了章鱼怪。
然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪。由于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标。第一次射击的分析结果会反映在一张由n个点和m条边组成的无向图上。现在让我们来确定这张图是不是可以被认为是章鱼怪。
为了简单起见,我们假设章鱼怪的形状是这样,他有一个球形的身体,然后有很多触须连接在他的身上。可以表现为一张无向图,在图中可以被认为由三棵或者更多的树(代表触须)组成,这些树的根在图中处在一个环中(这个环代表球形身体)。
题目保证,在图中没有重复的边,也没有自环。
Input
单组测试数据 第一行给出两个数,n表示图中的点的个数,m表示图中边的数量。 (1≤ n≤100,0≤ m≤ n*(n-1)/2 ) 接下来m行给出边的信息, 每一行有两上数x,y (1≤ x,y≤ n,x≠y) 表示点x和点y之间有边相连。每一对点最多有一条边相连,点自身不会有边到自己。
Output
共一行,如果给定的图被认为是章鱼怪则输出"FHTAGN!"(没有引号),否则输出"NO"(没有引号)。
Input示例
6 6
6 3
6 4
5 1
2 5
1 4
5 4
Output示例
FHTAGN!
//只需要判断是不是只有一个环的连通图即可,tarjan瞎搞搞
1 # include <cstdio> 2 # include <cstring> 3 # include <cstdlib> 4 # include <iostream> 5 # include <vector> 6 # include <queue> 7 # include <stack> 8 # include <map> 9 # include <bitset> 10 # include <sstream> 11 # include <set> 12 # include <cmath> 13 # include <algorithm> 14 # pragma comment(linker,"/STACK:102400000,102400000") 15 using namespace std; 16 # define LL long long 17 # define pr pair 18 # define mkp make_pair 19 # define lowbit(x) ((x)&(-x)) 20 # define PI acos(-1.0) 21 # define INF 0x3f3f3f3f3f3f3f3f 22 # define eps 1e-8 23 # define MOD 1000000007 24 25 inline int scan() { 26 int x=0,f=1; char ch=getchar(); 27 while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();} 28 while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} 29 return x*f; 30 } 31 inline void Out(int a) { 32 if(a<0) {putchar('-'); a=-a;} 33 if(a>=10) Out(a/10); 34 putchar(a%10+'0'); 35 } 36 # define MX 105 37 /**************************/ 38 39 int n,m; 40 int ccc,cir; 41 vector<int> G[MX]; 42 int inst[MX]; 43 int vis[MX]; 44 45 void func(int x,int pre) 46 { 47 vis[x]=ccc; 48 inst[x]=1; 49 for (int i=0;i<G[x].size();i++) 50 { 51 if (G[x][i]==pre) continue; 52 53 if (!vis[G[x][i]]) 54 func(G[x][i],x); 55 else 56 { 57 if (inst[G[x][i]]) 58 cir++; 59 } 60 } 61 inst[x]=0; 62 } 63 64 int main() 65 { 66 while (scanf("%d%d",&n,&m)!=EOF) 67 { 68 for (int i=1;i<=m;i++) 69 { 70 int x,y; 71 scanf("%d%d",&x,&y); 72 G[x].push_back(y); 73 G[y].push_back(x); 74 } 75 ccc=0; 76 cir=0; 77 memset(vis,0,sizeof(vis)); 78 for (int i=1;i<=n;i++) 79 { 80 if (!vis[i]) 81 { 82 ccc++; 83 memset(inst,0,sizeof(inst)); 84 func(i,-1); 85 } 86 } 87 if (ccc==1&&cir==1) 88 printf("FHTAGN!\n"); 89 else printf("NO\n"); 90 } 91 return 0; 92 }