题意
https://vjudge.net/problem/CodeForces-103B
很久很久以前的一天,一位美男子来到海边,海上狂风大作。美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼怪。
然而,在世界的另一端,人们正在积极的收集怪物的行为信息,以便研制出强大的武器来对付章鱼怪。 于地震的多发,以及恶劣的天气,使得我们的卫星不能很好的定位怪物,从而不能很好的命中目标。 第一次射击的分析结果会反映在一张由n个点和m条边组成的无向图上。现在让我们来确定这张图 是不是可以被认为是章鱼怪。
为了简单起见,我们假设章鱼怪的形状是这样,他有一个球形的身体,然后有很多触须连接在他的身上。可以表现为一张无向图,在图中可以被认为由三棵或者更多的树(代表触须)组成,这些树的根在图中处在一个环中(这个环代表球形身体)。
题目保证,在图中没有重复的边,也没有自环
思路
法1:
按题意用dfs找无向图的环,若找到一个环且整个图是连通的,那么yes。
法2:
设环上有k个点,那么那些树除了根节点一共有n-k个点,而x个点的树有x-1条边,现在去掉了他们的根节点,所以有n-k条边,再加上环上有k条边,n-k+k = m。
所以可以直接判断图是否连通而且n==m。
代码
法1:
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) int n,m,in[N],vis[N],flag=0; vector<int> g[N]; void dfs(int u,int fa) { in[u]=1; for(int v:g[u]) { if(!vis[v]) { vis[v]=1; dfs(v,u); } else if(v!=fa&&in[v]) { // cout<<u<<" "<<v<<" gg"<<endl; flag++; } } in[u]=0; } int main() { std::ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=m;i++) { int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } int cnt=0; for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; dfs(i,0); cnt++; } } // cout<<cnt<<" "<<flag<<endl; if(cnt==1&&flag==1) { cout<<"FHTAGN!"<<endl; } else cout<<"NO"<<endl; return 0; }
法2:
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) int n,m,vis[N],flag=0; vector<int> g[N]; void dfs(int u) { for(int v:g[u]) { if(!vis[v]) { vis[v]=1; dfs(v); } } } int main() { std::ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=m;i++) { int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } int cnt=0; for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; dfs(i); cnt++; } } if(cnt==1&&n==m) { cout<<"FHTAGN!"<<endl; } else cout<<"NO"<<endl; return 0; }
usingnamespacestd; constint N=200005; constint mod=1e9+7; constdouble eps=1e-8; constdouble PI = acos(-1.0); int n,m,in[N],vis[N],flag=0; vector<int> g[N]; void dfs(int u,int fa) { in[u]=1; for(int v:g[u]) { if(!vis[v]) { vis[v]=1; dfs(v,u); } elseif(v!=fa&&in[v]) { // cout<<u<<" "<<v<<" gg"<<endl; flag++; } } in[u]=0; } int main() { std::ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=m;i++) { int u,v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } int cnt=0; for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; dfs(i,0); cnt++; } } // cout<<cnt<<" "<<flag<<endl;if(cnt==1&&flag==1) { cout<<"FHTAGN!"<<endl; } elsecout<<"NO"<<endl; return0; }