对迪杰斯特拉的理解:
迪杰斯塔拉算法可以找到单源点到其他结点的最短路径。做法是先找到一条最短的路径,再用该路径去更新当前保存的到每个结点的路径值;再找到一条次短路径,用该路径再去更新......直到计算出到所有路径的距离。
迪杰斯塔拉算法要求路径权值非负:
解释1:
Dijkstra算法当中将节点分为已求得最短路径的集合(记为S)和未确定最短路径的个集合(记为U),归入S集合的节点的最短路径及其长度不再变更,如果边上的权值允许为负值,那么有可能出现当与S内某点(记为a)以负边相连的点(记为b)确定其最短路径时,它的最短路径长度加上这条负边的权值结果小于a原先确定的最短路径长度,而此时a在Dijkstra算法下是无法更新的,由此便可能得不到正确的结果。求带负权值边的单源最短路径可以用贝尔曼-福特算法。
解释2(举例子):
因为dijkstra算法在计算最短路径时,不会因为负边的出现而更新已经计算过的顶点的路径长度,这样一来,在存在负边的图中,就可能有某些顶点最终计算出的路径长度不是最短的长度。
考虑有三个顶点,三条边:(1,2,1),(1,3,2),(2,3,-3),最终计算出的路径长度是(1,2,最短路径为1),(1,3,最短路径为-2),但明显存在(1,2,最短路径-1)这条更短的路径。