欧拉图(欧拉通路&欧拉回路)
欧拉图(欧拉通路&欧拉回路)
定义
通过图中所有边恰好一次的通路称为欧拉通路。
通过图中所有边恰好一次的回路称为欧拉回路。
具有欧拉回路的无向图或有向图称为欧拉图。
具有欧拉通路但不具有欧拉回路的无向图或有向图称为半欧拉图。
有向图也可以有类似的定义。
非形式化地讲,欧拉图就是从任意一个点开始都可以一笔画完整个图,半欧拉图必须从某个点开始才能一笔画完整个图。
判定
1.对于无向图,所有边都是连通的
(1) 存在欧拉路径的充分必要条件: 度数为奇数的点只能是0或者2个(0个为欧拉回路的情况)
(2) 存在欧拉回路的充分必要条件: 度数为奇数的点只能有0个
2.对于有向图,所有边都是连通的
(1) 存在欧拉路径的充分必要条件: 要么所有点出度均等于入度(欧拉回路情况);要么除了两个点之外,其余点的出度等于入度,剩余的两个点:一个满足出度比入度多1(起点),另一个满足入度比出度多1(终点)
(2) 存在欧拉回路的充分必要条件: 所有点的出度均等于入度
性质
非形式化地讲,欧拉图就是从任意一个点开始都可以一笔画完整个图,半欧拉图必须从某个点开始才能一笔画完整个图。
欧拉图中所有顶点的度数都是偶数。
若\(G\)是欧拉图,则它为若干个环的并,且每条边被包含在奇数个环内。
寻找方法
1 记录点的情形
void dfs(int x)
对于从x出发的每条边(x, y)
如果该边没有被访问过
把这条边删去
dfs(y)
把x入栈
main()
dfs(1)
倒序输出栈中所有的节点
2 记录边的情形
void dfs(int x)
对于从x出发的每条边i(x, y)
如果该边没有被访问过
把这条边删去
dfs(y)
把边i入栈
main()
dfs(1)
倒序输出栈中所有的边
栗子
[USACO3.3]骑马修栅栏 Riding the Fences
如题,就是找到欧拉回路然后记录点
CF429E Points and Segments
题目大意
在一个数轴给定n条线段,可以选择把他染红或蓝,要求数轴上的每个点所经过的红蓝线段差小于等于1
题解:
首先离散化,我们考虑设染红操作为区间+1,染蓝为区间-1,然后每个点所经过的红蓝线段差就转化成了每个点之值,于是我们先考虑最简单的,就是每个点的值为0才合法。
然后就不是人能想到的东西了(OI的难题就是如此,这种没有指向性的东西,唉)
将一个区间+1看作l到r连一条边,区间-1看作r到l连一条边,然后竟然发现,要满足合法(也就是任意点的值为0)就是在上面满足能被欧拉回路覆盖.
然后如图非常好理解。
但是这种情况非常局限,如果不能被欧拉回路覆盖就不是合法情况。
于是就将合法条件拓展到原问题,每个点的值为-1,0,或1
然后就引入虚边(绿边)
然后对于存在奇点的图,显然奇点的数量一定为偶数,将所有奇点从小到大排序,设为 {A1,A2,……An},在 A1和 A2,A3和 A4,……An-1和 An之间连一条无向边,称为虚边。
注意一下正确性,由于每个点上最多有1条虚边,所以他要么是红,要么是蓝,对点的值影响为0,1,-1恰为题意。
所以就没了,注意一下答案的输出。