定义:
通过图(无向图或有向图)中所有边且每边仅通过一次通路称为欧拉通路,相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。
定理:
- 无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数);
- 连通
- 所有结点度数为偶数
- 无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点;
- 连通
- 奇数度的节点有 0 个或 2 个,其余都为偶数
- 有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度
- 忽略边的方向后连通
- 所有结点度数为偶数
- 有向连通图D含有欧拉通路,当且仅当该图为连通图且D中除两个结点外,其余每个结点的入度=出度,且此两点满足deg-(u)-deg+(v)=±1。(起始点s的入度=出度-1,结束点t的出度=入度-1 或两个点的入度=出度)
- 忽略边的方向后连通
- 起始点:入度 = 出度 - 1;结束点:入度 = 出度 + 1
- 除起始点和结束点外,剩余结点的度数为偶数
题目:
有向欧拉通路:UVA - 10129 Play on Words
无向欧拉回路:UVA - 10054 The Necklace
有向欧拉回路:UVA - 10596 Morning Walk
欧拉图打印:
//用于无向图
void euler (int u) {
for (int v = 0; v < n; v++)
if (G[u][v] && !vis[u][v]) {
vis[u][v] = vis[v][u] = 1;
euler(v);
printf("%d %d\n", u, v);//输出逆序
}
}
//用于有向图时,把 vis[u][v] = vis[v][u] = 1 改成 vis[u][v]