From 659078bccc80f5f93735af5c6f1a95e1b2c24c41 Mon Sep 17 00:00:00 2001 From: CurryWOE <76390659+CurryWOE@users.noreply.github.com> Date: Mon, 30 Oct 2023 17:50:30 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E6=AC=A7=E6=8B=89=E8=B7=AF.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增欧拉图 --- .../\346\254\247\346\213\211\350\267\257.md" | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git "a/docs/Graph/\346\254\247\346\213\211\350\267\257.md" "b/docs/Graph/\346\254\247\346\213\211\350\267\257.md" index e69de29bb..ab4d42975 100644 --- "a/docs/Graph/\346\254\247\346\213\211\350\267\257.md" +++ "b/docs/Graph/\346\254\247\346\213\211\350\267\257.md" @@ -0,0 +1,49 @@ +# 欧拉图(Euler Graph) +## 定义 +- **欧拉回路**:通过图中每条边恰好一次的回路 +- **欧拉通路**:通过图中每条边恰好一次的通路 +- **欧拉图**:具有欧拉回路的图 +- **半欧拉图**:具有欧拉通路但不具有欧拉回路的图 +## 性质 +欧拉图中所有顶点的度数都是偶数。 + +若 $G$ 是欧拉图,则它为若干个环的并,且每条边被包含在奇数个环内。 +## 判别法 +1. 无向图是欧拉图当且仅当: + - 非零度顶点是连通的 + - 顶点的度数都是偶数 +2. 无向图是半欧拉图当且仅当: + - 非零度顶点是连通的 + - 恰有 2 个奇度顶点 +3. 有向图是欧拉图当且仅当: + - 非零度顶点是强连通的 + - 每个顶点的入度和出度相等 +4. 有向图是半欧拉图当且仅当: + - 非零度顶点是弱连通的 + - 至多一个顶点的出度与入度之差为 1 + - 至多一个顶点的入度与出度之差为 1 + - 其他顶点的入度和出度相等 +## 查找无向图欧拉回路 +定义全局变量use[N],表示点u的前use[u]条边已经被用过了,dfs时只走没用过的边,边为二元组(另一点,反向边的存储位置),记录第二个信息方便标记反向边已经用过 +```cpp +int use[N]; +vector> e[N]; +void dfs(int u) +{ + while (use[u] < e[u].size()) + { + auto [v, ind] = e[u][use[u]]; + if (v == -1) + { + ++use[u]; + continue; + } + e[v][ind][0] = -1; + ++use[u]; + dfs(v); + } +} +int pos1 = e[u].size(), pos2 = e[v].size(); +e[u].push_back({v, pos2}); +e[v].push_back({u, pos1}); +```