今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径。
迪杰斯特拉:
package dijkstra;
import java.util.Scanner;
import java.util.Stack;
/*
* 算法思路:通过从特定起点查找,一直查找到所有点到这个点的最小路径。
* 算法特点:因为要预防两点间的距离可能不是直接距离最短,所以处理要有些特别
* 算法处理思路:首先通过一个大的循环嵌套循环count(点)-1次,这么做是为了查找除了自身的所有点到起点的权值。
* 再通过一个for循环查找此时可达路径离起点到最近的点。把查出来点的设为已查找过。
* 接下来再通过这个最短权值的点进行for循环操作,这个for循环作用是如果经过新增v
* 顶点到达的定点比当前已知路径都短,我们更新
* 这个路径权值,并设置到这个点的前驱节点是v,让我们查询时能查出路径
*每个点都会走一次
* */
public class Dijkstra {
public static void main(String[] args) {
DijkstraArithmetic dijkstraArithmetic=new DijkstraArithmetic();
dijkstraArithmetic.dijkstra();
dijkstraArithmetic.find();
}
}
class DijkstraArithmetic{
//第一步:先准备一个图:
final int max = 65535;
int[][] graph = new int[][]{
{0, 1, 5, max, max, max, max, max, max},
{1, 0, 3, 7, 5, max, max, max, max},
{5, 3, 0, max, 1, 7, max, max, max},
{max, 7, max, 0, 2, max, 3, max, max},
{max, 5, 1, 2, 0, 3, 6, 9, max},
{max, max, 7, max, 3, 0, max, 5, max},
{max, max, max, 3, 6, max, 0, 2, 7},
{max, max, max, max, 9, 5, 2, 0, 4},
{max, max, max, max, max, max, 7, 4, 0}};
int[] D = new int[9]; //建立一个存储起点vo到各点的权值的数组
int[] P = new int[9];//建立一个起点到这个点的最短路径的前驱结点
int[] fin = new int[9];//建立一个确认每个点是否已经被算出最短路径,以便确认它不需要被再计算,被计算过就被记为1,为就按记为0
public void dijkstra() {
/**
* 算法第一步:初始化工作
*/
int i, j, k=0;
//初始化这三个数组,
for (i = 0; i < 9; i++) {
D[i] = graph[0][i];//初始化权值
P[i] = 0;//初始化前驱节点,试试自己的猜想(不行,如果这样的话,后面的!=0判断会出错误,而且能联通的都不为零)
fin[i] = 0;
}
fin[0] = 1;//不用计算起点
/*
* 第二步,通过现可达点查找最小的权值
* */
for (i = 1; i < 9; i++) {//遍历所有点的个数(除了v0)
int min = 65535;
for (j = 1; j < 9; j++) {//寻找v0最近的顶点
if (fin[j] != 1 && D[j] < min) {//确认要加入的点没有被加入过,并且某点可达且找出最小值
min = D[j];//把目前查到的最小值赋给min
k = j;//记录最小值的下标
}
}
fin[k] = 1;
for (j = 0; j < 9; j++) {//新更新了点,所以有了新的可达路径,更新这些新路径
if (fin[j] != 1 && D[j]&g