原题链接:城市路(Dijkstra)
解题思路:
注意事项:
参考代码:
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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复