注: 稠密圖用鄰接矩陣存儲 稀疏圖用鄰接表
時間複雜度o(n2)
import java.util.Scanner;
public class Main {
static int n,m;
static int N = 510;
//鄰接矩陣來存儲圖
static int [][] g = new int[N][N];
//已經求出最短路點的集合
static boolean [] visited = new boolean[N];
//起點到第i個點最短距離
static int [] dist = new int[N];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String [] s = in.nextLine().split(" ");
n = Integer.parseInt(s[0]); m = Integer.parseInt(s[1]);
//初始化鄰接矩陣
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) g[i][j] = 0;
else g[i][j] = Integer.MAX_VALUE;
}
}
for(int i=0;i<m;i++){
String [] d = in.nextLine().split(" ");
int x = Integer.parseInt(d[0]);
int y = Integer.parseInt(d[1]);
int z = Integer.parseInt(d[2]);
g[x][y] = Math.min(g[x][y], z);
}
dijkstra();
}
static void dijkstra(){
//初始化路徑矩陣
for(int i=1;i<=n;i++){
dist[i] = Integer.MAX_VALUE;
}
dist[1] = 0;
//n個點進行n次迭代
for(int i=0;i<n;i++){
int t = -1; //存儲當前訪問的點
//找到當前沒有訪問過且離源點最近的點
for(int j=1;j<=n;j++){
if(!visited[j]&&(t==-1||dist[t]>dist[j])){
t = j;
}
}
visited[t] = true;
//拓展
for(int j=1;j<=n;j++){
if(g[t][j]!= Integer.MAX_VALUE)
dist[j] = Math.min(dist[j], dist[t]+g[t][j]);
}
}
if(dist[n] == Integer.MAX_VALUE) System.out.println(-1);
else System.out.println(dist[n]);
}
}