在无向图中,如何发现环
数据结构:用 vector<int> a[N] 来存储邻接点;用一个数组来计数度数
算法:
- 将度数为1的点放入队列中
- 队列不为空,取出队首的元素,将该点的所有邻接点全部减一,如果它的邻接点减一后等于一,就把邻接点放入队列中,并循环进行这一步骤
- 队列为空后,打印度数此时不为1的所有点,就是环上的点。
#include <iostream>
#include<vector>
#include<queue>
using namespace std;
int main()
{
// 请在此输入您的代码
int n;
cin >> n;
//邻接表
vector<int> next[n+1];
int g[n+1]={0}; //各个点的入度
for(int i = 0 ; i < n ; i++)
{
int u;
int v;
cin >> u;
cin >> v;
next[u].push_back(v);
next[v].push_back(u);
g[u]++;
g[v]++;
}
queue<int> q;
for(int i = 1 ; i <= n ; i++)
{
if(g[i] == 1)
{
q.push(i);
}
}
while(!q.empty())
{
int x = q.front();
q.pop();
// x 的所有邻接点全部度数减一
for(int i = 0 ; i < next[x].size() ; i++)
{
int index = next[x][i];
g[index]--;
if(g[index] == 1)
{
q.push(next[x][i]);
}
}
}
for(int i = 1 ; i <= n ; i++)
{
if(g[i] > 1)
{
cout << i << " ";
}
}
return 0;
}