import java.util.*;
public class 最短路 {
static Scanner sc = new Scanner(System.in) ;
static int max = 10000 ;
static int n ;
static int m ;
static int[][] e ; // e[a][b] = c 表示从a 到 b 的 距离为 c
static int[] dis ; // 保存最短路径的长度
static boolean[] is ; // 记录当前节点是否访问过
static int[] p ; // 记录源点到某顶点的最短路径上的该顶点的前一个顶点(前驱)
public static void main(String[] args) {
System.out.println("请输入城市的个数:");
n = sc.nextInt() ; // 节点数
System.out.println("请输入城市之间的路线个数");
m = sc.nextInt() ; // 给的边的连接数
dis = new int[n + 1] ;
is = new boolean[n + 1] ;
p = new int[n + 1] ;
e = new int[m + 1][m + 1] ; // e[i][j]表示i 到 j 的距离
for(int i = 1 ; i <= n ; i ++){
for(int j = 1 ; j <= n ; j ++){
e[i][j] = max ;
}
}
System.out.println("请输入城市之间的路线以及距离");
for(int i = 1 ; i <= m ; i ++){
int a = sc.nextInt() ;
int b = sc.nextInt() ;
int c = sc.nextInt() ;
e[a][b] = c ;
}
System.out.println("请输入小明所在的位置:");
int start = sc.nextInt() ; // 起点
System.out.println("请输入小明要到达的位置:");
int end = sc.nextInt() ; // 终点
dijkstra(start);
System.out.print("小明所在的位置:" + start + " , ");
for(int i = 1 ; i <= n ; i ++){
if(i == end){
System.out.print("小明要到达的位置:" + end + " , ");
if(dis[i] == max){
System.out.print("无路可达");
}else{
System.out.print("最短距离为" + dis[i]);
}
}
}
find(start , end);
}
public static void find(int start , int end){
int x ;
Stack<Integer> s = new Stack<>() ;
for(int i = 1 ; i <= n ; i ++){
if(i == end ){
x = p[i] ;
while (x != start && x != -1){
s.push(x) ;
x = p[x] ;
}
System.out.println("最短路径为:" );
System.out.print(start + " ");
while (!s.isEmpty()){
System.out.print(s.pop() + " ");
}
System.out.println(end + " " );
}
}
}
private static void dijkstra(int start) {
for(int i = 1 ; i <= n ; i ++){
dis[i] = e[start][i] ;
is[i] = false ;
if( dis[i] == max ){
p[i] = -1 ;
}else{
p[i] = start ;
}
}
is[start] = true ;
dis[start] = 0 ;
for(int i = 1 ; i <= n ; i ++){
int temp = max ;
int t = start ;
for(int j = 1 ; j <= n ; j ++) {
if (!is[j] && dis[j] < temp) {
t = j;
temp = dis[j];
}
}
if(t == start){
return;
}
is[t] = true ;
for(int j = 1 ; j <= n ; j++){
if( !is[j] && e[t][j] < max ){
if( dis[j] > (dis[t] + e[t][j]) ){
dis[j] = dis[t] + e[t][j] ;
p[j] = t ;
}
}
}
}
}
}
<算法>最短路(起点到终点的最短距离)(java)
于 2022-03-09 21:52:46 首次发布