Dijkstra
Dijkstra可以得出两点之间的所有最短路径吗,网上找到的都是只有一条。。
@happylifelx: 你能把“所有最短路径”解释清楚吗?
@Launcher: 就是比如a到c有,a-b-c,还有a-d-c都是距离为2,这两条路径我想都获取,另外最好是适用于无向图的
@happylifelx: 你是不是就没认真学习过 Dijkstra 算法?你问的问题怎么那么别扭?
@Launcher: 我又看了一下算法,你给的这个链接他输出的是两点最短路径上的权重之和,如何能把最短路径上经过的顶点输出来吗
我说下个人见解,用Dijkstra算法,多用个结构数组记录点的父亲,我的c++实现:http://www.cnblogs.com/jiu0821/p/4338666.html
里面的fa可以定为一个向量vector,就可以记录所有最短路径了。算法懂了,相信java实现也容易。
因为是无权无向图,任意边的权值均为1,直接bfs就可以了,如果需要找出所以最短路径,搜到一个点时分三种情况处理:
1、之前没有达到这一点,则这次的一定是最短路,直接记录就可以了,并且继续扩展之后由这点达到的节点
2、之前达到过且路径长度与这次相等,则多记录一个前趋节点,不再扩展,因为“达到这点且长度为当前路径长度”这一状态已经在第一次达到(即情况1)时被扩展过了。
3、之前达到过且路径比这次短,则什么都不做。
因为是无权图广搜所以不可能出现当前路径短于之前记录的路径的情况。时间复杂度是BFS的O(n)(n=|V|),而dijkstra的时间复杂度是O(n^2),即使用堆优化也有O(nlogn)。