欧拉路径 - 边定向问题

欧拉路径

若从一个点 \(u\) 开始,枚举边 \(u\to v\),删边,\(\text{DFS}(v)\)

可以证明一定可以搜出一条 \(s\to t\) 的路径。因为考虑到达 \(u\) 后,除了起点终点,一定可以找到一条边 \(u\to v\)

此时可以不断搜索,直到图为空,再倒着输出这些路径即可。

stack<int> st;
vector<int> g[100010];
void dfs(int u) {
	for (int i = ers[u]; i < g[u].size(); i = ers[u]) {
		ers[u] = i + 1; dfs(g[u][i]); st.push(path(u, g[u][i]));
	}
}

CF527E Data Center Drama

「给所有 边定向,使得每一个点的出入度都是偶数」\((1)\) 等价于看做无向图后存在欧拉回路且边数为偶数 \((2)\)

证明:\((1)\to (2)\) 显然。而如果将欧拉回路中的第奇数条边反转方向,也可以满足 \((1)\)

奇数点连边,不够加自环。

CF547D Mike and Fish

将每个点所在的行和列连边,要将 边定向,满足任何点度数差 \(\le 1\)

建虚拟源点,和度数奇数的点连边,跑欧拉回路即可。

[COCI2021-2022#5] Fliper

将相邻的两个循环连边,现要将 边染色,使得任何点四种颜色数量相同且为偶数。

首先每个点的度数应为 \(8\) 的倍数,则边数也为 \(8\) 的倍数。

欧拉回路四染色即可,具体来说:首先欧拉回路将边二染色,再对每种颜色的子图二染色。

SDOISC #3 D2T3. 帽子

考虑一个人,看到其他帽子颜色,做出决策 \(b\ (0/1)\)。注意到自己帽子的颜色可能是 \(0\)\(1\),因此分别对应着两个状态,记为
\(S\)\(T\)

\(2^n\) 个状态建图,每个状态拆点,分别表示两种颜色的帽子。如果两种状态 \(S,T\) 仅一位不同,则那个人 \(k\) 无法分辨两个状态,如果 \(S_{k}=0\),将 \(S[0]\)\(T[1]\) 连边。现要将边定向,使得每个点入度大于一半。建虚点跑欧拉回路即可。

BEST 定理

对于一个有向 欧拉图,记点 \(i\) 的出度为 \(o_i\),其以 \(1\) 为根的欧拉回路个数为:

\[o_1\times (\text{root}\texttt{ 为 }1\text{ 时的内向树个数})\times \prod_{i}(o_i-1)! \]

若先走非树边,最后走父亲,

由于入度等于出度,

(绿边为生成树的边)

由于 \(\text{in}=1\),所以 \(\text{son}=0\),即子节点已经处理完毕。

posted @ 2023-07-09 11:15  Network_Error  阅读(111)  评论(0)    收藏  举报