Floyd最短路径算法时求各顶点之间的最短路径
算法采用邻接矩阵
设立dist、path数组
弗洛伊德算法也是动态规划算法的一种,一开始不允许有中转点,第一轮加入一个中转点,第二轮加入两个中转点(加上第一轮),以此类推进行n-1轮(n为顶点数)
允许计算带有负权值的图,不允许计算带有负权值回路的图
时间复杂度O(n^3)
空间复杂度O(n^2)
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (A[i][j] > A[i][k] + A[k][j]) {
A[i][j] = A[i][k] + A[k][j];
path[i][j] = k;
}
}
}
}
Dijkstra最短路径算法是求单源最短路径的算法,且不能求解带有负权值的有向图
采用三个数组
一个标记顶点,真或假
dist数组:从本顶点到某顶点所需的最短路径,每一轮后需要更新False顶点的dist和path信息,直到所有顶点都为True
path数组:该数组用于表明最短路径上顶点的前驱结点
时间复杂度O(n^2)
BFS广度优先算法求解单源最短路径问题(无权图)
prim算法:每次从一个顶点开始构建生成树,每次将可以连接生成树的代价最小新结点纳入生成树
最小生成树有n-1条边
适用于边稠密图的最小生成树
时间复杂度O(n^2)
Kruskal算法
每次选择权值最小的边,如果未连通就连通,直到所有结点都已连通
时间复杂度O(Elog2E)
适用于边稀疏而顶点较多的图