ACWing 4216. 图中的环


给定一个 n">nn 个点 m">mm 条边的无向图。

点的编号从 1">11 到 n">nn。

图中不含重边和自环。

请你对给定图进行判断,如果该图是一个有且仅有一个环的连通图,则输出 YES,否则输出 NO

输入格式

第一行包含两个整数 n,m">n,mn,m。

接下来 m">mm 行,每行包含两个整数 a,b">a,ba,b,表示点 a">aa 和点 b">bb 之间存在一条无向边。

输出格式

如果该图是一个有且仅有一个环的连通图,则输出 YES,否则输出 NO

数据范围

前三个测试点满足 1n10">1n101≤n≤10。
所有测试点满足 1n100">1n1001≤n≤100,0mn(n1)2">0mn(n?1)20≤m≤n(n?1)2,1a,bn">1a,bn1≤a,b≤n。

输入样例1:

6 6
6 3
6 4
5 1
2 5
1 4
5 4

输出样例1:

YES

输入样例2:

6 5
5 6
4 6
3 1
5 1
1 2

输出样例2:

NO
 1 #include
 2 using namespace std;
 3 
 4 int main()
 5 {
 6   int n,m;
 7   cin>>n>>m;
 8   vector<int>G[105];
 9   vector<int>f(105,0);
10   int u,v;
11   for(int i=1;i<=m;i++)
12   {
13     cin>>u>>v;
14     G[u].push_back(v);
15     G[v].push_back(u);
16   }
17   function<int(int,int)>dfs=[&](int u,int fa)
18   {
19     if(f[u])return 0;
20     int cnt=1;
21     f[u]=1;
22     for(auto &v:G[u])
23     {
24       if(v!=fa)cnt+=dfs(v,u);
25     }
26     return cnt;
27   };
28   if(dfs(1,0)==n&&n==m)cout<<"YES"<<endl;
29   else cout<<"NO"<<endl;
30   
31   return 0;
32 }

相关