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]);
}
}
}