版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013803572/article/details/82979237
-
在欧拉道路中,进和出是对应的,除了起点和终点外,其他点的进出次数应该相等。也就是说,除起点和终点外其他各点的度数应该是偶数。
-
如果奇点不存在,则可以从任意点出发,最终一定会回到起点,称为欧拉回路
-
python代码实现,如果存在欧拉回路或欧拉道路则输出所有可能的路径
# eulerEdges = [
# (0, 1),
# (0, 2),
# (2, 3),
# (1, 3)
# ]
# 七桥
eulerEdges = [
(1, 2),
(1, 2),
(1, 0),
(2, 0),
(2, 3),
(2, 3),
(3, 0)
]
start = 1 # 如果是欧拉道路必须从奇点开始
visited = [0 for i in range(len(eulerEdges))] #访问过的路
queue = [] # 保存路径信息
eulerFlag = False
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])
# 搜索过程只保存一条路的状态的信息,搜索结束后queue,visited会恢复为初始状态
def dfs(u):
queue.append(u)
flag = isEuler() # 判断当前路径是不是欧拉路,如果是则打印
if flag > 0:
eulerFlag = True
printPath(flag)
for i in range(len(eulerEdges)):
if visited[i] == 1:
continue
edge = eulerEdges[i]
if edge[0] == u:
visited[i] = 1
dfs(edge[1])
queue.pop() # 将搜索过的点弹出队列
visited[i] = 0 # 重置访问状态
elif edge[1] == u:
visited[i] = 1
dfs(edge[0])
queue.pop() # 将搜索过的点弹出队列
visited[i] = 0 # 重置访问状态
dfs(start)
if not eulerFlag:
print("不是欧拉回路或欧拉道路")