解题思路:
注意事项:
参考代码:
import java.util.Arrays; import java.util.Scanner; /** * @Author:杨雨彤 * @date:2024/1/12 16:25 */ public class 城市路Dijkstra { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int n= scan.nextInt(); int m=scan.nextInt(); int [][]matrix=new int[n][n]; int max=10000; for (int i = 0; i <n ; i++) { for (int j = 0; j <n ; j++) { matrix[i][j]=max; } } for (int i = 0; i <m ; i++) { int a= scan.nextInt(); int b= scan.nextInt(); int distance=scan.nextInt(); if(matrix[a-1][b-1]>distance){ matrix[a-1][b-1]= distance; matrix[b-1][a-1]=distance; } } System.out.println(Dijkstra(0,matrix)); } public static int Dijkstra(int source,int[][]matrix){ boolean[]visited=new boolean[matrix.length];//状态数组,存储顶点的访问状态 int[]distance=new int[matrix.length];//存储各顶点距离出发顶点的最短距离 int[]pre_arr=new int[matrix.length];//记录每个顶点的前驱顶点 Arrays.fill(pre_arr,-1);//初始化,-1表示无前驱顶点 for (int i = 0; i < matrix.length; i++) { distance[i] = matrix[source][i];//初始化distance,默认当前距离最短 if(matrix[0][i]<10000) { pre_arr[i]=0;//初始化pre_arr表示若连通,则前驱顶点为出发顶点 } } visited[source]=true;//出发顶点的访问状态为true distance[source]=0;//到自身的最短距离为0 int len= matrix.length; //需要访问剩余得len-1个顶点 for (int i = source+1; i<len; i++) { int mindist = Integer.MAX_VALUE; int min = -1; //找到距离出发点最近且没被访问过的顶点,记录其距离以及下标 for (int j = 0; j <len; j++) { if (!visited[j] && distance[j] < mindist ) { mindist = distance[j]; min = j; } } if (mindist == Integer.MAX_VALUE) { break; } //找到顶点后将其状态置为true,已找到source距离min的最小距离 visited[min] = true; //找到min顶点后,更新与min连通的其他顶点距离source的最小距离数组distance for (int j = 0; j <len; j++) { //如果该顶点未被访问且source到min的最小距离加上min到该顶点的距离要比source到该顶点的原始距离小 if (!visited[j] &&distance[min] + matrix[min][j] < distance[j]) { //表示我们找到了该顶点到source顶点的更近距离,故更新distance[j],记录最小距离 distance[j] =distance[min] + matrix[min][j]; //同时将该顶点的前驱顶点设置为min,表示该顶点是通过min顶点才找到一条距source更近的路的 pre_arr[j] = min; } } } //返回最后一个顶点到source的最短距离 return distance[len-1]; } }
0.0分
1 人评分