📅  最后修改于: 2023-12-03 15:37:16.891000             🧑  作者: Mango
在图论中,图是由节点(顶点)和边(连接节点的线)组成的数据结构。在实际应用中,我们可能需要对图进行一些操作,比如遍历、搜索、判断连通性等等。除了基本的图结构,还有一些补充内容可以提高我们在图上操作的效率和灵活性。
在图中,有以下两种常用的表示方法:
邻接矩阵是一个二维数组,数组的行和列分别代表图中的节点,数组中的值表示两个节点之间的边的权值。如果节点 i 和节点 j 之间没有边相连,则矩阵中的值为 0。
邻接矩阵示例:
[[0, 1, 1],
[1, 0, 0],
[1, 0, 0]]
该示例表示一个有三个节点的图,节点 1 和节点 2、节点 1 和节点 3、节点 3 和节点 1 之间相连。如果该图是有向图,则邻接矩阵不一定是对称的。
邻接表是一个列表,列表中的每个元素代表一个节点,元素的值为一个由该节点连向的所有节点组成的列表。如果该节点没有连向其它节点,则列表为空。
邻接表示例:
{1: [2, 3],
2: [],
3: [1]}
该示例表示一个有三个节点的图,节点 1 连向节点 2 和节点 3,节点 2 不连向任何节点,节点 3 连向节点 1。
图的遍历指的是从图中的一个节点出发,按照一定的规则遍历图中的所有节点。常用的两种遍历算法是深度优先搜索(DFS)和广度优先搜索(BFS)。
深度优先搜索从一个起点开始,遍历该起点所有可以到达的节点,并标记已经访问的节点。然后以该节点为起点,再次进行 DFS。重复该过程,直到遍历完所有可以到达的节点。
DFS 伪代码:
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
for next_node in graph[start] - visited:
dfs(graph, next_node, visited)
return visited
广度优先搜索从一个起点开始,遍历该起点所有可以到达的节点,并按照搜索顺序依次访问这些节点。然后以这些节点为起点,再访问它们的可到达节点。重复该过程,直到遍历完所有可以到达的节点。
BFS 伪代码:
def bfs(graph, start):
visited, queue = set(), [start]
while queue:
vertex = queue.pop(0)
if vertex not in visited:
visited.add(vertex)
queue.extend(graph[vertex] - visited)
return visited
用图论的语言来说,连通性指的是一个图中任意两个节点都可以通过若干条边到达的性质。
在一个有向或无向图中,若图中任意两个节点是可达的,则该图为一个连通图。图中不连通的部分称为连通分量。
在一个有向图中,若从图中任意一个节点出发可以到达任意一个节点,则该图为一个强连通图。否则,该图为一个弱连通图。
在图中,路径是由一系列节点构成,用边连接。如果一条路径上的所有边的权值之和最小,那么该路径就是最短路径。
Dijkstra 算法用于求带权有向图中某一节点到其它所有节点的最短路径。
Dijkstra 伪代码:
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph} # 记录到每个节点的距离,初始化为正无穷
distances[start] = 0 # 到起点的距离为 0
queue = [(distances[node], node) for node in graph] # 用来排序的队列,记录节点的距离
heapq.heapify(queue)
while queue:
(distance, current_node) = heapq.heappop(queue)
if distance > distances[current_node]:
continue
for neighbor, weight in graph[current_node].items():
new_distance = distance + weight
if new_distance < distances[neighbor]:
distances[neighbor] = new_distance
heapq.heappush(queue, (new_distance, neighbor))
return distances
以上是图的一些补充内容,图是一个广泛应用于算法和数据结构中的概念,深入理解图的基本概念和相关算法,能够帮助程序员解决实际问题,提高编程技能水平。