伪代码
DFS(u):
While (u存在未被删除的边e(u,v))
删除边e(u,v)
DFS(v)
End
PathSize ← PathSize + 1
Path[ PathSize ] ← u
点之间可能存在多条边,所以存边,然后标记每条边的标号,还是一个常见的存边的表示法
#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd
#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)
const int maxn = 5e3+100;
const int inf = 1 << 28;
struct Edge{
int from,to;
};
vector<Edge> es;
vector<int> G[maxn];
void addEdge(int from,int to){
es.pb((Edge){from,to});
int m = es.size()-1;
G[from].pb(m);
G[to].pb(m);
}
int n,m;
int path[maxn*maxn],top;
bool vis[maxn];
void dfs(int u) {
for(int i=0; i<G[u].size(); i++) {
int p = G[u][i];
if(vis[p])continue;
vis[p]=true;
int v = es[G[u][i]].to;
dfs(u==v?es[G[u][i]].from:v);
}
path[++top] = u;
}
int main() {
while(cin>>n>>m) {
cl(vis,0);top=0;
for(int i=0;i<maxn;i++)G[i].clear();
es.clear();
for(int i=0; i<m; i++) {
int x,y;
cin>>x>>y;
addEdge(x,y);
}
dfs(1);
for(int i=1; i<=top; i++) {
printf("%d%c",path[i],i==top?'\n':' ');
}
}
return 0;
}