题目链接:
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;
}