廣度優先搜索(BFS), 深度優先搜索(DFS) 解決圖兩節點最短路徑問題

  • 題目用到的圖
    在這裏插入圖片描述
  • 具體代碼
# -*- coding:utf-8 -*-

""" 
Author: leadingme
Mail:[email protected]
MyWebsite:leadingme.top
"""
# 用隊列實現廣度優先搜索
# 用棧實現深度優先搜索
from queue import Queue, LifoQueue

graph = {
    "A": ["B", "C"],
    "B": ["A","C","D"],
    "C": ["A","B","D","E"],
    "D": ["B","C","E","F"],
    "E": ["C", "D"],
    "F": ["D"]
}

def BFS(graph, s):
    queue = Queue(maxsize=0)
    queue.put(s)
    seen = set()
    seen.add(s)
    parent = {s: None} # 用於存儲每個節點的父節點,求最短距離可用
    while queue.qsize() > 0: # 隊列判空
        vertex = queue.get()
        nodes = graph[vertex]  # 元素的所有連接點
        for w in nodes:
            if w not in seen:
                queue.put(w)
                seen.add(w)
                parent[w] = vertex
        # print(vertex)
    return parent

def DFS(graph, s):
    stack = LifoQueue(maxsize=0)
    stack.put(s)
    seen = set()
    seen.add(s)
    while stack.qsize() > 0: # 棧判空
        vertex = stack.get()
        nodes = graph[vertex]
        for w in nodes:
            if w not in seen:
                stack.put(w)
                seen.add(w)
        print(vertex)


if __name__ == '__main__':
    # DFS(graph, "A")
    parent = BFS(graph, "A")
    # print(parent)  {'A': None, 'B': 'A', 'C': 'A', 'D': 'B', 'E': 'C', 'F': 'D'}
    v = "D" # 尋找D到A的最短路線
    while v is not None:
        print(v)  # D -> B -> A
        v = parent[v]



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章