的路径长度,取其短者为当前求得的最短路径。对每一对顶点都做这样的试探,可求得矩阵D0。然后在D0的基础上,让路径通过v1,得到新的矩阵D1.以此类推,一般的,如果顶点vi到vj的路径经过顶点vk时的路径缩短,则修改Dk[i][j]=D(k-1)[i][k]+D(k-1)[k][j],所以D(k)[i][j]就是当前求得的从顶点vi到vj的最短路径,且其路径上的顶点,除了源点和终点外,序号都不大于k。这样经过n次试探,最后求得的矩阵D(n-1)就一定是各顶点间的最短路径。floydputpath 弗洛伊德算法floyd函数中用到的函数
矩形path是用来存储最短路径上的顶点信息的。矩阵path初始时都赋值为-1,表示vi到vj的最短路径是直接可达的,中间不需经过其他顶点。以后,当考虑路径经过某个顶点vk时,如果使路径更短,在修改D(k-1)[i][j]的同时修改path[i][j]为k,即path[i][j]中存放的是从vi到vj路径上所经过的某个顶点(若path[i][j]!=-1)。经过n次探查后,path[i][j]=k,即从vi到vj的最短路径经过顶点vk,该路径上还有哪些顶点呢,需要去查看path[i][j],以次类推,直到所查元素为-1为止。
prim 普里姆算法 最小生成树算法,比如要在n个城市间建立通信网,则连接n个城市需要n-1条线路,如何在最节省经费的情况下建立这个通信网?
基本思想:假设G=(V,E)是连通网,T=(U,TE)为欲构造的最小生成树
(1) 初始时令U={1}(即构造最小生成树时,从顶点1出发),TE=空
(2) 从所有u属于U,v属于V-U的边中,选取具有最小权值的边(u,v),将顶点v
加入集合U中,将(u,v)加入集合TE中。
(3) 重复(2),直到U=V为止。
AOV拓扑排序的算法:
(1):从Aov网中选择一个入度为0的顶点,并且输出它
(2):从Aov网中删去该顶点和该顶点发出的全部有向边。
(3):重复(1)和(2)知道找不到入度为0的顶点。
此时,若网中仍有定点没有输出,则说明AOV网中有环路。为实现拓扑排序算法,我们采用邻接链表作为AOV网的存储结构,在一维数组中增设一个入度域id,以存放各个顶点当前的入度值。算法中设置一个栈,用来存储入度为0的顶点。拓扑排序算法的步骤为:
(1)将id为0的顶点入栈。
(2)从栈中弹出栈顶元素并输出,并把该顶点发出的所有有向边删去,即把他的各个邻接顶点的入度减1.
(3)将新的id为0的顶点入栈。
(4)重复(2)(3),直到栈空为止。此时若输出的顶点数小于n,则输出“有回路”;否则拓扑排序正常结束。
从上面的步骤可以看出,栈在这里的作用只是起到一个保存当前入度为0的顶点,并使之处理有序。这种有序可以后进先出,也可以是先进先出,故此也可用队列来辅助实现。