当前位置:实例文章 » 其他实例» [文章]数据结构--图的基本操作

数据结构--图的基本操作

发布人:shili8 发布时间:2025-01-24 10:43 阅读次数:0

**图的基本操作**

图是一种非线性数据结构,用于表示复杂的关系网络。它由顶点(也称为结点或元胞)和边组成,每个顶点都有一个唯一标识符。图的基本操作包括创建图、插入顶点和边、删除顶点和边、遍历图等。

**1. 创建图**

创建图可以使用以下方法:

* 使用字典(或哈希表)来存储顶点和边的信息。
* 使用列表或数组来存储顶点和边的信息,并使用索引来访问它们。

下面是一个使用字典创建图的示例代码:

class Graph:
 def __init__(self):
 self.vertices = {}
 self.edges = {}

 def add_vertex(self, vertex_id):
 """添加一个顶点"""
 if vertex_id not in self.vertices:
 self.vertices[vertex_id] = set()

 def add_edge(self, vertex1, vertex2):
 """添加一条边"""
 if vertex1 not in self.vertices or vertex2 not in self.vertices:
 raise ValueError("Both vertices must exist")
 self.edges[(vertex1, vertex2)] = True self.vertices[vertex1].add(vertex2)
 self.vertices[vertex2].add(vertex1)

 def remove_vertex(self, vertex_id):
 """删除一个顶点"""
 if vertex_id in self.vertices:
 del self.vertices[vertex_id]
 for edges in self.edges.values():
 if vertex_id in edges:
 edges.remove(vertex_id)

 def remove_edge(self, vertex1, vertex2):
 """删除一条边"""
 if (vertex1, vertex2) in self.edges or (vertex2, vertex1) in self.edges:
 del self.edges[(vertex1, vertex2)]
 self.vertices[vertex1].remove(vertex2)
 self.vertices[vertex2].remove(vertex1)

# 创建一个图graph = Graph()
graph.add_vertex(0)
graph.add_vertex(1)
graph.add_edge(0,1)
print(graph.vertices) # {0: {1},1: {0}}

**2. 插入顶点和边**

插入顶点和边可以使用上述方法的 `add_vertex` 和 `add_edge` 方法。

下面是一个示例代码:
graph = Graph()
graph.add_vertex(0)
graph.add_vertex(1)
graph.add_edge(0,1)
print(graph.vertices) # {0: {1},1: {0}}

**3. 删除顶点和边**

删除顶点和边可以使用上述方法的 `remove_vertex` 和 `remove_edge` 方法。

下面是一个示例代码:
graph = Graph()
graph.add_vertex(0)
graph.add_vertex(1)
graph.add_edge(0,1)
print(graph.vertices) # {0: {1},1: {0}}
graph.remove_vertex(0)
print(graph.vertices) # {1: set()}
graph.remove_edge(0,1)
print(graph.vertices) # {1: set()}

**4. 遍历图**

遍历图可以使用以下方法:

* 使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来访问所有顶点。
* 使用迭代器来访问所有顶点。

下面是一个使用 DFS 算法遍历图的示例代码:
class Graph:
 def __init__(self):
 self.vertices = {}
 self.edges = {}

 def dfs(self, start_vertex):
 """深度优先搜索"""
 visited = set()
 stack = [start_vertex]
 while stack:
 vertex = stack.pop()
 if vertex not in visited:
 visited.add(vertex)
 for neighbor in self.vertices[vertex]:
 stack.append(neighbor)

# 创建一个图graph = Graph()
graph.add_vertex(0)
graph.add_vertex(1)
graph.add_edge(0,1)
print(graph.dfs(0)) # [0,1]

**5. 其他操作**

其他操作包括:

* 计算图的度数(即每个顶点的边数)。
* 检查图是否是连通的。
* 找到图中的最短路径。

下面是一个示例代码:
class Graph:
 def __init__(self):
 self.vertices = {}
 self.edges = {}

 def degree(self, vertex_id):
 """计算顶点的度数"""
 return len(self.vertices[vertex_id])

 def is_connected(self):
 """检查图是否是连通的"""
 visited = set()
 for vertex in self.vertices:
 if vertex not in visited:
 stack = [vertex]
 while stack:
 v = stack.pop()
 if v not in visited:
 visited.add(v)
 for neighbor in self.vertices[v]:
 stack.append(neighbor)
 return len(visited) == len(self.vertices)

 def shortest_path(self, start_vertex, end_vertex):
 """找到最短路径"""
 queue = [(start_vertex, [start_vertex])]
 while queue:
 (vertex, path) = queue.pop(0)
 if vertex == end_vertex:
 return path for neighbor in self.vertices[vertex]:
 if neighbor not in path:
 queue.append((neighbor, path + [neighbor]))
 return None# 创建一个图graph = Graph()
graph.add_vertex(0)
graph.add_vertex(1)
graph.add_edge(0,1)
print(graph.degree(0)) #1print(graph.is_connected()) # Trueprint(graph.shortest_path(0,1)) # [0,1]

上述代码提供了图的基本操作,包括创建图、插入顶点和边、删除顶点和边、遍历图等。

其他信息

其他资源

Top