-
定义
- 如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径(Euler path)。
- 如果一个回路是欧拉路径,则称为欧拉回路(Euler circuit)。 [1]
- 具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。
-
判断
A.判断欧拉通路是否存在的方法
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
B.判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
python代码参考:欧拉回路,欧拉道路,七桥问题,Python代码实现_曹向前的博客-CSDN博客
以七桥问题为例,选择一个奇数点开始,使用dfs思想,对每个可能的路深度遍历
def isEuler():
allVisited = True
for e in visited:
if e == 0:
allVisited = False
if allVisited:
if queue[0] == queue[len(queue) - 1]:
return 1
else:
return 2
return 0
def printPath(flag):
if flag == 1:
print("是欧拉回路:", end="")
else:
print("是欧拉道路:", end="")
for i in range(len(queue)):
if i < len(queue) - 1:
print(queue[i], "-> ", end="")
else:
print(queue[i])
def dfs(x):
queue.append(x)
flag = isEuler()
if flag > 0:
eulerFlag = True
printPath(flag)
for i in range(len(eulerEdges)):
if visited[i]:
continue
visited[i] = 1
if eulerEdges[i][0] == x:
dfs(eulerEdges[i][1])
queue.pop()
visited[i] = 0
elif eulerEdges[i][1] == x:
dfs(eulerEdges[i][0])
queue.pop()
visited[i] = 0
eulerEdges = [
(1, 2),
(1, 2),
(1, 0),
(2, 0),
(2, 3),
(2, 3),
(3, 0)
]
queue = []
visited = [0 for _ in range(len(eulerEdges))]
eulerFlag = False
start = 1
dfs(start)
if not eulerFlag:
print("不是欧拉回路或欧拉道路")