Floyd算法仍从图的带权邻接矩阵出发。算法的主要思想是:
首先定义原图的矩阵为D(-1) 。即:
D(-1)[i][j]
= G.arcs[i][j];
D(K)[i][j]
= Min{D(k-1)[i][j] , D(k-1)[i][k] + D(k-1)[k][j] }
package test09;
public class Floyd {
private int[][] adjMat;
private static final int INFINITY = ~(1<<31);
public Floyd(int size) {
adjMat = new int[size][size];
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
adjMat[i][j] = INFINITY;
}
void connect(int from, int to, int length) {
adjMat[from][to] = length;
}
void floyd() { //floyd算法
for(int y=0; y<adjMat.length; y++)
for(int x=0; x<adjMat.length; x++)
if(adjMat[y][x] != INFINITY)
for(int z=0; z<adjMat.length; z++)
if(adjMat[z][y] != INFINITY) {
int newLength = adjMat[z][y] + adjMat[y][x];
adjMat[z][x] = newLength < adjMat[z][x] ? newLength : adjMat[z][x];
}
}
int[][] getConnections() {
return adjMat;
}
public static void main(String[] args) {
Floyd w = new Floyd(3);
w.connect(0, 0, 0);
w.connect(0, 1, 4);
w.connect(0, 2, 11);
w.connect(1,0,6);
w.connect(1,1,0);
w.connect(1,2,2);
w.connect(2,0,3);
w.connect(2,2,0);
for(int[] a: w.getConnections()) {
for(int i: a) System.out.print((i == INFINITY? "INF" : i) + "\t");
System.out.println();
}
w.floyd();
System.out.println("==================");
for(int[] a: w.getConnections()) {
for(int i: a) System.out.print((i == INFINITY? "INF" : i) + "\t");
System.out.println();
}
}
}
执行结果为:
0 4 11
6 0 2
3 INF 0
==================
0 4 6
5 0 2
3 7 0
分享到:
相关推荐
Floyd-Warshall算法,又叫Floyd算法,用于求每对顶点之间最短路径
Floyd算法直接使用二维数组求出所有顶点到所有顶点的最短路径。 D代表顶点到顶点的最短路径权值和的矩阵。 P代表对应顶点的最小路径的前驱矩阵。 以下程序在DEV C++中调试运行通过。 #include <stdio> #define ...
虽然这个时间复杂度看起来较高,但对于小规模或稠密图,Floyd-Warshall算法仍然具有很高的效率,因为它能一次性找出所有顶点对之间的最短路径。 此外,Floyd-Warshall算法还有几个重要的性质和变种: 1. 负权边:...
这个算法的核心思想是通过动态规划的方式,逐步考虑图中的所有中间节点,来更新每一对顶点之间的最短路径。 **算法流程** Floyd算法的基本步骤如下: 1. 初始化:对于一个有n个顶点的图,创建一个n×n的矩阵D,...
Floyd算法,全称Floyd-Warshall算法,是一种解决图中所有顶点对之间最短路径问题的动态规划算法。由Robert W. Floyd在1962年提出,主要用于解决多点对多点之间的最短路径。它尤其适用于解决有向图或无向图中所有顶点...
- 算法的核心在于构建一个二维矩阵,通常称为距离矩阵,其中每个元素表示一对顶点之间的最短路径长度。初始时,距离矩阵的对角线元素为0,表示顶点到自身的路径长度为0;非对角线元素设为图的边权重,表示两个顶点...
Floyd算法基于动态规划,通过构建一个n×n的距离矩阵D来存储每对顶点之间的最短路径。初始时,矩阵的对角线元素为0,表示顶点到自身的距离为0;非对角线元素为图中对应边的权重,如果两个顶点之间没有直接的边,则...
Floyd算法是一种常用的最短路径算法,对于给定的有向图,可以求解出每一对顶点之间的最短路径。本文首先介绍了Floyd算法的基本思想,即通过不断增加顶点来寻找最短路径,并使用数组dk(i, j)和pk(i, j)来存储路径长度...
3. 遍历结束后,distance数组中的每个元素将存储对应顶点对之间的最短路径长度。 **Java实现** 在Java中,我们可以创建一个二维数组来表示距离矩阵,并使用三层循环来实现Floyd算法。以下是一个简单的Java代码示例...
Floyd算法,全称为Floyd-Warshall算法,是一种用于解决图论问题的著名算法,主要用来寻找有向图或无向图中所有顶点之间的最短路径。它由美国计算机科学家Robert W. Floyd在1962年提出,因此得名。这个算法的核心思想...
该算法主要用于寻找带权重的有向或无向图中,从一个特定顶点到其他所有顶点的最短路径。Dijkstra算法的核心思想是贪心策略,它每次选择当前未访问顶点中距离起点最近的一个,并更新与它相邻的顶点的距离。 源代码...
总的来说,Floyd算法是解决最短路径问题的强大工具,尤其在寻找所有顶点对之间最短路径的情况下。在MATLAB中,利用其强大的矩阵运算能力,可以便捷地实现和优化该算法,为图论问题的研究提供了便利。通过学习和实践...
Floyd-Warshall算法,通常简称为Floyd算法,是一种在图中寻找所有顶点对之间最短路径的有效算法。由Robert W. Floyd于1962年提出,该算法的核心思想是通过动态规划逐步增加中间节点,以检查是否存在更短的路径。在...
最短路径算法是图论中一个重要的概念,它是指在图中找出从一个顶点到另一个顶点的最短路径。该算法有很多种实现方法,如Dijkstra算法、Floyd算法、Bellman-Ford算法等。 在本实验中,我们使用C++语言实现了最短路径...
Floyd-Warshall算法,也称为Floyd算法,由罗伯特·弗洛伊德在1962年提出,用于求解所有顶点对之间的最短路径。与Dijkstra算法不同,Floyd-Warshall处理的是所有可能的路径,包括通过其他顶点的间接路径。 1. **算法...
它能有效地找到图中所有顶点对之间的最短路径,尤其适用于处理大型网络中的路径查找问题。Floyd算法的核心思想是基于动态规划,通过迭代的方式逐步更新所有可能的路径信息。 在算法执行过程中,我们首先初始化一个...
弗洛伊德算法(Floyd-Warshall Algorithm)是解决这一问题的一种经典方法,它能找出图中所有顶点之间的最短路径。这个算法由Robert W. Floyd于1962年提出,适用于有权重的完全图,能够处理有负权重的边,但不包括负...
Floyd算法是一种用于解决图论中所有顶点对之间最短路径问题的经典算法。该算法可以在带有负权边(但不允许存在负权环)的加权图中找到任意两个顶点之间的最短路径。Floyd算法的核心思想是通过迭代的方式不断更新顶点...
加权图中顶点间最短路径的算法,使用C++实现Floyd算法,对正在学习算法的同学应该挺有帮助的