欧拉回路

欧拉图 欧拉回路 欧拉通路 Euler

女生的网名这么多〃 提交于 2020-03-17 06:55:48
欧拉图 本文链接: http://www.cnblogs.com/Ash-ly/p/5397702.html 定义: 欧拉回路:图G的一个回路,如果恰通过图G的每一条边,则该回路称为欧拉回路,具有欧拉回路的图称为欧拉图。欧拉图就是从图上的一点出发,经过所有边且只能经过一次,最终回到起点的路径。 欧拉通路:即可以不回到起点,但是必须经过每一条边,且只能一次。也叫"一笔画"问题。 性质:    欧拉回路:一个欧拉回路,删掉一个点,仍然是一个欧拉回路。从一个欧拉回路拖走一个小欧拉回路,结果也是一个欧拉回路。 判定(充要):   欧拉回路:1: 图G是连通的,不能有孤立点存在。        2: 对于无向图来说度数为奇数的点个数为0; 对于有向图来说每个点的入度必须等于出度。   欧拉通路:1: 图G是连通的,无孤立点存在。        2: 对于无向图来说,度数为奇数的的点可以有2个或者0个,并且这两个奇点其中一个为起点另外一个为终点。 对于有向图来说,可以存在两个点,其入度不等于出度,其中一个出度比入度大1,为路径的起点;另外一个入度比出度大1,为路径的终点。 算法(求欧拉回路): Fleury算法: 设图G是一个无向欧拉图,则按照下面算法求欧拉回路: 1:任取G中一个顶点v0,令P0 = v0. 2:假设沿Pi = v0e1v1e2v2……eivi 走到了顶点 vi

欧拉路与欧拉回路

夙愿已清 提交于 2020-03-05 05:19:19
@kaike 图论起源 图论起源于18世纪,1736年瑞士数学家欧拉(Euler)发表了图论的第一篇论文“哥尼斯堡七桥问题”。在当时的哥尼斯堡城有一条横贯全市的普雷格尔河,河中的两个岛与两岸用七座桥连结起来。当时那里的居民热衷于一个难题:有游人怎样不重复地走遍七桥,最后回到出发点。 为了解决这个问题,欧拉用A,B,C,D4个字母代替陆地,作为4个顶点,将联结两块陆地的桥用相应的线段表示,于是哥尼斯堡七桥问题就变成了图中,是否存在经过每条边一次且仅一次,经过所有的顶点的回路问题了。欧拉在论文中指出,这样的回路是不存在的。 一笔画 1.凡是有偶点组成的连通图,一定可以一笔画成。 2.凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。 3.奇点数/2 可以算出此图需几笔画成。 概念 欧拉通路(欧拉迹):通过图中每条边一次且仅一次,并且过每一顶点的通路。 欧拉回路(欧拉闭迹):通过图中每条边一次且仅一次,并且过每一顶点的回路。 欧拉图:存在欧拉回路的图。欧拉图就是从一顶点出发每条边恰通过一次又能回到出发顶点的图,即不重复的走遍所有的边再回到出发点。 回路:起点和终点相同的通路。 简单图:不含平行边和自回路。 混合图:既有有向边,也有无向边。 平凡图:仅有一个顶点的图。 完全图:有n个顶点且每对顶点都有边相连的无向简单图,称为 无向完全图

欧拉回路/欧拉路径求解,Fleury算法,Hierhoizer算法

随声附和 提交于 2020-03-02 00:50:00
欧拉路径就是一笔画问题,在一个连通图中,一笔走完所有路径不能有重复路径。 无向图: 具有欧拉回路的 充要条件 图连通,所有点的度数为偶数 具有欧拉路径的 充要条件 图连通,具有0个或者2个奇数度数的结点 有向图: 具有欧拉回路的 充要条件 图连通,所有点的入度等于出度 具有欧拉路径的 充要条件 图连通,一个点的出度大入度1度,一个点的入度大于出度1度,其余点出度等于入度。 Fleury算法跟Hierhoizer算法很相似,但是Hierhoizer算法更快一点,遍历一遍图就可以了。 我感觉核心思想就是圈套圈,有欧拉回路的图可以抽象为很多圈套在一起,试想一下给你很多圈相切的图形,你该如何一笔画?当然是遇到切点就进入切点的园中继续走遇到切点就走。 Hierhoizer算法的思想就是如此。寻找欧拉回路的时候正确的起点出发,遍历该节下一个结点,然后删除此边重复此步骤,在一个存在欧拉路径的路中会找到一个环,然后用一个stack存储路径,从递归深处存储,遇到还有为访问完路径的结点就继续访问,这等价于全是园的图中遇到切点,我们就进入切点继续访问。 看代码辅助理解一下: vector < int > G [ 10000 ] ; //邻接表存图 int nums [ 1000 ] [ 1000 ] ; //存边的条数 stack < int > path ; void dfs ( int s ) {

Codeforces - One-Way Reform

ε祈祈猫儿з 提交于 2020-02-04 13:21:27
题目链接: Codeforces - One-Way Reform 由于欧拉回路的特性,我们可以发现,答案就是度数为偶数的点。 为奇数的点怎么办呢?由于度数为奇数的点一定是偶数,所以我们可以加一个虚拟节点,使得图为存在欧拉回路的图。然后跑欧拉回路即可。 AC代码: # pragma GCC optimize("-Ofast","-funroll-all-loops") # include <bits/stdc++.h> //#define int long long using namespace std ; const int N = 210 , M = 1e5 + 10 ; int n , m , dag [ N ] , cnt ; unordered_set < int > g [ N ] ; vector < pair < int , int > > res ; inline void add ( int a , int b ) { g [ a ] . insert ( b ) , g [ b ] . insert ( a ) ; dag [ a ] ++ , dag [ b ] ++ ; } void dfs ( int x ) { while ( g [ x ] . size ( ) ) { int to = * g [ x ] . begin ( ) ; g [ x

欧拉回路模板题

陌路散爱 提交于 2020-02-03 16:10:57
给定一张图,请你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。 输入格式 第一行包含一个整数 t,t∈{1,2},如果 t=1,表示所给图为无向图,如果 t=2,表示所给图为有向图。 第二行包含两个整数 n,m,表示图的结点数和边数。 接下来 m 行中,第 i 行两个整数 v i , u i v_i,u_i v i ​ , u i ​ ,表示第 i 条边(从 1 开始编号)。 如果 t=1 则表示 v i v_i v i ​ 到 u i u_i u i ​ 有一条无向边。 如果 t=2 则表示 v i v_i v i ​ 到 u i u_i u i ​ 有一条有向边。 图中可能有重边也可能有自环。 点的编号从 1 到 n。 输出格式 如果无法一笔画出欧拉回路,则输出一行:NO。 否则,输出一行:YES,接下来一行输出 任意一组 合法方案即可。 如果 t=1,输出 m 个整数 p1,p2,…,pm。令 e=|pi|,那么 e 表示经过的第 i 条边的编号。如果 pi 为正数表示从 ve 走到 ue,否则表示从 ue 走到 ve。 如果 t=2,输出 m 个整数 p1,p2,…,pm。其中 pi 表示经过的第 i 条边的编号。 数据范围 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1 ≤ n ≤ 1 0 5 , 0 ≤ m ≤ 2 × 1 0 5 0≤m≤2×10^5

欧拉回路与欧拉路径笔记

徘徊边缘 提交于 2020-02-03 01:27:10
欧拉路径:存在一个路径,走完所有的点,使得每个边只走了一次。 对于起点来说:我们只出去。 对于终点来说:我们只进来。 所以对于起点和终点来说,我们的度数都是奇数 对于中间点来说:我们需要一进一出。 所以对于中间点来说,我们所有的度数都是偶数 结论:1,存在欧拉路径的充要条件是图中奇数的点只能有0或者2个。 2,对于无向图,存在欧拉回路的充要条件(1)所有点的度数都是偶数 。 对于有向图来说: 1,存在欧拉路径的充要条件是:要么两个点的出度等于入度。要么除了两个点之外,其余点的出度等于入度。这两个点满足:一个满足入度比出度多1(终点),另一个满足出度比入度多1(起点)。 2,存在欧拉回路的充要条件:所有点的出度等于入度。 来源: CSDN 作者: 行走天涯的豆沙包 链接: https://blog.csdn.net/weixin_42979819/article/details/104144866

无序字母对 - C++

◇◆丶佛笑我妖孽 提交于 2020-01-31 20:26:29
无序字母对 题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。 输入格式 第一行输入一个正整数n。 以下n行每行两个字母,表示这两个字母需要相邻。 输出格式 输出满足要求的字符串。 如果没有满足要求的字符串,请输出“No Solution”。 如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案 输入输出样例 输入 #1 4 aZ tZ Xt aX 输出 #1 XaZtX 这道题一开始就没什么思路,因为根本不会联想到图。但这是图的遍历里面出现的题,就觉得事情不简单。果不其然,这里涉及到一个叫欧拉路的问题,为此我特地去了解了一下欧拉路系列知识。其实理解也不难。 如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。 如果一个回路是欧拉路径,则称为欧拉回路。 具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。 通俗点理解就是,你遍历一个图每条边只遍历一次便是欧拉路径。每条边只遍历两次便是欧拉回路。这里还涉及到一个奇点问题,度数为奇数的点。要形成欧拉回路,要么是0个奇点,要么是2个奇点。0个奇点便是一个连通图,必然是有欧拉路径,而2个奇点便是类似一条链,出点和终点度必须为1

欧拉回路、欧拉通路、欧拉图、半欧拉图等有关欧拉图的讲解与代码实现

白昼怎懂夜的黑 提交于 2020-01-30 20:05:51
有人说,图论的起源,就是源于欧拉图 (千万别看成柏拉图) ——题记 首先,先要讲一些有必要知道的东西: 当然,我在这里也写过,这里再给出一些拓展的内容 欧拉通路 : 通过图中每条边且只通过一次,并且经过每一顶点的通路 欧拉回路 : 通过图中每条边且只通过一次,并且经过每一顶点的回路 有向图的基图:忽略有向图所有边的方向,得到的无向图称为该有向图的基图。 欧拉图与半欧拉图 : 欧拉图指的是给出的图G<V, E>,满足所有的点V联通,并且每个点的度都是偶数,则图中的所有的边都可以一笔画经过,并且回到起始点,则我们说给出的图G是欧拉图; 半欧拉图的性质与欧拉图相似,但是它可以首尾不相连接,也就是这幅图是欧拉通路,满足图中的所有的边都可以一笔画经过,但是不要求回归起点。 无向图的欧拉图判定与有向图的欧拉图判定 无向图 设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路; 如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路是欧拉回路 具有欧拉回路的无向图G成为欧拉图 有向图 (1)设D是有向图,D的基图连通,则称经过D的每条边一次并且仅有一次的有向路径为 有向欧拉通路 (2)如果有向欧拉通路是有向回路,则称此有向回路为 有向欧拉回路 (3)具有有向欧拉回路的图D称为有向欧拉图 定理(无向图) 无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度结点

欧拉通路与欧拉回路问题

倖福魔咒の 提交于 2020-01-30 03:56:49
版权声明:本文为CSDN博主「Alex_McAvoy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u011815404/article/details/86590498 目录 【基本概念】 【欧拉通路/回路的判定】 1.无向图 2.有向图 3.并查集判断无向图中是否存在欧拉回路 4.Fleury 算法 【应用】 1.无向欧拉图打印欧拉通路/回路 2.有向欧拉图打印欧拉通路/回路 1)邻接矩阵实现 2)邻接链表实现 【基本概念】 欧拉通路:通过图中所有边一次且仅一次行遍所有顶点的通路 欧拉回路:通过图中所有边一次且仅一次行遍所有顶点的回路 欧拉图:具有欧拉回路的图 半欧拉图:具有欧拉通路而无欧拉回路的图 奇度点:与点相连的边的数目为奇数的点 偶度点:与点相连的边的数目为偶数的点 【欧拉通路/回路的判定】 1.无向图 1)欧拉通路:图是连通的,图中只有两个奇度点,分别是欧拉通路的两个端点 对于欧拉通路,除起点、终点外,每个点如果进入,显然一定要出去,因此都是偶点 2)欧拉回路:图是连通的,点均为偶度点 对于欧拉回路,每个点进入、出去的次数相等,因此没有奇点 2.有向图 1)欧拉通路:图是连通的,除两顶点外其余点的入度等于出度,且这两个顶点中,一个顶点入度比出度大1(起点)

6.4.4 用 dfs 求欧拉回路 (UVa 10129)

我的未来我决定 提交于 2020-01-23 14:13:59
欧拉回路:该回路遍历了一个图中所有的边,并且每条边只遍历一次。(一笔画) 欧拉路径:从起点开始到终点,遍历了图中所有的边,并且每条边只遍历一次。 度数:一个点连接了几条边。 入度和出度分别指:进入该点的边的数量,走出该点的边的数量。 连通无向图存在欧拉回路的充要条件:所有点的度数都为偶数。 连通无向图存在欧拉路径的充要条件:仅存在两个度数为奇数的点,其他点的度数都为偶数。(这两个度数为奇数的点,一个为奇数,一个为偶数) 连通有向图存在欧拉回路的充要条件:对于所有的点,入度等于出度。 连通有向图存在欧拉路径的充要条件: 仅存在两个点,其中一个点的入度比出度大一,另一个店的出度比入度大一。(出度大的为起点,入度大的为终点) 根据连通性和度数可判断出无向图和有向图是否存在欧拉回路和欧拉路径,可用 dfs 构造欧拉回路和欧拉路径。 基本思路:使用 dfs 的方式,遍历图中所有的点。dfs 一个环,然后在回溯的过程中,可能会遇到一个公共点连接着另一个环,此时再对这个公共点进行 dfs 遍历另一个环…… 如此递归。在 dfs 完与 u 结点相连的 v 结点后,再将 u,v 这条边压入输出栈(采用逆序的顺序输出结果,因为 dfs 栈帧入栈的顺序与出栈的顺序相反,起始点最后才出栈)。 例如:用 dfs 求该图的欧拉路径 dfs 遍历该图的顺序为: (1, 2) (2, 3) (3, 4) (4,