实在懒得复制题干了 *传送

1.定义

*如果图G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路。
*如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路。
*具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉通路但不具有欧拉回路的图称为半欧拉图。

2. 定理及推论

无向图G存在欧拉通路的充要条件是:

1) 当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。
2) 当G是无奇度结点的连通图时,G必有欧拉回路。

有向图D存在欧拉通路的充要条件是:

推论2:
1) 当D除出、入度之差为1,-1的两个顶点之外,其余顶点的出度与入度都相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为-1的顶点作为终点。
2) 当D的所有顶点的出、入度都相等时,D中存在有向欧拉回路

求解:

A.  DFS搜索求解欧拉回路

基本思路:利用欧拉定理判断出一个图存在欧拉回路或欧拉通路后,选择一个正确的起始顶点,用DFS算法遍历所有的边(每一条边只遍历一次),遇到走不通就回退。在搜索前进方向上将遍历过的边按顺序记录下来。这组边的排列就组成了一条欧拉通路或回路。

  1. #include<cstdio>
  2. #include<stdio.h>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define MAX 2010
  6. using namespace std;
  7. int maps[MAX][MAX];
  8. int in[MAX];
  9. int t[MAX];
  10. int flag;
  11. int k;
  12. int Max,Min;
  13. int DFS(int x)
  14. {
  15. int i;
  16. for(i=Min;i<=Max;i++)
  17. {
  18. if(maps[x][i])///从任意一个与它相连的点出发
  19. {
  20. maps[x][i]--;///删去遍历完的边
  21. maps[i][x]--;
  22. DFS(i);
  23. }
  24. }
  25. t[++k]=x;///记录路径,因为是递归所有倒着记
  26. }
  27. int main()
  28. {
  29. int n,i,x,y;
  30. Max=-;
  31. Min=;
  32. flag=;
  33. scanf("%d",&n);
  34. ;i<=n;i++)
  35. {
  36. scanf("%d%d",&x,&y);
  37. maps[x][y]++;
  38. maps[y][x]++;
  39. Max=max(x,max(y,Max));
  40. Min=min(x,min(y,Min));
  41. in[x]++;
  42. in[y]++;
  43. }
  44. for(i=Min;i<=Max;i++)
  45. {
  46. )///存在奇度点,说明是欧拉通路
  47. {
  48. flag=;
  49. DFS(i);
  50. break;
  51. }
  52. }
  53. if(!flag)///全为偶度点,从标号最小的开始找
  54. {
  55. DFS(Min);
  56. }
  57. ;i--)
  58. {
  59. printf("%d\n",t[i]);
  60. }
  61. ;
  62. }

B.  Fleury(佛罗莱)算法

  1. #include <cstdlib>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. ];
  8. int top;
  9. int N,M;
  10. ][];
  11. void dfs(int x)
  12. {
  13. int i;
  14. top++;
  15. ans[top]=x;
  16. ; i<=N; i++)
  17. {
  18. )
  19. {
  20. mp[x][i]=mp[i][x]=;///删除此边
  21. dfs(i);
  22. break;
  23. }
  24. }
  25. }
  26.  
  27. void fleury(int x)
  28. {
  29. int brige,i;
  30. top=;
  31. ans[top]=x;///将起点放入Euler路径中
  32. )
  33. {
  34. brige=;
  35. ; i<=N; i++) /// 试图搜索一条边不是割边(桥)
  36. {
  37. )///存在一条可以扩展的边
  38. {
  39. brige=;
  40. break;
  41. }
  42. }
  43. if (!brige)/// 如果没有点可以扩展,输出并出栈
  44. {
  45. printf("%d ", ans[top]);
  46. top--;
  47. }
  48. else /// 否则继续搜索欧拉路径
  49. {
  50. top--;///为了回溯
  51. dfs(ans[top+]);
  52. }
  53. }
  54. }
  55.  
  56. int main()
  57. {
  58. int x,y,deg,num,start,i,j;
  59. scanf("%d%d",&N,&M);
  60. memset(mp,,sizeof (mp));
  61. ;i<=M; i++)
  62. {
  63. scanf("%d%d",&x,&y);
  64. mp[x][y]=;
  65. mp[y][x]=;
  66. }
  67. num=;
  68. start=;///这里初始化为1
  69. ; i<=N; i++)
  70. {
  71. deg=;
  72. ; j<=N; j++)
  73. {
  74. deg+=mp[i][j];
  75. }
  76. ==)///奇度顶点
  77. {
  78. start=i;
  79. num++;
  80. }
  81. }
  82. ||num==)
  83. {
  84. fleury(start);
  85. }
  86. else
  87. {
  88. puts("No Euler path");
  89. }
  90. ;
  91. }

那这道题就是一个欧拉回路的板子

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. using namespace std;
  5. ][];//记录两个点之间的路径个数
  6. ];//辅助记录奇点
  7. ];//记录路径
  8. ;
  9. ,Min=1e9;
  10. int DFS(int x)
  11. {
  12. int i;
  13. for(i=Min;i<=Max;i++)
  14. {
  15. if(map[x][i])
  16. {
  17. map[x][i]--;
  18. map[i][x]--;
  19. DFS(i);
  20. }
  21. }
  22. t[++k]=x;
  23. }
  24. int main()
  25. {
  26. scanf("%d",&n);
  27. ;i<=n;++i)
  28. {
  29. scanf("%d%d",&x,&y);
  30. map[x][y]++;
  31. map[y][x]++;
  32. du[x]++;
  33. du[y]++;
  34. Max=max(Max,max(x,y));
  35. Min=min(Min,min(x,y));
  36. }
  37. ;
  38. ;i<=Max;++i)
  39. {
  40. )
  41. {
  42. start=i;
  43. break;
  44. }
  45. }
  46. DFS(start);
  47. ;i--)
  48. {
  49. printf("%d\n",t[i]);
  50. }
  51. ;
  52. }

欧拉回路--P2731 骑马修栅栏 Riding the Fences的更多相关文章

  1. P2731 骑马修栅栏 Riding the Fences 题解(欧拉回路)

    题目链接 P2731 骑马修栅栏 Riding the Fences 解题思路 存图+简单\(DFS\). 坑点在于两种不同的输出方式. #include<stdio.h> #define ...

  2. 洛谷P2731 骑马修栅栏 Riding the Fences

    P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题 ...

  3. 洛谷 P2731 骑马修栅栏 Riding the Fences 解题报告

    P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样 ...

  4. 洛谷 P2731 骑马修栅栏 Riding the Fences

    P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样 ...

  5. P2731 骑马修栅栏 Riding the Fences

    题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶 ...

  6. luogu P2731 骑马修栅栏 Riding the Fences

    入度为奇数的点,搜他. 最好邻接矩阵... #include<cstdio> #include<iostream> #define R register int using n ...

  7. LG2731 骑马修栅栏 Riding the Fences

    题意 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点( ...

  8. 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径

    Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...

  9. USACO Section 3.3 骑马修栅栏 Riding the Fences

    题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...

随机推荐

  1. 0. GC 前置知识

    阅读<垃圾回收的算法与实现>时记录的一些笔记. 对象 在GC的世界中,对象表示的是"通过应用程序利用的数据的集合" 头 我们将对象中保存对象本身信息的部分称为头.头主要 ...

  2. 学习 Ansible Playbook,有这篇文章就够了!

    https://mp.weixin.qq.com/s?__biz=MzAwNTM5Njk3Mw==&mid=2247487361&idx=1&sn=b50327df2949e4 ...

  3. 常用keycode列表

    KEYCODE列表 电话键   KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 K ...

  4. 吴裕雄--天生自然JAVA数据库编程:JDBC操作步骤及数据库连接操作

    public class ConnectionDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gj ...

  5. vs2010编译C++ 运算符

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...

  6. vs2010编译C++ 静态成员函数的引用

    // CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using names ...

  7. Linux远程上传文件

    #对拷文件夹 (包括文件夹本身) scp -r /home/slk root@192.168.1.5:/home # 对拷文件并重命名 scp /home/a.txt root@192.168.1.5 ...

  8. Ruoyi的确不错,不知后续能否坚持 允许商用

    对于一个开源项目,作者的确很优秀: 在我们现在这个环境,能把一个开源项目做到这个规模,相当不容易:给作者点赞: 不过我也心里嘀咕,不知道后面哪天这个哥们突然发声明,不允许商用呢? 先偷偷留个证据,省的 ...

  9. SPI协议解析

    1. SPI物理层 SPI通讯需要使用4条线:3条总线和1条片选 . SPI遵循主从模式,3条总线分别是SCK.MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景: ...

  10. JuJu团队12月1号工作汇报

    JuJu团队12月1号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 于达  修改generator函数  优化代码  不熟悉julia 婷婷 和金华一起调试main.jl 继 ...