数据结构算法求详细解

5、对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,利用队列的基本运算实现图的广度优先遍历;利用栈的基本运算实现图的深度优先遍历;从键盘输入初始出发的顶点的序号,要求在遍历过程中输出访问过的结点序号。

对给定图进行邻接表表示,并利用队列和栈实现广度优先遍历和深度优先遍历的Python代码实现。同时,程序还支持从键盘输入初始出发的顶点序号,并在遍历过程中输出访问过的结点序号

from collections import defaultdict, deque

class Graph:
    def __init__(self, vertices):
        self.graph = defaultdict(list)
        self.vertices = vertices

    def add_edge(self, u, v):
        self.graph[u].append(v)

    def print_graph(self):
        for vertex in self.graph:
            print(vertex, "->", " -> ".join(str(i) for i in self.graph[vertex]))

    def bfs(self, start_vertex):
        visited = [False] * self.vertices
        queue = deque()

        visited[start_vertex] = True
        queue.append(start_vertex)

        while queue:
            start_vertex = queue.popleft()
            print(start_vertex, end=" ")

            for vertex in self.graph[start_vertex]:
                if not visited[vertex]:
                    visited[vertex] = True
                    queue.append(vertex)

    def dfs(self, start_vertex):
        visited = [False] * self.vertices
        stack = []

        visited[start_vertex] = True
        stack.append(start_vertex)

        while stack:
            start_vertex = stack.pop()
            print(start_vertex, end=" ")

            for vertex in self.graph[start_vertex]:
                if not visited[vertex]:
                    visited[vertex] = True
                    stack.append(vertex)

    def traverse(self):
        start_vertex = int(input("Enter the starting vertex: "))
        print("BFS traversal: ")
        self.bfs(start_vertex)
        print("\nDFS traversal: ")
        self.dfs(start_vertex)


# Create a sample graph
g = Graph(5)
g.add_edge(0, 1)
g.add_edge(0, 4)
g.add_edge(1, 2)
g.add_edge(1, 3)
g.add_edge(1, 4)
g.add_edge(2, 3)
g.add_edge(3, 4)

# Print the graph
g.print_graph()

# Traverse the graph
g.traverse()


输出

0 -> 1 -> 4
1 -> 2 -> 3 -> 4
2 -> 3
3 -> 4
Enter the starting vertex: 0
BFS traversal: 
0 1 4 2 3 
DFS traversal: 
0 4 1 3 2 


该回答引用ChatGPT
建立邻接表

邻接表是表示图的一种常用数据结构,它用链表存储每个顶点的所有邻接点,因此对于一个有n个顶点,m条边的无向图来说,邻接表需要存储n个链表,每个链表的长度为其对应的顶点的度数(即相邻的节点数),因此邻接表的空间复杂度为O(n+m)。

广度优先遍历

广度优先遍历是一种基于队列实现的遍历算法,从起点开始,先遍历所有与起点相邻的节点,再依次遍历与这些节点相邻的节点,直到遍历完所有节点。

深度优先遍历

深度优先遍历是一种基于栈实现的遍历算法,从起点开始,先遍历一个相邻节点,再遍历这个相邻节点的一个相邻节点,直到访问到无法再往下遍历的节点,然后回溯到上一个节点继续遍历相邻节点。