实验1图的基本操作 创建一个有向图,实现邻接矩阵存储,创建图对象并实现以下 (1)创建该图(2)计算图中顶点的总数和弧的总数。 (3)计算每一个顶点的入度、出度和度。 (4)添加一条弧< D , C >。 (5)获取顶点 D 邻接到的第一个顶点,并将其值输出。
时间: 2024-02-12 21:09:29 浏览: 58
邻接表存储的有向图的基本操作(C语言实现)
好的,我会根据您的要求来回答您的问题。
1. 创建有向图并使用邻接矩阵存储:
假设我们要创建以下这个有向图,其中顶点为 A、B、C、D、E,弧为 <A, B>、<B, C>、<C, D>、<D, E>、<E, A>:
```
A -> B -> C
^ |
| v
E <- D <- |
```
我们可以使用邻接矩阵来存储该图,邻接矩阵的定义如下:
- 对于无向图,邻接矩阵是一个对称矩阵,对角线上的元素表示该顶点的度数,非对角线上的元素表示该顶点与另一个顶点是否有边相连。
- 对于有向图,邻接矩阵是一个非对称矩阵,矩阵中的元素 a[i][j] 表示从顶点 i 到顶点 j 是否有边相连。
那么我们可以定义一个邻接矩阵类来存储有向图:
```python
class AdjacencyMatrix:
def __init__(self, vertex_list):
# 顶点列表
self.vertex_list = vertex_list
# 邻接矩阵
self.matrix = [[0] * len(vertex_list) for _ in range(len(vertex_list))]
def add_edge(self, from_vertex, to_vertex):
# 添加一条边
from_index = self.vertex_list.index(from_vertex)
to_index = self.vertex_list.index(to_vertex)
self.matrix[from_index][to_index] = 1
def __str__(self):
# 打印邻接矩阵
s = '\t' + '\t'.join(self.vertex_list) + '\n'
for i in range(len(self.matrix)):
s += self.vertex_list[i] + '\t' + '\t'.join(map(str, self.matrix[i])) + '\n'
return s
```
2. 计算图中顶点的总数和弧的总数:
我们可以直接使用邻接矩阵中的矩阵维度来计算顶点的总数,即 len(vertex_list)。而弧的总数则需要遍历邻接矩阵来计算,即所有非零元素的个数。
```python
def get_vertex_count(adj_matrix):
# 计算顶点的总数
return len(adj_matrix.vertex_list)
def get_arc_count(adj_matrix):
# 计算边的总数
count = 0
for i in range(len(adj_matrix.matrix)):
for j in range(len(adj_matrix.matrix[i])):
if adj_matrix.matrix[i][j] != 0:
count += 1
return count
```
3. 计算每一个顶点的入度、出度和度:
对于有向图,可以分别计算每个顶点的入度和出度来得到该顶点的度。入度表示有多少条边以该顶点为终点,出度表示有多少条边以该顶点为起点。
```python
def get_in_degree(adj_matrix, vertex):
# 计算入度
index = adj_matrix.vertex_list.index(vertex)
count = 0
for i in range(len(adj_matrix.matrix)):
if adj_matrix.matrix[i][index] != 0:
count += 1
return count
def get_out_degree(adj_matrix, vertex):
# 计算出度
index = adj_matrix.vertex_list.index(vertex)
count = 0
for j in range(len(adj_matrix.matrix[index])):
if adj_matrix.matrix[index][j] != 0:
count += 1
return count
def get_degree(adj_matrix, vertex):
# 计算度
return get_in_degree(adj_matrix, vertex) + get_out_degree(adj_matrix, vertex)
```
4. 添加一条弧 <D, C>:
可以使用邻接矩阵中的 add_edge 方法来添加一条边。
```python
adj_matrix.add_edge('D', 'C')
```
5. 获取顶点 D 邻接到的第一个顶点,并将其值输出:
可以使用邻接矩阵中的 matrix 属性来获取顶点 D 的邻接矩阵行,然后遍历该行找到第一个非零元素对应的顶点。
```python
def get_first_adjacent_vertex(adj_matrix, vertex):
# 获取第一个邻接点
index = adj_matrix.vertex_list.index(vertex)
for j in range(len(adj_matrix.matrix[index])):
if adj_matrix.matrix[index][j] != 0:
return adj_matrix.vertex_list[j]
print(get_first_adjacent_vertex(adj_matrix, 'D')) # 输出 'E'
```
完整代码如下:
阅读全文