题意是否存在多棵树,它们的根形成一个环,简单来说就是求无向图中是否存在只有一个环,而且各点连通。
方法:树中只有一环的性质是边数=点数,满足这个还不能下定论,因为有可能存在多个环野满足这样的条件,所以接下来就dfs判连通性。
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <time.h>
#include <cstdio>
#include <math.h>
#include <iomanip>
#include <cstdlib>
#include <limits.h>
#include <string.h>
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define LL long long
#define MIN INT_MIN
#define MAX INT_MAX
#define PI acos(-1.0)
#define FRE freopen ("input.txt","r",stdin)
#define FF freopen ("output.txt","w",stdout)
#define eps 1e-8
#define N 105
int g[N][N];
bool vis[N];
int cnt;
int n;
void dfs(int x) {
int i,j;
vis[x] = 1;
cnt++;
for (i = 1; i <= n; i++) {
if (!vis[i] && g[x][i]) {
dfs(i);
}
}
}
int main(){
int m;
while(scanf("%d%d",&n,&m) != -1) {
int i,j,k;
int mm = m;
memset(vis,0,sizeof(vis));
while (m--) {
int a,b;
scanf("%d%d",&a,&b);
g[a][b] = g[b][a] = 1;
}
if (n == mm) {
cnt = 0;
dfs(1);
if(cnt == n) puts("FHTAGN!");
else puts("NO");
}
else puts("NO");
}
return 0;
}
本文探讨了如何通过图论方法识别无向图中是否存在仅由一个环组成的结构,重点关注边数等于节点数的性质,并通过深度优先搜索验证连通性。
360

被折叠的 条评论
为什么被折叠?



