python算法与数据结构(22)图

有向图和无向图。
把图变成代码,可以使用邻接矩阵。
BFS:breadth first search ,广度优先搜索
DFS:depdth first search, 深度优先搜索

"""构造图"""
from collections import deque

GRAPH = {
    "A": ["B", "F"],
    "B": ["C", "I", "G"],
    "C": ["B", "I", "D"],
    "D": ["C", "I", "G", "H", "E"],
    "E": ["D", "H", "F"],
    "F": ["A", "G", "E"],
    "G": ["B", "F", "H", "D"],
    "H": ["G", "D", "E"],
    "I": ["B", "C", "D"],
}


class Queue(object):
    def __init__(self):
        self._deque = deque()

    def push(self, value):
        return self._deque.append(value)

    def pop(self):
        return self._deque.popleft()

    def __len__(self):
        return len(self._deque)

# 广度优先搜索
def bfs(graph, start):
    search_queue = Queue()
    search_queue.push(start)
    searched = set()  # 访问过的节点
    while search_queue:
        cur_node = search_queue.pop()
        if cur_node not in searched:  # 没有被访问过的节点
            print(cur_node)
            # yield cur_node
            searched.add(cur_node)
            for node in graph[cur_node]:
                search_queue.push(node)


print("bfs:")
bfs(GRAPH, "A")

输出结果:

bfs:
A
B
F
C
I
G
E
D
H

在这里插入图片描述
ABFCIGEDH从近到远的输出

# 深度优先
DFS_SEARCHED = set()


def dfs(graph, start):
    if start not in DFS_SEARCHED:
        print(start)
        DFS_SEARCHED.add(start)
    for node in graph[start]:
        if node not in DFS_SEARCHED:
            dfs(graph, node)


print("dfs:")
dfs(GRAPH, "A")

结果:

dfs:
A
B
C
I
D
G
F
E
H
发布了48 篇原创文章 · 获赞 0 · 访问量 739

猜你喜欢

转载自blog.csdn.net/qq_36710311/article/details/104733563