📜  数据结构 |图 |问题 8(1)

📅  最后修改于: 2023-12-03 15:10:19.563000             🧑  作者: Mango

数据结构 | 图 | 问题 8

简介

在计算机科学中,图是一种由节点(或称顶点)和边组成的数据结构。图论是研究图的性质和算法的学科,是计算机科学中的一个重要分支。问题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即判断两个顶点之间是否存在路径,可以使用深度优先搜索或广度优先搜索实现。从代码实现可知,使用邻接表表示图可以减少空间复杂度。