蒜头君最近做了农场看守,他每天晚上的工作就是巡视农场并且保证没有人破坏农场。从谷仓出发去巡视,并且最终回到谷仓。
蒜头君视力不太好,其他农场守卫只需要对农场的每一条连接不同场地的路走一遍就可以发现是不是有异常情况了。但是他很仔细和耐心,对农场的每一条连接不同场地的路需要走两遍,并且这两遍必须是不同的方向,因为他觉得应该不会两次都忽略农场中的异常情况。
每两块地之间一定至少有一条路连接。现在的任务就是帮他制定巡视路径。
输入格式
第一行输入两个整数 N(2 ≤ N ≤ 10000)N(2≤N≤10000) 和 M(1≤ M ≤ 50000)M(1≤M≤50000),表示农场一共有 N 块地 M 条边。
第二到 M+1行输入两个整数,表示对应的两块地之间有一条边。
输出格式
输出 2M+1个数,一个数占一行,表示蒜头君巡查路径上地的标号,1 号为谷仓,从 1 开始,以 1 结束。如果有多种答案,输出任意一种。
本题答案不唯一,符合要求的答案均正确
样例输入
4 5
1 2
1 4
2 3
2 4
3 4
样例输出
1
2
3
4
2
1
4
3
2
4
1
一开始看,想到的是设置一个vis[a][b]的数组,从头开始走,只要vis[a][b]是false就可以去访问,让数组内元素都为真便实现了全部访问两边。但是无法实现从1出发再回到1。看了老师的题解后知道了这是简单的欧拉回路。题解如下。注意cout一定要在dfs函数之后因为实际程序的访问顺序是 先把和1有关的全访问了然后返回再访问其他的,第一次运行到底返回就输出了1,然后最后一次返回输出另一个1。
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int n,m;
struct Edge{
int v;
bool vis;
Edge(){}
Edge(int v,bool vis):v(v),vis(vis){}
}edges[20020];//要记得开的大一些否则会出现答案错误。
vector<Edge>G[50010];
void euler(int u){//euler函数的主体,cout一定要放在函数最后!!
// cout<<u<<endl;
for(int i=0;i<G[u].size();i++){
Edge &e=G[u][i];
if(!e.vis){
e.vis=true;
euler(e.v);
// cout<<u<<endl;
}
}
cout<<u<<endl;
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;//读取边数;
G[u].push_back(Edge(v,false));
G[v].push_back(Edge(u,false));
}
euler(1);
return 0;
}