最近在看算法概论,关于DAG的思考:
Q:为什么DAG需要按照拓扑排序的顺序来求最短路径?这样就可以保证正确性了?
1.我们得从dijkstra算法的分析中得出结论。
2.为什么dijkstra不能有负边?因为负边可能导致已经求出的最短路径dist(u)不正确(新发现的负边(v1,u)导致dist(u)可以更小)。
3.负边导致dist(u)更小的原因,是我们在确定dist(u)时,u的度并没有考虑完全(至少(v1,u)还没有考虑到)。
4.对DAG进行线性化(拓扑排序),然后按照顺序来更新dist(u),这样就可以避免已确定dist(u)继续被更改。因为每次考虑的u必满足入度为0,即所有可以到达它的边(包括负边(v1,u))都已经考虑到了。