1535 深海探险

1535 深海探险

题目来源: CodeForces

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

很久很久以前的一天,一位美男子来到海边,海上狂风大作。美男子希望在海中找到美人鱼,但是很不幸他只找到了章鱼怪。

然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪。由于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标。第一次射击的分析结果会反映在一张由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!
");
89         else printf("NO
");
90     }
91     return 0;
92 }
View Code

 

原文地址:https://www.cnblogs.com/haoabcd2010/p/7502269.html