[算法]Dijkstra算法模板(java)

注: 稠密圖用鄰接矩陣存儲 稀疏圖用鄰接表

時間複雜度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]);
 		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章