关于Dijkstra算法两种可视化形式及转换方法的技术问询
Dijkstra算法的两种可视化形式:区别与转换
为什么会有两种可视化形式?
这两种形式本质是图的两种存储实现方式:
- 节点互联形式对应邻接表:用对象(比如代码里的
Node类)表示每个节点,每个节点维护邻接节点与边权的映射,适合存储稀疏图(边数远少于节点数的图),空间利用率更高,遍历相邻节点时更高效。 - 二维数组形式对应邻接矩阵:用二维数组
graph[i][j]直接存储节点i到节点j的边权(0表示无直接连通的边),适合存储稠密图(边数接近节点数的平方),查询两个节点是否直接相连的速度更快。
如何把二维数组(邻接矩阵)具象为互联节点?
完全可以,核心是理解邻接矩阵中每个元素的含义:
对于你给出的二维数组:
int graph[][] = new int[][] { {0, 4, 0, 0, 7}, {4, 0, 1, 2, 0}, {0, 1, 0, 6, 0}, {0, 2, 6, 0, 0}, {7, 0, 0, 0, 0} };
把数组索引当作节点编号(0-4),逐个解析节点的邻接关系:
- 节点0:
graph[0][1]=4表示和节点1相连,边权4;graph[0][4]=7表示和节点4相连,边权7;其余0表示无直接连接 - 节点1:
graph[1][0]=4连接节点0(边权4);graph[1][2]=1连接节点2(边权1);graph[1][3]=2连接节点3(边权2) - 节点2:
graph[2][1]=1连接节点1;graph[2][3]=6连接节点3 - 节点3:
graph[3][1]=2连接节点1;graph[3][2]=6连接节点2 - 节点4:
graph[4][0]=7连接节点0
这些关系对应到Node类的结构,就是每个Node实例的adjacentNodes哈希表中,存入对应的邻接节点和边权。
如果要写代码实现转换,大致逻辑是:
- 先创建所有节点实例,用数组或列表存储
- 遍历邻接矩阵的每个元素
graph[i][j],如果值不为0,就把节点j添加到节点i的adjacentNodes中,边权为graph[i][j]
解题思路的规划建议
- 如果题目给出邻接矩阵,先把它转成你熟悉的节点互联结构(或直接在脑中映射出节点间的连接关系),再套用Dijkstra算法的核心逻辑:维护距离数组、每次选未访问的最短距离节点、更新邻接节点距离
- 两种存储形式只是实现细节不同,Dijkstra算法的核心逻辑(找最短路径)完全一致,不用纠结形式,重点是理解算法本身的步骤
内容的提问来源于stack exchange,提问作者Night Rider
相关产品推荐
相关产品推荐

