题意:n<=1e5的图 找到path满足 每个点只经过一次 && 和endpoint(起/终)点相邻的点都包含在路径中
任意两个相邻点作为endpoint,并放入双端队列中,遍历u的相邻点,若存在v没被访问,则令v为起点 继续模拟 因为一定有解,复杂度为O(M)
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+20;
int n,m;
vector<int> e[N];
int q[N],f,r; //deque,保存起点和终点
int vis[N];
int check(int u)
{
for(int i=0;i<e[u].size();i++)
{
int v=e[u][i];
if(!vis[v])
return v;//更改v作为起点
}
return -1;
}
int main()
{
while(cin>>n>>m)
{
bool flag=true;//first
for(int i=1;i<=n;i++)
e[i].clear(),vis[i]=0;
int u,v;
f=1e5;//
r=1e5+1;
while(m--)
{
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
if(flag)
{
flag=false;
vis[u]=vis[v]=1;
q[f]=u;
q[r]=v;
}
}
while(true)
{
int u=check(q[f]);
if(u==-1)
break;
else
{
q[--f]=u;
vis[u]=1;
}
}
while(true)
{
int u=check(q[r]);
if(u==-1)
break;
else
{
q[++r]=u;
vis[u]=1;
}
}
cout<<r-f+1<<endl;
while(f<=r)
printf("%d ",q[f++]);
cout<<endl;
}
return 0;
}