CF104C-Cthulhu

题目链接:
https://codeforces.com/contest/104/problem/C

题目大意:
给定你一个图,判断它是否满足以下条件:
有且仅有一个环;

所有的点相互连通;

题目做法:

一:bfs找环+判断连通性。这种做法最简单易懂代码长

二:dfs同时进行找环和判断连通性可我不会dfs找环呀

#AC Code1:

//https://codeforces.com/problemset/submission/104/162842472
//From yh2021ZJJ
#include<queue>
#include<memory.h>
#include<vector>
#include<cstdio>
#define fi first
#define se second
using namespace std;
typedef pair<int,int> pii;
int n,m,ans;
bool vis[105];
vector<int> e[105],go,cir;
void bfs(int st){
	queue<pii> q;
	q.push({st,0});
	while(!q.empty()){
		pii t=q.front();
		q.pop();
		vis[t.fi]=1;
		for(auto i:e[t.fi]){
			if(i==t.se) continue;
			if(vis[i]){ans++;continue;}
			q.push({i,t.fi});
		} 
	}
}
void dfs(int now){
	vis[now]=1;
	for(auto i:e[now]){
		if(vis[i]) continue;
		dfs(i);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1,u,v;i<=m;i++){
		scanf("%d%d",&u,&v);
		e[v].push_back(u);
		e[u].push_back(v);
	}
	for(int i=1;i<=n;i++) if(!vis[i]) bfs(i);
	if(ans!=2) printf("NO");
	else{
		memset(vis,0,sizeof vis);
		dfs(1);
		for(int i=1;i<=n;i++) if(!vis[i]) return printf("NO"),0;
		printf("FHTAGN!");
	}
	return 0;
}

#AC Code2:

//https://codeforces.com/contest/103/submission/593036
//From dreamoon_love_AA
#include<vector>
#include<cstdio>
using namespace std;
vector<int> e[101];
bool used[101];
int cou,d[101];
void dfs(int x,int y,int last){
	d[y]=x;
	cou++;
	used[x]++;
	for(int i=0;i<e[x].size();i++){
		if(e[x][i]==last) continue;
		if(used[e[x][i]]) continue;
		dfs(e[x][i],y+1,x);
	}
}
int main(){
	int n,m,an=1,u,v;
	scanf("%d%d",&n,&m);
	if(m!=n) an=0;
	while(m--){
		scanf("%d%d",&u,&v);
		e[v].push_back(u);
		e[u].push_back(v);
	}
	if(an==0) puts("NO");
	else{
		dfs(1,0,0);
		if(cou==n) puts("FHTAGN!");
		else puts("NO");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值