算法--迪傑斯特拉算法 Dijkstra

算法--迪傑斯特拉算法 Dijkstra
https: //www.bilibili.com/video/av47427754?from=search&seid=10869921304007190819

import java.util.*;
public class djstl {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();                        // n個點 m條邊 x爲開始點 如1到6 1爲開始點
        int m = sc.nextInt();
        int x = sc.nextInt();
        int value[][] = new int[n + 1][n + 1];
        int mindis[] = new int[n + 1];
        for (int i = 1; i <= n; i++) {               // 先初始化 原點爲 0 暫時爲連線爲Integer.MAX_VALUE
            mindis[i] = Integer.MAX_VALUE;           // 最大值簡單修改 統一
            for (int j = 1; j <= n; j++) {           // n!!!
                if (i == j)
                    value[i][j] = 0;                 // 自己到自己爲0
                else
                    value[i][j] = Integer.MAX_VALUE;
            }
        }
        for (int i = 0; i < m; i++) {                // 傳入數據 有向邊以及權重 沒變還是Integer.MAX_VALUE
            int a = sc.nextInt();
            int b = sc.nextInt();
            int val = sc.nextInt();
            value[a][b] = val;
            if(a == x)
                mindis[b] = val;                     //這裏有說明目標點到 過程點的距離是多少
        }
        search( x,  mindis ,  value, n) ;
    }
    private static void search(int x, int dis[] , int value[][],int n) {
        boolean mark[] = new boolean [n+1];
        for(int i = 0 ; i <= n ;i++) {             //初始化    
            mark[i] = false; 
        }
        mark[x] = true;                              //目標點到自己的位置 的 初始
        dis[x] = 0;
        int count =1;
        while(count <= n) {
            int loc = 0;
            int min = Integer.MAX_VALUE;
            for(int i =1 ; i <= n ;i++) {
                if(!mark[i]&&min>value[x][i]) {    //找第次次最小的點
                    loc = i ;                      //記錄第次次最小點所對應的地址
                    min = value[x][i];             //附上最小值
                }
            }
            if(loc == 0)break ;                      //沒進去過 直接跳出
            mark[loc] = true ;                      //查找過直接就 true 
            count ++;                               //while更新數組
            for(int i = 1 ; i <= n ; i ++) {
                if(!mark[i]&&dis[loc]+value[loc][i]<dis[i]&&value[loc][i]!=Integer.MAX_VALUE) {
                                                     //無路可走 value[loc][i]loc 去i 所對應的權重//  dis[loc]目標點到過程所對應的權重
                    dis[i] = dis[loc]+value[loc][i];  
                }
            }
        }
        for(int i =  0 ; i <= n ; i++) {
            if(dis[i]==Integer.MAX_VALUE) {
                System.out.print(" "+0);
                i++;
                }
            System.out.print(" "+dis[i]);
    }
        }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章