直接用DFS深搜,检查了好久没能发现错误,贴上来以后慢慢看。。。
/*
DFS深度优先搜索
Edge保存边 u{v,been}
cnt记录走过的街道
如果没有就return ;继续递归
*/
#include<vector>
#include<algorithm>
#include<iostream>
#include<cstdio>
#define MAXN 10001
using namespace std;
struct Edge
{
int v;
Edge(int _v=):v(_v){}
};
vector<Edge> E[MAXN];
inline void addedge(int u,int v)
{
E[u].push_back(Edge(v));
}
int n,m,k=;
int cnt = ;//记录走过的边的个数
int route[MAXN];
bool been[MAXN][MAXN];
bool f = false;
void print()
{
for(int i=;i<k;i++)
{
if(i) cout<<' ';
cout<<route[i];
}
//cout<<endl;
}
void dfs(int i)
{
if(f)
return ;
if(cnt==m)
{
f = true;
route[k++]= i;
print();
return ;
}
if(!E[i].size())
return ;
for(int j=;j<E[i].size();j++)
{
int v=E[i][j].v;
if(!been[i][v])
{
route[k++] = i;//记录路径
been[i][v]=been[v][i]=true;//标记
cnt++;//走过数量+1
dfs(v);
cnt--;
been[i][v]=been[v][i]=false;
k--;
}
}
}
int main()
{
int x,y;
cin>>n>>m;
for(int i=;i<m;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
dfs();
if(!f)
cout<<-<<endl;
return ;
}