package package1;

import java.util.Arrays;

/** * 保存内容的列表 */
class List {
   
    int[] weight;//权值
    int[] sortYes;//可排序的权值
    String[] str;//保存最后输出的路径

    public List(int n) {
   
        weight = new int[n];
        sortYes = new int[n];
        str = new String[n];
        for (int i = 0; i < n; i++) {
   
            weight[i] = Integer.MAX_VALUE;//初始值最大值,之后更新直接比较大小
            sortYes[i] = Integer.MAX_VALUE;//寻找最小值所保存的列表
        }
    }
}

public class alg {
   
    /** * dijkstra{ * 加入第一个 * * while 找最小{ * 去掉最小 * 加入其他,加上权值 * } * } */
    public static void dijkstra(int[][] g, List list, boolean direction) {
   
        list.sortYes[0] = 0;//从第一个开始找,只需要为第一个赋值0
        while(list.sortYes[min(list.sortYes)] != Integer.MAX_VALUE){
   //当最小值为MAX_VALUE的时候说明没有最小值了,已经结束
            int point = min(list.sortYes);
            list.sortYes[point] = Integer.MAX_VALUE;
            for(int i = 1; i < g[0].length; i++){
   //加入其他,加上权值
                if(g[point][i] != 0){
   //权值等于零直接跳过
                    if( point == 0){
   //第0个,直接加入
                        list.weight[i] = g[point][i];
                        list.sortYes[i] = g[point][i];
                        list.str[i] = (char)(point + 97) + " -> " + (char)(i + 97);//更新路径信息
                        if(!direction){
   //是无向图,让对称点=0
                            g[i][point] = 0;
                        }
                    }else{
   //不是 第0个
                        int weight = list.weight[point] + g[point][i];
                        if(weight < list.weight[i]){
   //把当前点的权值加上以当前点为起点的下一点的权值的和作为权值
                            list.weight[i] = weight;
                            list.sortYes[i] = g[point][i];
                            list.str[i] = list.str[point] + " -> " + (char)(97 + i);//更新路径信息
                            if(!direction){
   //是无向图,让对称点=0
                                g[i][point] = 0;
                            }
                        }
                    }
                }
            }
        }
    }

    /** * 求最小值的函数 * @param sortYes * @return */
    public static int min(int[] sortYes){
   
        int t = sortYes[0];
        int r = 0;
        for(int i = 1; i < sortYes.length; i++){
   
            if(sortYes[i] < t){
   
                t = sortYes[i];
                r = i;
            }
        }
        return r;
    }

    /** *初始化图 * @param g 图 * @param n 点 * @param direction 是否有向 */
    public static void initGraph(int[][] g, int[][] n, boolean direction) {
   
        for (int[] ints : n) {
   
            if (direction) {
   
                g[ints[0] - 1][ints[1] - 1] = ints[2];
            } else {
   
                g[ints[0] - 1][ints[1] - 1] = ints[2];
                g[ints[1] - 1][ints[0] - 1] = ints[2];
            }
        }
        for (int[] ints : g) {
   
            System.out.println(Arrays.toString(ints));
        }
    }

    public static void main(String[] args) {
   
        System.out.println("-----------------第一题------------------");
        int[][] n = {
   {
   1,4,7},{
   2,1,3},{
   2,3,4},{
   3,5,6},{
   4,2,2},{
   4,3,5},{
   5,4,4}};
        int[][] g = new int[5][5];
        initGraph(g, n, true);

        List list = new List(5);
        dijkstra(g, list, true);
        for(int i = 1; i < list.weight.length; i++){
   
            System.out.println(list.str[i] + " >" + list.weight[i] + "<");
        }

        System.out.println("-----------------第二题------------------");
        int[][] n1 = {
   {
   1,2,3},{
   1,4,4},{
   1,3,5},{
   2,5,3},{
   2,6,6},{
   4,3,2},{
   4,8,5},{
   4,5,1},{
   6,5,2},{
   6,10,5},{
   7,3,4},{
   7,8,3},{
   7,11,6},{
   9,8,6},{
   9,5,4},{
   9,10,3},{
   9,12,5},{
   11,12,8},{
   11,8,7},{
   12,10,9}};
        int[][] g1 = new int[12][12];
        initGraph(g1, n1, false);

        List list1 = new List(12);
        dijkstra(g1, list1, false);
        for(int i = 1; i < list1.weight.length; i++){
   
            System.out.println(list1.str[i] + " >" + list1.weight[i] + "<");
        }
    }
}

结果