问题描述
蒜头君最近做了农场看守,他每天晚上的工作就是巡视农场并且保证没有人破坏农场。从谷仓出发去巡视,并且最终回到谷仓。
蒜头君视力不太好,其他农场守卫只需要对农场的每一条连接不同场地的路走一遍就可以发现是不是有异常情况了。但是他很仔细和耐心,对农场的每一条连接不同场地的路需要走两遍,并且这两遍必须是不同的方向,因为他觉得应该不会两次都忽略农场中的异常情况。
每两块地之间一定至少有一条路连接。现在的任务就是帮他制定巡视路径。
输入格式
第一行输入两个整数 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
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=10010;
const int MAX_M=50010;
int n,m;
struct edge{
int v;
int vst;
edge(){ }
edge(int vv,int vvst)
{
v=vv;
vst=vvst;
}
}e[MAX_M];
vector<edge>ve[MAX_N];
void dfs(int x)
{
for(int i=0;i<ve[x].size();i++)
{
edge &aa=ve[x][i];
if(!aa.vst)
{
aa.vst=1;
dfs(aa.v);
}
}
cout<<x<<endl;
}
int main()
{
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
ve[u].push_back({v,0});
ve[v].push_back({u,0});
}
dfs(1);
return 0;
}
/*
4 5
1 2
1 4
2 3
2 4
3 4
*/