欧拉回路

欧拉图: 就是从任意一个点开始都可以一笔画完整个图
半欧拉图: 必须从某个点开始才能一笔画完整个图。

对于无向图 , 是欧拉图当且仅当 是连通的且没有奇度顶点。

对于无向图 , 是半欧拉图当且仅当 是连通的且 中恰有 个或 个奇度顶点。

对于有向图 , 是欧拉图当且仅当 的所有顶点属于同一个强连通分量且每个顶点的入度和出度相同。

对于有向图 , 是半欧拉图当且仅当
如果将有向图中的所有有向边退化为无向边时,那么所有顶点属于同一个连通分量。
最多只有一个顶点的出度与入度差为 。
最多只有一个顶点的入度与出度差为 。
所有其他顶点的入度和出度相同。

Fleury

一个偏暴力的算法,应用范围更广,但是复杂度高,暂时用不到,以后再学。

Hierholzer(逐步插入回路法)

先记录每个点的度,判断是否存在欧拉回路或者路
从一个指定起点出发,不断的走与其相邻的边,走过的边就删掉,回溯时碰到出入度为0的点就将其加入答案队列,显然答案是逆序加入的,所以要从队尾开始输出。

该算法,有回路给出回路,没回路给出路,都没有则结束
参考他的手推递归树方便理解

以一道例题给出模板
P2731 [USACO3.3]骑马修栅栏 Riding the Fences

/*
Hierholzer
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1025;
multiset<int> to[maxn]; // 要使输出的路径尽可能小,利用multiset的排序
int degree[maxn];
int road[maxn], cnt; // 记录路径及路径长度
void dfs(int x) {for(auto a = to[x].begin(); a != to[x].end(); a=to[x].begin()) { // auto C++11标准,可以自动匹配数据类型 int u = *a;to[x].erase(a);to[u].erase(to[u].find(x)); // 删边dfs(u); }road[cnt++] = x; // 往队列里插答案
} int main() {int m, a, b;scanf("%d", &m);for(int i = 0; i < m; i++) {scanf("%d%d", &a, &b);degree[a]++, degree[b]++; // 记录点的度 to[a].insert(b); // 建边 to[b].insert(a); // 双向边 }int s = -1, e = -1; // 起点与终点 for(int i = 1; i <= 1024; i++) {// 判断每个点的度数 if(degree[i]&1) { // 奇度顶点 if(s == -1) s = i; // 一个作为起点 else if(e == -1) e = i; // 一个作为终点 else exit(1); // 如果奇度顶点 >= 3 没有欧拉路 // 退出整个程序,终止进程,并返回1给操作系统。// 由于返回0代表程序正常退出,返回1等其他数字通常代表异常终止。可通过返回的具体数值判断出错源。} }if(s == -1) s = 1; // 全是偶度顶点则直接从 开始答案最小 dfs(s);for(int i = cnt-1; i >= 0; i--) { // 倒叙输出为答案 printf("%d\n", road[i]);} return 0;
}

欧拉回路与欧拉路(模板)相关推荐

  1. 【Luogu1341】无序字母对(并查集联通,欧拉路模板)

    problem 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒). 请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输出字典序最小的方案(n的规模 ...

  2. 欧拉路HDU3018

    欧拉路,欧拉回路,讲的实际上就是一笔画的问题. 给定n个点,m条边,如果能一笔把所有边都连上就是欧拉路,如果起点和终点是同一点,就是欧拉回路. 欧拉路的特征:对于无向图,如果所有点的度都是偶数,那么任 ...

  3. C/C++数据结构——虚虚实实(并查集欧拉路)

    题目描述 震为雷,临危不乱,亨通畅达:巽为风,柔顺伸展,厚载万物. 震卦:洊雷,震,君子以恐惧修省.一口金钟在淤泥,人人拿着当玩石,忽然一日钟悬起,响亮一声天下知. 巽卦:随风,巽,君子以申命行事.一 ...

  4. 模板 - 欧拉路、欧拉回路(一笔画问题)

    整理的算法模板合集: ACM模板 目录 非递归版 普通递归版 HierholzersHierholzersHierholzers算法(输出字典序最小的答案) FleuryFleuryFleury算法 ...

  5. 图论--欧拉路,欧拉回路(小结)

    在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路.问须要走几次才干将全部的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边仅仅能走一次, ...

  6. hrbust 哈理工oj 1633 word!word!【欧拉路、欧拉回路的有向图判断】

      word!word! Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 58(20 users) Total Accepted: 25 ...

  7. 欧拉路和欧拉回路知识

    概念 如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path). 如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit). [1] 具有欧拉回路的图称为欧拉图 ...

  8. 图论-欧拉路(UVA10054)(HDU1116)

    首先说一下定义: 欧拉路:从图中某点出发可以遍历全图,图中的每条边通过且只能通过一次. 欧拉回路:具有欧拉路性质且起点位置与终点位置相同. 主要问题就是一个图中是否存在欧拉路,和打印欧拉路路径. 先说 ...

  9. #1182 : 欧拉路·三(有向图的欧拉路)

    #1182 : 欧拉路·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho破解了一道又一道难题,终于来到了最后一关.只要打开眼前的宝箱就可以通关这个游戏了 ...

最新文章

  1. Transferring GANs: generating images from limited data 论文学习
  2. Mybatis操作主体流程
  3. vue中获取url参数
  4. jQuery内置动画和多库共存
  5. 前端学习(1355)模板语法循环
  6. 华为高管揭秘公司不上市的原因;微信回应「花钱就能查到聊天记录」;马斯克删除「超苹果只要几个月」评论 | 极客头条...
  7. Django知识总结
  8. OA系统四级模块编写测试用例(角色模块)
  9. 在线多功能工具箱php源码
  10. win10浏览器加载很慢_Win10 IE浏览器的网页加载速度很慢总是卡死怎么办
  11. python出现SyntaxError: Non-ASCII character '\xe6' in file错误
  12. 锐捷ruijie无线控制器AC登录说明
  13. eclipse下连接MYSQL教程
  14. 新浪微博授权提示:文件不存在(C8998)的解决方法
  15. 如何关闭AndroidX?
  16. imx8 qca6595驱动编译
  17. 医院信息集成平台现状总结
  18. css中min-height和max-height的区别
  19. 汇编语言---算术运算指令
  20. 测试游戏的软件电脑运行,什么是软件性能测试_电脑测试性能软件_测试电脑游戏性能软件...

热门文章

  1. 自动驾驶中的车道线跟踪技术
  2. 基于投票方式的机器人装配姿态估计
  3. 线性求[1,P-1]的逆元
  4. 如何解决uiaotomator定位工具报错
  5. 【PHP源码分析】small内存规格的计算
  6. 配置ssh公钥登录提示还是输入密码
  7. s3c2410上搭建QT/Embedded4.8.5开发环境(四)--安装intel-x86 X11平台qt库qt-everywhere-opensource-src-4.8.5...
  8. 通过案例学功能 自定义监控功能初探
  9. 《人人都能看懂经济学》读书笔记
  10. puppet自动化运维之资源关系