图的邻接矩阵实现:出行路线规划中的小秘密

坐地铁换乘时,你有没有想过后台系统是怎么快速算出从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算法找最短路径时,逻辑清晰又容易调试。

下次你在手机上看公交换乘方案,不妨想想背后可能正有一张看不见的矩阵在默默运算。