欧拉回路python

  • 定义

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

你可能感兴趣的:(深度优先,算法)