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

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