邻接矩阵

邻接矩阵

1
1
1
1
    

1. 数组(邻接矩阵)表示法

  • 建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)
    • 设图A=(V,E)有n个顶点,则
      在这里插入图片描述
    • 图的邻接矩阵是一个二位数组A.arcs[n][n],定义为:
      在这里插入图片描述

无向图的邻接矩阵表示法

在这里插入图片描述
分析1:无向图的邻接矩阵是对称的;
分析2:顶点i的=第i行(列)中1的个数;
特别:完全图的邻接矩阵中,对角元素为0,其余1。

有向图的邻接矩阵表示法

在这里插入图片描述
注:在有向图的邻接矩阵中,
第i行含义:以结点vi为尾的弧(即出度边);
第i列含义:以结点vi为头的弧(即入度边)。
分析1:有向图的邻接矩阵可能是不对称的;
分析2:顶点的出度 = 第 i 行元素之和
             顶点的入度 = 第 i 列元素之和
             顶点的度 = 第 i 行元素之和 + 第 i 列元素之和

有权图(网)的邻接矩阵表示法

在这里插入图片描述
在这里插入图片描述

邻接矩阵的存储表示

两个数组分别存储顶点表邻接矩阵

#define Maxlnt 32767     //表示极大值,即 ∞ 
#define MVNum 100        //最大顶点数 
typedef char VerTexType; //设顶点的数据类型为字符型 
typedef int ArcType;     //假设边的权值类型为整型 

typedef struct{
	VerTexType vexs[MVNum];      //顶点表 
	ArcType arcs[MVNum][MVNum];  //邻接矩阵
	int vexnum,arcnum;           //图的当前点数和边数 
}AMGraph; //Adjacency Matrix Graph 

2.采用邻接矩阵表示法创建无向网

在这里插入图片描述
【算法思想】
(1)输入总顶点数和总边数
(2)依次输入点的信息存入顶点表中。
(3)初始化邻接矩阵,使每个权值初始化为极大值。
(4)构造邻接矩阵

在这里插入图片描述

  • 邻接矩阵——有什么好处?
    • 直观、简单、好理解
    • 方便检查任意一对顶点间是否存在边
    • 方便找任一顶点的所有“邻接点”(有边直接相连的顶点)
    • 方便计算任一顶点的“度”(从该点发出的边数为“出度”,指向该点的边数为“入度”)
      • 无向图:对应行(或列)非0元素的个数;
      • 有向图:对应行非0元素的个数是“出度”;
        对应列非0元素的个数是“入度”。
  • 邻接矩阵——有什么不好?
    • 不便于增加和删除顶点
    • 浪费空间——存稀疏图(点很多而边很少)有大量无效元素
      • 对稠密图(特别是完成图)还是很合算的
    • 浪费时间——统计稀疏图中一共有多少条边
### 有向图的邻接矩阵表示方法 对于有向图而言,其邻接矩阵是一个方阵 \(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]。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值