欧拉回路,欧拉道路,七桥问题,Python代码实现

  • 欧拉道路中,进和出是对应的,除了起点和终点外,其他点的进出次数应该相等。也就是说,除起点和终点外其他各点的度数应该是偶数。

  • 如果奇点不存在,则可以从任意点出发,最终一定会回到起点,称为欧拉回路

  • 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("不是欧拉回路或欧拉道路")

你可能感兴趣的:(算法)