最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径。

迪杰斯特拉:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值