CF #80 Cthulhu

来源:互联网 发布:xml json 比较 编辑:程序博客网 时间:2024/06/04 08:50

        题目意思实际上是指,对给定的一个无向图,判断它是否有一个环,并且缩点后和剩下的结点可以构成一棵树。

        用dfs即可解决,不必求双连通分量。dfs该图的时候记录环的个数loop,一个环的时候为loop=2,因为环的起点处会左右各dfs一次,从而多统计了一次环,具体看代码吧。

 

       

#include<cstdio>#include<cstring>#include<iostream>#include<utility>#include<string>#include<set>#include<vector>#include<stack>#include<algorithm>#include<queue>#include<cstdlib>#include<map>#include<cmath>using namespace std;const int M=300;const double eps=1e-6;vector<int> tree[M];bool vis[M];int loop;int n,m;void dfs(int node,int from){if(vis[node]){++loop;return ;}vis[node]=1;for(int i=0;i<tree[node].size();i++){if(loop>2) return;if(tree[node][i]!=from)dfs(tree[node][i],node);}}int main(){while(scanf("%d%d",&n,&m)==2){int a,b;loop=0;for(int i=0;i<m;i++){scanf("%d%d",&a,&b);tree[a].push_back(b);tree[b].push_back(a);vis[i+1]=false;}dfs(1,-1);if(loop==2){bool flag=true;for(int i=1;i<=n;i++)if(!vis[i]){flag=false;break;}if(flag)printf("FHTAGN!\n");elseprintf("NO\n");}else{printf("NO\n");}}return 0;}