Python实现图(Graph)算法

2023-04-11 00:00:00 python graph 算法

Python实现图(Graph)算法,可以使用邻接矩阵或邻接表来表示图数据。

邻接矩阵是一个二维数组,第i行第j列表示第i个节点和第j个节点是否相邻。邻接矩阵的缺点是浪费空间,当节点数量很大时,矩阵会变得非常大。

邻接表是一种链表结构,每个节点都有一个链表存储其相邻节点的信息。邻接表的优点是占用空间较小,但是在遍历图时需要花费更多时间。

下面给出一个使用邻接矩阵实现的有向图的类示例:

class Graph:
    def __init__(self, vertices):
        self.vertices = vertices
        self.graph = [[0] * vertices for i in range(vertices)]

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

    def dfs(self, node):
        visited = [False] * self.vertices
        self.dfs_util(node, visited)

    def dfs_util(self, node, visited):
        visited[node] = True
        print(node, end=" ")

        for i in range(self.vertices):
            if self.graph[node][i] == 1 and not visited[i]:
                self.dfs_util(i, visited)

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

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

        while queue:
            node = queue.pop(0)
            print(node, end=" ")

            for i in range(self.vertices):
                if self.graph[node][i] == 1 and not visited[i]:
                    visited[i] = True
                    queue.append(i)


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("Depth First Traversal")
g.dfs(0)

print("\nBreadth First Traversal")
g.bfs(0)

运行结果为:

Depth First Traversal
0 1 2 3 4 
Breadth First Traversal
0 1 4 2 3

该示例中,我们创建了一个具有5个节点的有向图,并添加了7条边。然后,我们使用深度优先搜索和广度优先搜索遍历了该图,并输出结果。

相关文章