1.vector vt[N] 容器
2.vt[a].push_back(b);//把b放到a的容器里
vt[b].push_back(a); //把a放到b的容器里
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
vector<int> vt[N];
int vis[N],s[N],circle[N];
int num,start,step,flag;
//num 环的元素个数
//start 检验环(dfs)开始的元素
//step circle环数组下标数,元素数
//flag 当出现环时,返回1
void init_set(){
for(int i=1;i<=N;i++) s[i]=i;
}
int find_set(int x){
if(x!=s[x]) s[x]=find_set(s[x]);
return s[x];
}
void merge_set(int x,int y){
int tmp = x;
x = find_set(x);
y = find_set(y);
if(x!=y) s[y]=s[x];
else start = tmp; //x,y有共同的祖先,且xy相连.此x和y处于环中,记录一个点
//返回点start
}
void dfs(int x,int step)//step相当于数组下标1,2,3
{
//截断条件
if(flag) return;
if(x==start)//形成环了
{
if(vis[x]==1) // 被访问过 就是dfs开始的点
{
num=step-1;
flag=1;
return;
}
}
//搜索条件
circle[step]=x; //是环--放到环形数组里
for(int i=0;i<vt[x].size();i++)
{
int y=vt[x][i]; //容器x里第i个数
if(!vis[y])//如果Y没被访问过
{
vis[y]=1;
dfs(y,step+1);
vis[y]=0;
}
}
}
int main()
{
int n;
cin>>n;
init_set();
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
vt[a].push_back(b);
vt[b].push_back(a);//把b放到a的容器里 把a放到b的容器里
merge_set(a,b); //找到共同连接a,b的
}
flag=0;
dfs(start,1);
sort(circle+1,circle+1+num);
for(int i=1;i<=num;i++)
cout<<circle[i]<<" ";
return 0;
}