很久很久以前的一天,一位美男子来到海边,海上狂风大作。美男子希望在海中找到美人鱼,但是很不幸他只找到了章鱼怪。
然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪。由于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标。第一次射击的分析结果会反映在一张由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!
System Message
(题目提供者)
Visual C++的运行时限为:1000 ms ,空间限制为:131072 KB
示例及语言说明请按这里
允许其他 AC 的用户查看此代码,分享代码才能查看别人的代码并有机会获得勋章
因为题中说明没有重边和自环,并且能组成章鱼怪的话该无向图中一定有且只有一个环,并且题中说明
章鱼怪的触须是有以环中某些点为根的树组成,因此可以得出结论,只要点数等于边数就能组成章鱼怪。
但是有一个坑点,就是给你的图并非是一个连通图,因此并查集或者搜索判断一发就OK了。
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long
#define inf 1000000000
#define mod 1000000007
#define maxn 208
#define lowbit(x) (x&-x)
#define eps 1e-9
vector<int>q[maxn];
bool used[maxn];
int p[maxn];
int find(int x)
{
if(p[x]==x)
return x;
return p[x]=find(p[x]);
}
int main(void)
{
bool flag=0;
int n,m,i,j,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
p[i]=i;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
int t1=find(x),t2=find(y);
if(t1!=t2)
p[t1]=t2;
}
for(i=1;i<=n;i++)
if(find(p[i])!=find(p[1]))
{
flag=1;
break;
}
if(m==n && flag==0)
printf("FHTAGN!
");
else
printf("NO
");
return 0;
}
本文摘自 :https://blog.51cto.com/u