#include <iostream>
#include <string.h>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int ne[2 * N],h[N],e[2 * N],idx = 0;
int state[N] = {0};
vector<int> path;
priority_queue<int,vector<int>,greater<int>> ans;
void add(int a,int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
bool dfs(int u,int p)
{
state[u] = 1;//正在遍历的点以及可能的后续分支的遍历 标记
path.push_back(u);//放入遍历到的这个点
for(int i = h[u] ; i != -1 ; i = ne[i])
{
int j = e[i];
if(!state[j])
{
if(dfs(j,u)) return true;
}
if(state[j] == 1 && j != p)//如果该点正在遍历 且他的后续节点并不是他的父节点(由于是无向图)那么就是找到环了
{
int flag = 0;//标记环开始的地方
for(int k = 0 ; k < path.size(); k ++)
{
if(path[k] == j)//第一次遍历到 刚刚遍历的(正在遍历 且他的后续节点并不是他的父节点)的位置
{
flag = k;//标记该点的位置
break;
}
}
for(int k = flag ; k < path.size() ; k ++)//从这个点一直输出到vector结束
{
ans.push(path[k]);//放到优先队列里面(小跟堆) 数组自然输出就是从小到大。
}
return true;
}
}
path.pop_back();
state[u] = 2;//该点以及该点的分支的遍历已经结束了 标记
return false;
}
int main()
{
int n;
cin >> n;
memset(h,-1,sizeof h);
for(int i = 0 ; i < n ; i++)
{
int temp1,temp2;
cin >> temp1 >> temp2;
add(temp1,temp2);
add(temp2,temp1);
}
dfs(1,-1);
while(!ans.empty())
{
cout << ans.top() << ' ';
ans.pop();
}
return 0;
}
DFS找环
于 2024-11-18 02:22:17 首次发布