使用迪杰斯特拉算法解决任意两点间的最短路径问题
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