Day58 - 图论 Part08

27 阅读2分钟

基础

刷题

  1. 软件构建

kamacoder.com/problempage…

image.png

记录一个标准思路,比自己写的要更加清晰,

主要是利用inDegree数组记录每一个节点的入度,每一次完成一个节点,就将节点被依赖的节点入度-1,并将入度为0的节点放入队列中。

这里使用邻接表,而不是邻接矩阵,是因为这是一个稀疏图,点多边少,每一次遍历不需要遍历所有节点到当前节点的边。

  1. 参加科学大会

kamacoder.com/problempage…

image.png

dijkstra算法 (迪杰斯特拉)三部曲:(和prim算法很像)

  • 找到离源节点最近的节点,且没有被访问过
  • 标记为访问过
  • 更新每个节点到达源节点的最短距离

总结

dijkstra算法 和 prim算法的区别

dijkstra算法是计算 每个节点到源节点的最短路径,从中找到最小的那一个去访问

prim算法是计算 每个节点到 最小生成树的最短路径,从中找到最小的那一个去访问

使用dijkstra算法 图中边的权值可以有负数吗?

不行,dijkstra 算法是计算 从源节点到 该节点的最短路径,一开始会找距离最短那一个,如果这个节点处于环中,且权值都是负数就错了。他会无限小。

使用 prim 算法 图中的边的权值可以有负数吗?

可以,因为prim算法,是计算节点距离生成树的最短距离,本质只会比较一个边,不会累加

如何输出 参加科学大会 这道题的路径

需要定义一个新的数组,记录每一个节点path = make([]int),记录从s车站到e车站。

当节点的minDist被更新,

image.png

如何debug dijkstra 算法

打印 minDist 数组