欧拉图(欧拉通路&欧拉回路)

欧拉图(欧拉通路&欧拉回路)

定义

通过图中所有边恰好一次的通路称为欧拉通路。

通过图中所有边恰好一次的回路称为欧拉回路。

具有欧拉回路的无向图或有向图称为欧拉图。

具有欧拉通路但不具有欧拉回路的无向图或有向图称为半欧拉图。

有向图也可以有类似的定义。

非形式化地讲,欧拉图就是从任意一个点开始都可以一笔画完整个图,半欧拉图必须从某个点开始才能一笔画完整个图。

判定

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恰为题意。

所以就没了,注意一下答案的输出。

posted @ 2024-02-22 20:48  zhy_learn  阅读(307)  评论(0编辑  收藏  举报