📅  最后修改于: 2023-12-03 15:10:19.563000             🧑  作者: Mango
在计算机科学中,图是一种由节点(或称顶点)和边组成的数据结构。图论是研究图的性质和算法的学科,是计算机科学中的一个重要分支。问题8是指在一个有向图中,给定两个顶点,判断它们之间是否存在路径。
图可以使用邻接矩阵表示或邻接表表示。
邻接矩阵是一个二维数组,其中行表示一个顶点,列表示与之相邻的顶点。如果两个顶点之间有边相连,则对应的元素为1,否则为0。
# 邻接矩阵实现
adj_matrix = [
[0, 1, 0, 0, 1],
[0, 0, 1, 0, 0],
[1, 1, 0, 1, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0]
]
邻接表是一种链式结构,其中每个节点表示一个顶点,其下一个节点表示与之相邻的顶点。
# 邻接表实现
class Node:
def __init__(self, val):
self.val = val
self.next = None
class AdjacencyList:
def __init__(self, V):
self.V = V
self.graph = [None]*V
def add_edge(self, u, v):
node = Node(v)
node.next = self.graph[u]
self.graph[u] = node
使用深度优先搜索(DFS)或广度优先搜索(BFS)可以判断是否存在路径。
深度优先搜索是一种递归的算法,具体实现可以使用栈或递归实现。对于每个节点,首先标记为已访问,然后遍历其相邻节点,如果相邻节点未被访问,则递归遍历该节点。
# 深度优先搜索实现(邻接表表示)
def dfs(node, visited, end):
if node == end:
return True
visited[node] = True
for neigh in adjacency_list.graph[node]:
if not visited[neigh]:
if dfs(neigh, visited, end):
return True
return False
广度优先搜索使用队列实现,对于每个节点,将其相邻节点加入队列中并标记为已访问,然后出队列并遍历其相邻节点,直到找到目标节点或队列为空。
# 广度优先搜索实现(邻接表表示)
def bfs(start, end):
visited = [False] * adjacency_list.V
queue = [start]
while queue:
node = queue.pop(0)
if node == end:
return True
visited[node] = True
for neigh in adjacency_list.graph[node]:
if not visited[neigh]:
queue.append(neigh)
return False
在计算机科学中,图是一种重要的数据结构,图论是其中一门重要的学科。问题8即判断两个顶点之间是否存在路径,可以使用深度优先搜索或广度优先搜索实现。从代码实现可知,使用邻接表表示图可以减少空间复杂度。