欧拉回路


定义

欧拉回路:图G中每条边且只通过一次,并且经过每一顶点的回路
欧拉通路:(欧拉路径):图G中每条边且只通过一次,并且经过每一顶点的通路
欧拉图:存在欧拉回路的图
半欧拉图:存在欧拉通路的图
极大连通子图:在一个连通子图中,包含和顶点有关所有的边(the more the better),那就是极大连通子图。

判定一个图是否是(半)欧拉图

无向图:

定理1:无向图G为欧拉图,当且仅当G为连通图且所有顶点的度为偶数。

推论1:无向图G为半欧拉图,当且仅当G为连通图且除了两个顶点的度为奇数外,所有顶点的度为偶数。

有向图:

定理2:有向图G{G}G为欧拉图,当且仅当G{G}G的基图为连通图,且所有顶点的入度等于出度。

注:有向图的基图就是去掉所有方向的无向图。

推论2:有向图G{G}G为半欧拉图,当且仅当G{G}G的基图为连通图,且存在顶点u{u}u的入度比出度大1,v{v}v的出度比入度大1,且其他的所有顶点的入度等于出度。

对于求解欧拉回路的,我们还需要以下两个性质:

  • 设C{C}C是欧拉图G{G}G中的一个简单的回路,将C{C}C中的边从图G{G}G中删去的带一个新的图G1{G^{1}}G1,则G1{G^{1}}G1的每一个极大连通子图都有一条欧拉回路。

证明: 若G{G}G为无向图,则图G′{G^{'}}G′的各顶点的度都为偶数;若G{G}G为有向图,则图G′{G^{'}}G′的各顶点的入度等于出度。

  • 设C1{C_{1}}C1​、C2{C_{2}}C2​是图G{G}G的两个没有公共边,但至少有一个公共顶点的简单回路,我们可以将他合并成一个新的简单回路C′{C^{'}}C′。

证明: 按下图合并

算法步骤

以无向图为例:

  • 在图G{G}G中任意找到一个回路C{C}C;

  • 将图G{G}G中属于回路C{C}C的边删除;

  • 在残余图的各极大连通子图中分别寻找欧拉回路;

  • 将各极大连通子图的欧拉回路合并到C{C}C中得到图G{G}G的欧拉回路。

算法原理

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int M = 100010,N = 1000010;
int head[M],ver[N],Next[N],tot;//邻接表
int stack[N],ans[N];
bool vis[N];
int n,m,top,t;
void add(int x,int y) {ver[++tot] = y,Next[tot] = head[x],head[x] = tot;
}
void euler() {stack[++top] = 1;while(top > 0) {int x = stack[top], i =head[x];while(i && vis[i]) i = Next[i]; //找到一条未访问的边if(i) {                           //沿着这条边模拟递归的过程,标记改变,并更新表头stack[++top] = ver[i];head[x] = Next[i];vis[i] = vis[i^1] = true;} else {                       //与x相连的所有边都已经访问,模拟回溯过程,并记录于答案栈中 top--;ans[++t] = x;}}
}
int main(){scanf("%d %d",&n,&m);tot = 1;for(int i = 1; i <= m; i++){int x,y;scanf("%d %d",&x,&y);add(x,y);add(y,x);}euler();for(int i = t; i ; i--) printf("%d\n",ans[i]);return 0;
}

参考:黄新军,董永建《信息学奥赛一本通·提高篇》

哈密顿回路


快乐暑假(八)——欧拉回路和哈密顿回路相关推荐

  1. 初二(2)班快乐暑假

    有了目标,艰辛的求学道路上充满了快乐! 我的暑假生活 学生姓名_____________ 家长姓名_____________ 海南中学2002"云帆"班 2022.6.30. 初二 ...

  2. 欧拉回路 和 哈密顿回路

    图是连通图 哈密顿回路:经过每个点一次并且回到起点 欧拉回路:经过每一条边并回到起点 通路:在无向图中由点边交替组成的序列就是通路(如果这个图是简单的,那么也可以使用点的序列来表示),如果首尾的点相同 ...

  3. 学习手记(2019/7/05~2019/8/31)——快乐暑假

    文章目录 二分答案的作用 堆和区间 很糙ddp 线段树合并 网络流结论の1 树上莫队 对角线与GCD 区间与扫描线与方案数 欧拉欧拉*1 斯坦纳树 切比雪夫距离 二分匹配结论の1 min-max容斥 ...

  4. 快乐暑假(一)——贪心法的编程实验

    贪心算法(Greedy algorithm,又称贪婪算法)用于解决多阶段的优化问题. 所谓贪心算法,是在总体最优策略无法给出的情况下,每一步的选择都是求局部最优解:当求目标函数值最大时,选择当前最大值 ...

  5. 用计算机打女生节快乐,女生节快乐的朋友圈说说

    一.有了你,世界才有了安宁:有了你,人间才有了姻缘:有了你,日子才有了美好:有了你,岁月才有了妖娆:有了你,才有了女生节,有了我的祝福. 二.校园花儿朵朵艳,大学女生个个靓.美丽漂亮翩翩舞,天生能歌天 ...

  6. 长兴鸿蒙母亲节,祝湖北省枣阳市所有的母亲”母亲节”快乐!

    有一年台湾举办了一次短信创意大赛,结果台湾的一个小学生获得了一等奖,在母亲节那天,她给她爸爸发了一个短信"爸爸,祝母亲节快乐." 从短短的"爸爸,祝母亲节快乐." ...

  7. 乐高机器人linux,乐高机器人作文范文4篇

    乐高机器人作文范文4篇 我爱乐高机器人 今年暑假,妈妈听说少年宫新推出了乐高机器人班,立即给我报了名."乐高"一词在丹麦语中意为"玩出精彩,玩出快乐",这八个字 ...

  8. ACM基础知识及算法

    ACM 算法   难度 数据结构 栈 栈     1 单调栈       队列 一般队列     1 优先队列/单调队列     1 循环队列     2 双端队列     2 链表 一般链表     ...

  9. 对计算机网络的父亲,父亲节朋友圈对老爸说的话 写给父亲催泪的话简短

    关于父亲节朋友圈对老爸说的话整理分享,你稳健的脚步,永远在我眼中:你温暖的提醒总是在耳边响起:你善良的脸总是在你的梦里看到:你忙碌的身影总是让我担心,父亲节快到了,愿你永远幸福健康!父亲节快乐!那么关 ...

  10. ACM训练计划建议(转)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

最新文章

  1. 程序猿面试什么最重要?
  2. 题目1195:最长最短文本
  3. -jar参数运行应用时classpath的设置方法
  4. 参数 相等_ANSYS DesignXplorer 参数化优化在水冷板流道设计中的应用
  5. 中文语音情感识别python实现(一)
  6. F1.4大光圈专业相机-海鸥CF100
  7. Spring4:具有Java 8 Date-Time API的@DateTimeFormat
  8. 将JavaFX 2.0与Swing和SWT集成
  9. scala 去除重复元素_Scala程序从列表中删除重复项
  10. UITextView 和 UITextField限制字符数和表情符号
  11. PDMS Pipeline Tool 教程(一):安装说明
  12. 什么软件可以支持视频转换成文字?
  13. 【腾讯云】音视频存储管理CVS
  14. 用ChatGPT实现变现的多种方法
  15. 网络编程--JAVA之多线程下载后续:断点续存
  16. public protected private
  17. 阿里云——云迁移中心
  18. 这些00后的“火星文”你都认识吗?证明自己是小鲜肉的时刻终于到了
  19. 2017 年 11 个移动 App 开发趋势
  20. Matlab 里 premnmx tramnmx postmnmx 分别表示什么

热门文章

  1. Xamarin 初学,设计一个简单的美景展示App(只实现了部分功能)
  2. PTA Huffman树及其应用题
  3. amoeba mysql proxy_mysql-proxy和amoeba 分别实现Mariadb读写分离
  4. 盾神与积木游戏 (贪心典例)
  5. Keys配置及使用说明
  6. 如何让OpenwrtX86和win7双系统共存在一块硬盘
  7. 智能家居加速落地,景联文科技提供数据采集标注服务
  8. Citrix桌面虚拟化基础搭建教程(持续更新)
  9. android category 讲解
  10. Windows安全加固简介