有向图的邻接矩阵画法
时间: 2024-12-30 13:35:30 浏览: 26
### 有向图的邻接矩阵表示方法
对于有向图而言,其邻接矩阵是一个方阵 \(A\) ,其中元素 \(a_{ij}\) 表示从节点 \(i\) 到节点 \(j\) 是否存在一条边。如果存在,则 \(a_{ij} = 1\);否则 \(a_{ij} = 0\) 。这种表示方式能够清晰地展示各个顶点之间的连接关系[^1]。
为了更好地理解这一概念,下面通过具体例子来说明如何构建并绘制基于给定数据结构的有向图:
假设有一个简单的有向图 G=(V,E),其中 V={v₁,v₂,...,vn}, E={(vi,vj)}。现在要根据这些信息建立对应的邻接矩阵 A 并将其可视化出来。
#### 构建过程如下所示:
1. 初始化 n×n 的零矩阵作为初始状态下的邻接表;
2. 对于每一对 (u,v) ∈E,在位置 u 和 v 处设置值为 1 即可完成转换操作。
```python
import numpy as np
from matplotlib import pyplot as plt
import networkx as nx
def draw_directed_graph(adj_matrix):
"""
绘制有向图
参数:
adj_matrix : list[list[int]]
图的邻接矩阵
返回:
None
"""
# 创建 NetworkX DiGraph 对象
DG = nx.DiGraph()
num_nodes = len(adj_matrix)
# 添加节点
for i in range(num_nodes):
DG.add_node(i)
# 根据邻接矩阵添加边
for i in range(num_nodes):
for j in range(num_nodes):
if adj_matrix[i][j]:
DG.add_edge(i, j)
pos = nx.spring_layout(DG)
edge_labels = {(i,j):'{}'.format(adj_matrix[i][j]) for i in range(len(adj_matrix)) for j in range(len(adj_matrix[i])) if adj_matrix[i][j]}
# 绘制图形
nx.draw_networkx_edges(DG,pos,width=2,alpha=0.5,edge_color='b')
nx.draw_networkx_nodes(DG,pos,node_size=700)
nx.draw_networkx_labels(DG,pos,font_size=20,font_family="sans-serif")
nx.draw_networkx_edge_labels(DG,pos,edge_labels=edge_labels,label_pos=0.3)
ax = plt.gca()
ax.margins(0.20)
plt.axis("off")
plt.show()
if __name__ == "__main__":
# 定义一个简单有向图的邻接矩阵
directed_adjacency_matrix = [
[0, 1, 0],
[0, 0, 1],
[1, 0, 0]
]
draw_directed_graph(directed_adjacency_matrix)
```
此代码片段展示了怎样利用 Python 中 `networkx` 库以及 Matplotlib 来实现上述理论描述的过程,并最终得到直观可视化的结果。注意这里采用的是 spring layout 布局算法来进行绘图布局调整[^2]。
阅读全文