在学完这四种算法后,感觉有点乱,现在查阅资料和借鉴_(*^▽^*)_后理清了。
克鲁斯卡尔算法:
目的:找到全图最小权值和路径
方法:以边的角度看待问题,在一个图里,找到最小的边长,并且不允许出现有回路的情况。最终形成的图就是把各个节点连接起来的最小值。
普里姆算法:
目的:找到全图最小权值和路径
方法:以某个点开始,以点的角度看待问题,在一个图里,假设从A点开始,找到离A点最近的B点;找到离B点最近的C点,直到把一个图的所有点串起来。
上面这两个因为目的相同可以归为一类。
下面这两个因为只是到所有点到最短路径的源点考虑数量的区别可以归为一类。
迪杰斯特拉算法:
目的:找到单源点到图中所有点的最短路径(就是在这条路上,A点到B点,A点到C点,A点到D点都是A点到对应的点的最短距离。
方法:以单源点A点开始,并选定一个数组,先确定未遍历前的初始距离,把距离最短的邻接结点B点选定为中间结点,并标记访问过,开始往下遍历,挨个访问B点的邻接结点C、D....点。计算出A点到B点+B点到C、D...点的距离,作为新距离,对比新距离和旧距离(A到C、D...点的直接距离),如果新距离大,则把新距离替换掉旧距离,否则不变。一轮访问结束后,从未标记的结点中选定距离最短的,把它作为中间结点,继续往下访问。若都标记过,则算法结束。
弗洛伊德算法:
目的:找到多源点到图中所有点的最短路径(就是这条路上任意两点之间都是最短的)
方法:不断找点进行中转,比较中转前后的最小距离。弗洛伊德算法定义了两个二维矩阵:
D矩阵存放最小权(最短路径),P矩阵存放最短前驱(中转点)
1、矩阵D记录顶点间的最小路径
例如D[1][2]= 3,说明顶点1 到 2 的最短路径为3;
2、矩阵P记录顶点间最小路径中的中转点
例如P[1][2]= 0 说明,1 到 2的最短路径轨迹为:1 -> 0 -> 2。
它通过3重循环,medium为中转点,begin为起点,end为终点,循环比较D[begin][end] 和 D[begin][medium] + D[medium][end] 之间的最小值,如果(D[begin][medium] + D[medium][end] )为更小值,则把(D[begin][medium] + D[medium][end] )覆盖保存在(D[begin][end])中。