计蒜客--农场看守(简单的欧拉回路)


蒜头君最近做了农场看守,他每天晚上的工作就是巡视农场并且保证没有人破坏农场。从谷仓出发去巡视,并且最终回到谷仓。

蒜头君视力不太好,其他农场守卫只需要对农场的每一条连接不同场地的路走一遍就可以发现是不是有异常情况了。但是他很仔细和耐心,对农场的每一条连接不同场地的路需要走两遍,并且这两遍必须是不同的方向,因为他觉得应该不会两次都忽略农场中的异常情况。

每两块地之间一定至少有一条路连接。现在的任务就是帮他制定巡视路径。

输入格式

第一行输入两个整数 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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值