欧拉路径 - 边定向问题
欧拉路径
若从一个点 \(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\) 为根的欧拉回路个数为:
若先走非树边,最后走父亲,
由于入度等于出度,

(绿边为生成树的边)
由于 \(\text{in}=1\),所以 \(\text{son}=0\),即子节点已经处理完毕。

浙公网安备 33010602011771号