1. 程式人生 > 其它 >圖的深度優先演算法以及廣度優先演算法

圖的深度優先演算法以及廣度優先演算法

技術標籤:演算法演算法

def dfs(isConnected):
    # 獲取當前節點的鄰居節點
    def _get_first_neighbor(isConnected, cur_point):
        j = len(isConnected) - 1
        neighbor = []
        while j >= 0:
            if isConnected[cur_point][j] == 1 and cur_point != j:
                neighbor.append(j)
            j -=
1 return neighbor result = '' # 儲存鄰居節點 neighbor_stack = [] # 儲存節點的訪問狀態,預設都是未被訪問狀態 is_visited = [False] * len(isConnected) for cur_point in range(len(isConnected)): # 如果當前節點已經被訪問,則對下一個節點進行訪問 if is_visited[cur_point]: continue # 當前節點置為已被訪問狀態
is_visited[cur_point] = True result = result + str(cur_point) + '------>' # 當前節點的所有鄰居節點壓入棧中 neighbor_stack.extend(_get_first_neighbor(isConnected, cur_point)) # 如果鄰居節點為空,說明當前已經是最後的一個節點,否則依次對靈雎節點進行處理 while neighbor_stack.__len__() != 0: # 獲取鄰居節點
pop = neighbor_stack.pop() # 如果鄰居節點已經被訪問,則繼續處理下一個鄰居節點 if is_visited[pop]: continue else: # 對鄰居節點進行遍歷 result = result + str(pop) + '------>' # 修改鄰居節點的訪問狀態為已訪問 is_visited[pop] = True # 獲取鄰居節點的鄰居節點 neighbor_stack.extend(_get_first_neighbor(isConnected, pop)) return result
def bfs(isConnected):
    # 獲取當前節點的鄰居節點
    def _get_first_neighbor(isConnected, cur_point):
        j = 0
        neighbor = []
        while j < len(isConnected):
            if isConnected[cur_point][j] == 1 and cur_point != j:
                neighbor.append(j)
            j += 1
        return neighbor

    result = ''
    # 儲存鄰居節點
    neighbor_stack = []
    # 儲存節點的訪問狀態,預設都是未被訪問狀態
    is_visited = [False] * len(isConnected)
    for cur_point in range(len(isConnected)):
        # 如果當前節點已經被訪問,則對下一個節點進行訪問
        if is_visited[cur_point]:
            continue
        # 當前節點置為已被訪問狀態
        is_visited[cur_point] = True
        result = result + str(cur_point) + '------>'
        # 當前節點的所有鄰居節點壓入棧中
        neighbor_stack.extend(_get_first_neighbor(isConnected, cur_point))
        # 如果鄰居節點為空,說明當前已經是最後的一個節點,否則依次對靈雎節點進行處理
        while neighbor_stack.__len__() != 0:
            # 獲取鄰居節點
            pop = neighbor_stack.pop(0)
            # 如果鄰居節點已經被訪問,則繼續處理下一個鄰居節點
            if is_visited[pop]:
                continue
            else:
                # 對鄰居節點進行遍歷
                result = result + str(pop) + '------>'
                # 修改鄰居節點的訪問狀態為已訪問
                is_visited[pop] = True
                # 獲取鄰居節點的鄰居節點
                neighbor_stack.extend(_get_first_neighbor(isConnected, pop))
    return result

測試

isConnected = [
    # 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15
    [1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],  # 1
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 2
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],  # 3
    [0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],  # 4
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],  # 5
    [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0],  # 6
    [0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0],  # 7
    [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],  # 8
    [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0],  # 9
    [0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1],  # 10
    [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0],  # 11
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],  # 12
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],  # 13
    [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0],  # 14
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]  # 15
]
print("dfs結果:" + dfs(isConnected))
print("dfs結果:" + bfs(isConnected))

在這裡插入圖片描述