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

来源:互联网 发布:公孙止 知乎 编辑:程序博客网 时间:2024/05/18 13:29

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

这里写图片描述

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

原创粉丝点击