题意:一个无向图,要求找一条路径,走过每一条边恰好两次,且每次走的方向不同。很容易就能想到把这图转化为有向图求欧拉回路。题目保证一定能找到从1点出发回到1点的答案。
思路:首先把双向边的图建成两个单向边的图,题目给出时必定存在答案
首先思考一下:从一个欧拉回路中拖走一个小欧拉回路,结果也是一个欧拉回路
当一个点走完了,相当于一个欧拉回路已经被取出来了,可以直接输出这个点,同时,先没有出度的点,一定是先出发的点,所以,这点的顺序是要相反输出的!
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#define fi first
#define se second
#define FOR(a) for(int i=0;i<a;i++)
#define sc(a) scanf("%d",&a)
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<P, int> LP;
const ll inf = 1e17 + 10;
const int N = 1e5+5;
const ll mod = 1000000007;
const int base = 131;
struct node
{
int to,vis;
};
int n,m,k,ans,col[N],flag,de[N],f[N];
vector<node> v[N];
void dfs(int x)
{
for(int i=0;i<v[x].size();i++)
{
if(!v[x][i].vis)
{
v[x][i].vis=1;
dfs(v[x][i].to);
}
}
cout<<x<<endl;
}
int main()
{
ios::sync_with_stdio ( false );
cin.tie ( 0 );
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(node{y,0});
v[y].push_back(node{x,0});
}
dfs(1);
}