无向图生成与分析
前言
在计算机科学中,图是一种非常重要的数据结构,用于描述对象之间的关系。图由节点(顶点)和边组成,其中节点表示对象,边表示节点之间的关系。根据边的方向性,图可以分为有向图和无向图。本文将重点介绍无向图的生成与分析。
无向图的定义和表示
无向图是一种图形结构,其中的边没有方向性。在无向图中,节点之间的关系是相互的,可以双向移动。例如,在社交网络中,用户之间的关系可以用无向图来表示。
在Python中,我们可以使用字典和集合来表示无向图。字典用于存储节点和其相邻节点的信息,集合用于存储节点的集合。下面是一个示例:
graph = {
'A': {'B', 'C'},
'B': {'A', 'D'},
'C': {'A', 'D'},
'D': {'B', 'C'}
}
nodes = {'A', 'B', 'C', 'D'}
在上面的示例中,节点'A'和'B'相邻,节点'A'和'C'相邻,节点'B'和'D'相邻,节点'C'和'D'相邻。
无向图的生成方法
生成无向图的方法有很多种,下面介绍两种常用的方法:邻接矩阵和邻接表。
邻接矩阵
邻接矩阵是一个二维数组,用于表示节点之间的关系。矩阵的行数和列数分别等于节点的数量。如果两个节点相邻,则对应的矩阵元素为1;否则为0。
下面是一个使用邻接矩阵生成无向图的示例代码:
def generate_graph_with_adjacency_matrix(nodes, edges):
n = len(nodes)
graph = [[0] * n for _ in range(n)]
for edge in edges:
i, j = nodes.index(edge[0]), nodes.index(edge[1])
graph[i][j] = 1
graph[j][i] = 1
return graph
邻接表
邻接表是一种更加紧凑的表示方法,它使用字典来存储节点和其相邻节点的信息。字典的键是节点,值是与之相邻的节点的集合。
下面是一个使用邻接表生成无向图的示例代码:
def generate_graph_with_adjacency_list(nodes, edges):
graph = {}
for node in nodes:
graph[node] = set()
for edge in edges:
graph[edge[0]].add(edge[1])
graph[edge[1]].add(edge[0])
return graph
无向图的常用算法
通过生成无向图,我们可以进行各种图算法的分析。下面介绍一些常用的无向图算法。
深度优先搜索(DFS)
深度优先搜索是一种用于遍历图的算法。它从一个起始节点开始,沿着一条路径一直遍历到底,然后回溯到上一个节点,继续遍历其它路径,直到所有节点都被访问过。
下面是一个使用深度优先搜索遍历无向图的示例代码:
visited = set()
def dfs(graph, node):
if node not in visited:
print(node)
visited.add(node)
for neighbor in graph[node]:
dfs(graph, neighbor)
广度优先搜索(BFS)
广度优先搜索是一种用于遍历图的算法。它从一个起始节点开始,依次访问它的所有邻居节点,然后再依次访问它们的邻居节点,以此类推,直到所有节点都被访问过。
下面是一个使用广度优先搜索遍历无向图的示例代码:
from collections import deque
visited = set()
def bfs(graph, start):
queue = deque([start])
while queue:
node = queue.popleft()
if node not in visited:
print(node)
visited
标签:node,python,graph,edge,生成,无向,nodes,节点
From: https://blog.51cto.com/u_16175512/6848537