来自pintia上的一道选择题
试利用Floyed算法,求下图所示有向图的各对顶点之间的最短路径。下列选项哪个给出了正确的最短路径长度矩阵和最短路径矩阵?
答案A和答案D在第二矩阵中,数据类型不一致,排除此答案 ,接下来我们来对比一下答案B和答案C,经过计算得知存在D到A和D到B的最短路径,所以排除答案B,正确答案为C
floyeed算法为求图中任意两个顶点之间的最短路径的算法,每次加入一个顶点看是否有最短路径
根据题意,初始状态为
A | B | C | D | A | B | C | D | ||
A | 0 | 3 | 4 | 2 | A | -1 | -1 | -1 | -1 |
B | 8 | 0 | ∞ | ∞ | B | -1 | -1 | ||
C | 6 | 2 | 0 | ∞ | C | -1 | -1 | -1 | |
D | ∞ | ∞ | 3 | 0 | D | -1 | -1 |
现在加入顶点A,产生了三条最短路径,B可以经过A到达C,B可以经过A到达D,C可以经过A到达D
A | B | C | D | A | B | C | D | ||
A | 0 | 3 | 4 | 2 | A | -1 | -1 | -1 | -1 |
B | 8 | 0 | 12 | 10 | B | -1 | -1 | BAC | BAD |
C | 6 | 2 | 0 | 8 | C | -1 | -1 | -1 | CAD |
D | ∞ | ∞ | 3 | 0 | D | -1 | -1 |
A | B | C | D | A | B | C | D | ||
A | 0 | 3 | 4 | 2 | A | -1 | -1 | -1 | -1 |
B | 8 | 0 | 12 | 10 | B | -1 | -1 | BAC | BAD |
C | 6 | 2 | 0 | 8 | C | -1 | -1 | -1 | CAD |
D | ∞ | ∞ | 3 | 0 | D | -1 | -1 |
现在加入B,最短路径没有变化
现在加入C,产生两条最短路径,D可以经过C到达A,到达B
A | B | C | D | A | B | C | D | ||
A | 0 | 3 | 4 | 2 | A | -1 | -1 | -1 | -1 |
B | 8 | 0 | 12 | 10 | B | -1 | -1 | BAC | BAD |
C | 6 | 2 | 0 | 8 | C | -1 | -1 | -1 | CAD |
D | 9 | 5 | 3 | 0 | D | DCA | DCB | -1 | -1 |
加入D,最短路径没有变化
A | B | C | D | A | B | C | D | ||
A | 0 | 3 | 4 | 2 | A | -1 | -1 | -1 | -1 |
B | 8 | 0 | 12 | 10 | B | -1 | -1 | BAC | BAD |
C | 6 | 2 | 0 | 8 | C | -1 | -1 | -1 | CAD |
D | 9 | 5 | 3 | 0 | D | DCA | DCB | -1 | -1 |
答案中的0表示加入顶点A以后,也就是在第一次加入顶点以后产生了最短路径,-1+1=0
D到A之间的最短路径是在第3次加入顶点以后产生的最短路径,-1+3=2
数字可以表示出加入哪个顶点以后产生的最短路径,比如0=-1+1 表示加入顶点A以后产生的最短路径,该最短路径是经过顶点A的
2=-1+3表示加入顶点C以后产生的最短路径,该最短路径是经过顶点C的