坐地铁换乘时,你有没有想过后台系统是怎么快速算出从A站到B站的最佳路线?其实背后离不开一种叫“图”的数据结构,而其中一种常见的实现方式就是邻接矩阵。
什么是图的邻接矩阵?
可以把城市里的地铁线路想象成一张图。每个站点是一个点(也叫顶点),两个站点之间如果有直达线路,就有一条边相连。邻接矩阵就是一个二维数组,用来记录这些点之间是否连通。
比如一个简单的三站地铁线:A → B → C。我们可以用一个 3×3 的表格来表示:
A B C
A 0 1 0
B 1 0 1
C 0 1 0
这里的 1 表示两个站之间有直达线路,0 表示没有。注意这个表是对称的,因为地铁通常是双向通行的。
加权情况怎么处理?
现实中我们不光关心能不能到,还关心花多久。这时候邻接矩阵可以存权重,比如两站之间的行驶时间。
还是刚才的例子,如果A到B要5分钟,B到C要8分钟,那矩阵可以变成:
A B C
A 0 5 0
B 5 0 8
C 0 8 0
没直达的线路用0或无穷大表示,系统在计算最短路径时就能避开绕远路的方案。
代码长啥样?
下面是一个简单的 Python 实现,用来表示五个站点之间的连接关系:
# 初始化一个5x5的邻接矩阵
n = 5
adj_matrix = [[0] * n for _ in range(n)]
# 假设站点编号0~4,0和1之间有线路,1和3之间也有
adj_matrix[0][1] = 1
adj_matrix[1][0] = 1 # 双向
adj_matrix[1][3] = 1
adj_matrix[3][1] = 1 # 双向
# 打印看看
for row in adj_matrix:
print(row)
运行结果会显示每一站和其他站的连接状态。这种结构查两个站是否直达特别快,直接看对应位置是不是0就行。
实际应用中的取舍
邻接矩阵的优点是查询速度快,适合站点数量不多的城市轨道交通系统。但如果城市特别大,比如上百个站,矩阵就会变得很稀疏——大部分是0,浪费存储空间。这时候可能会换成别的结构,比如邻接表。
不过对于大多数出行类App来说,用邻接矩阵做小范围路线推演还是很实用的,尤其是结合Dijkstra算法找最短路径时,逻辑清晰又容易调试。
下次你在手机上看公交换乘方案,不妨想想背后可能正有一张看不见的矩阵在默默运算。