알고리즘

다익스트라(Dijkstra) 기본 알고리즘

changha. 2022. 10. 12. 22:52
import java.util.*;

// 다익스트라 알고리즘 
public class Main
{   
    static final int INF = 987654321;
    static final int MAX_N = 10;
    static int N, E;
    static int[][] Graph = new int[MAX_N][MAX_N];
    static int[] Dist = new int[MAX_N];
    
	public static void main(String[] args) {
	    Scanner sc = new Scanner(System.in);
	    N = sc.nextInt();
	    E = sc.nextInt();
	    for(int i = 0; i < N; i++){
	        for(int j = 0; j < N; j++){
	            if (i == j) Graph[i][j] = 0;
	            else Graph[i][j] = INF;
	        }
	    }
	    for(int i = 0; i < E; i++){
	        int u = sc.nextInt();
	        int v = sc.nextInt();
	        int cost = sc.nextInt();
	        Graph[u][v] = Graph[v][u] = cost;
	    }
	    dijkstra(0);
	    for(int i = 0; i < N; i++){
	        System.out.print(Dist[i] + " ");
	    }
	    

	}
	
	static void dijkstra(int src){
	    // 두 개 비교  할 때 첫번째 인 덱스로 비교 -> 작은 것 먼저 
	    PriorityQueue<int[]> pq = new PriorityQueue<>((a, b)->a[0] - b[0]);
	    boolean[] visited = new boolean[MAX_N];
	    for(int i = 0; i < N; i ++) Dist[i] = INF;
	    Dist[src] = 0;
	    pq.add(new int[] {0, src});
	    
	    while(!pq.isEmpty()){
	        int[] curr = pq.poll();
	        int u = curr[1];
	        if(visited[u]) continue;
	        
	        visited[u] = true;
	        for(int v = 0; v < N; v++){
	            if(Dist[v] > Dist[u] + Graph[u][v]){
	                Dist[v] = Dist[u] + Graph[u][v];
	                pq.add(new int[] {Dist[v], v});
	            }
	        }
	        
	    }
	    
	    
	    
	}
	
	
	
	
	
}

INPUT

6 9 
0 1 50
0 2 30
1 3 30
1 4 70
2 3 20
2 4 40
3 4 10
3 5 80
4 5 30

OUTPUT

0 50 30 50 60 90 

 

초기화를 최대로 해놓고 

반복하면서 최솟값을 찾는다

'알고리즘' 카테고리의 다른 글

[백준] 1916번 (java 자바)  (0) 2022.10.23
[백준] 1753번 (java 자바)  (0) 2022.10.20
[백준] 1012번(java 자바)  (0) 2022.10.10
[백준] 2667번 (java 자바)  (0) 2022.10.06
<백준> 2606번 자바 알고리즘[BFS]  (0) 2022.10.06