当前位置:首页 > IT技术 > 移动平台 > 正文

51nod 1535 深海探险(并查集判联通块)
2021-09-05 09:05:52

题目来源:  CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40  难度:4级算法题
51nod  1535 深海探险(并查集判联通块)_#define_02 收藏
51nod  1535 深海探险(并查集判联通块)_#define_03 关注

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

 

然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪。由于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标。第一次射击的分析结果会反映在一张由n个点和m条边组成的无向图上。现在让我们来确定这张图是不是可以被认为是章鱼怪。

 

为了简单起见,我们假设章鱼怪的形状是这样,他有一个球形的身体,然后有很多触须连接在他的身上。可以表现为一张无向图,在图中可以被认为由三棵或者更多的树(代表触须)组成,这些树的根在图中处在一个环中(这个环代表球形身体)。

 

题目保证,在图中没有重复的边,也没有自环。

51nod  1535 深海探险(并查集判联通块)_#include_04
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!
51nod  1535 深海探险(并查集判联通块)_#define_05
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

开通会员,享受整站包年服务立即开通 >