数据结构--图的基本操作
发布人: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]
上述代码提供了图的基本操作,包括创建图、插入顶点和边、删除顶点和边、遍历图等。

