1. 程式人生 > >深搜(dfs)-廣搜(bfs)python實現

深搜(dfs)-廣搜(bfs)python實現

基於鄰接表的深搜和廣搜
圖:(忽略邊權,這裡只看邊)
在這裡插入圖片描述

import sys
from queue import Queue

sys.setrecursionlimit(1000000)


# 深搜
def dfs(start, graph, vis):
    print(start, end=' ')
    vis[start] = True
    for sub in graph[start]:
        if not vis[sub]:
            dfs(sub, graph, vis)


# 廣搜
def bfs(start, graph):
    n = len(graph)
    queue = []
    queue.append(start)
    vis = [False for _ in range(n)]
    vis[start] = True

    while queue:
        tem = queue.pop(0)
        print(tem, end=' ')
        for sub in graph[tem]:
            if not vis[sub]:
                queue.append(sub)
                vis[sub] = True


def bfs_queue(start, graph):
    n = len(graph)
    queue = Queue()
    queue.put(start)
    vis = [False for _ in range(n)]
    vis[start] = True

    while not queue.empty():
        tem = queue.get()
        print(tem, end=' ')
        for sub in graph[tem]:
            if not vis[sub]:
                queue.put(sub)
                vis[sub] = True


n = 7
# 圖的邊資料
data = [
    [1, 0],
    [1, 2],
    [1, 3],
    [1, 6],
    [2, 0],
    [0, 6],
    [3, 6],
    [3, 4],
    [0, 5],
    [5, 6],
    [5, 3],
    [5, 4]
]

# 構建鄰接表
n_node = 7
graph = [[] for _ in range(n_node)]
for edge in data:
    graph[edge[0]].append(edge[1])
    graph[edge[1]].append(edge[0])

print('深搜dfs')
dfs(0, graph, [False for _ in range(n)])
print('\n廣搜bfs')
bfs(0, graph)
print('\nbfs_queue')
bfs_queue(0, graph)

# 執行結果:
# 深搜dfs
# 0 1 2 3 6 5 4 
# 廣搜bfs
# 0 1 2 6 5 3 4 
# bfs_queue
# 0 1 2 6 5 3 4