杨雨彤


私信TA

用户名:dotcpp0724648

访问量:2213

签 名:

菜鸡也会想变强啊

等  级
排  名 4940
经  验 1615
参赛次数 0
文章发表 20
年  龄 21
在职情况 学生
学  校 大庆师范学院
专  业 软件工程

  自我简介:

解题思路:

注意事项:

参考代码:

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 人评分

  评论区

  • «
  • »