7---------迪杰斯特拉算法的简单应用

36 篇文章 1 订阅

使用迪杰斯特拉算法解决任意两点间的最短路径问题

这里写图片描述

package list;

import java.util.Scanner;
/**
 * 稍微修改迪杰斯特拉算法即可得出结论
 * 思路:从该结点出发,依次向外探测,并与修正与当前生成路径的最短路径
 * @author 哑元
 *
 */

public class Test1 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n,m,s,e;
        System.out.println("n、m、s、e的信息");
        n = scan.nextInt(); //顶点数
        m = scan.nextInt(); //边数
        s = scan.nextInt() - 1; //当前结点
        e = scan.nextInt() - 1; //要去的结点
        //定义一个数组,用来存放顶点
        int total[] = new int[n];   //用来存放到每个结点的路径长度
        int edges[][] = new int[n][n];
        //初始化边表
        for (int i = 0; i < edges.length; i++) {
            for (int j = 0; j < edges[i].length; j++) {
                edges[i][j] = 0;    //0表示没有边
            }
        }
        //输入边表信息
        System.out.println("请输入边信息");
        for (int i = 0; i < m; i++) {
            System.out.println("请输入(vi,vj)的下标");
            int a = scan.nextInt() - 1;
            int b = scan.nextInt() - 1;
            edges[a][b] = 1;
            edges[b][a] = 1;
        }
        boolean isFinal[] = new boolean[n]; //是否已经求得该结点的最短路径
        for (int i = 0; i < isFinal.length; i++) {
            isFinal[i] = false;
            total[i] = edges[s][i]; ///将所有与初始结点相关的结点存放到表中
        }
        total[s] = 0;
        isFinal[s] = true;  //先标记初始结点
        for (int j = 0; j < n; j++) {
            if(j == s) continue;

            int v = 0;
            for (int i = 0; i < n; i++) {
                //从初始结点开始
                if(!isFinal[i] && total[i] != 0){   //==1表示当前路是通的
                    v = i;
                }
            }
            isFinal[v] = true;  //将找到最近的结点标记
            for (int i = 0; i < n; i++) {   //修正当前生成路径到其他结点的距距离
                if(!isFinal[i] && edges[v][i] == 1){
                    total[i] = total[v] + edges[v][i];  
                }
            }
        }
        System.out.println("输出当前结点到其余各节点的最短路径长度:");
        for (int i = 0; i < n; i++) {
            System.out.println(total[i]);
        }
        if(total[e] != 0){
            System.out.println("两点间的最短路径长度为:" + total[e]);
        }else{
            System.out.println("你就在那里或者你永远也到不了那里");
        }
    }

}

输入模式和输出模式
n、m、s、e的信息
5
4
1
5
请输入边信息
请输入(vi,vj)的下标
1
2
请输入(vi,vj)的下标
2
3
请输入(vi,vj)的下标
3
4
请输入(vi,vj)的下标
4
5
输出当前结点到其余各节点的最短路径长度:
0
1
2
3
4
两点间的最短路径长度为:4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值