图中的环
分析:
将图中描述的图画出来就是一个基环树
基环树:(必要性)
①连通
②边数 = 点数
有了上述两个性质我们就能把题目转变为求该图是否具有连通性
连通性一般两种求法:
①并查集
②图的遍历 DFS, BFS
这里用并查集来实现:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int p[N];
int find(int x) // 并查集
{
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
int n, m;
cin >> n >> m;
if(n != m) // 如果顶点数不等于边数则不为基环树
{
puts("NO");
return 0;
}
for(int i = 1; i <= n; i ++) p[i] = i;
int cnt = n; // 结点数初始化最大
while (m -- )
{
int x, y;
cin >> x >> y;
if(find(x) != find(y))
{
cnt --;
p[find(x)] = y;
}
}
if(cnt == 1) puts("YES"); // 如果最终结点等于1则连通
else puts("NO");
}