다익스트라 알고리즘

Bennie97·2022년 4월 9일
0

다익스트라 알고리즘

하나의 시작 정점에서 끝 정점까지의 최단 경로이다.
음의 가중치를 허용하지 않는 최단경로 알고리즘임

다익스트라 슈도코드
s : 시작정점
A : 인접행렬
D : 시작정점에서의 거리 
v : 정점 집합
U : 선택된 정점 집합
Dijkstra(s, A, D){
 U = {s};
 
 for 모든 정점 v
  D[v] <- A[s][v]
  
 While U != V
 	D[w] 가 최소인 정점 w 를 선택한다 (단 w = V - U)
    U <- U u {w}
    For w에 인접한 모든 미방문 정점 v
    	D[v] <- min(D[v], D[w] + A[w][v])
}     
package test;

import java.util.*;
import java.io.*;

public class dijkstraTest {

	static int adj[][]; // 인접행렬
	static int N; // 정점 수 
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		N = Integer.parseInt(br.readLine());
		adj = new int[N][N];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				adj[i][j] = Integer.parseInt(st.nextToken());
			}
		} // 인접행렬 완성 
		
		Dijkstra(0);
	}

	public static void Dijkstra(int sNode) {
		int[] distance = new int[N]; // 시작노드로부터 각 노드까지의 최소비용
		boolean[] visited = new boolean[N]; // 시작노드로부터 각 노드까지의 최소비용이 확정났는가를 판단해주는 배열
		
		Arrays.fill(distance, Integer.MAX_VALUE);
		distance[sNode] = 0; // 시작노드를 0으로 초기화

		for (int i = 0; i < N; i++) {
			// (시작노드로부터의)최소비용이 확정나지 않은 노드를 중에 가장 거리가 짧은 노드선택하기
			int minDist = Integer.MAX_VALUE;
			int minNode = -1;
			for (int j = 0; j < N; j++) {
				if(!visited[j]) {
					if(minDist > distance[j]) {
						minDist = distance[j];
						minNode = j;
						visited[minNode] = true;
					}
				}
			}
			// 거리가짧은 노드가 선택되었다면
			// 그 노드를 경유하는것을 고려하여 시작노드로부터의 최소비용을 업데이트 하기 
			for (int j = 0; j < N; j++) {
				if(!visited[j] && adj[minNode][j] != 0) {
					if(distance[j] > distance[minNode] + adj[minNode][j]) {
						distance[j] = distance[minNode] + adj[minNode][j];
					}
				}
			}
		}
		
		System.out.println(Arrays.toString(distance));

	}

}
profile
현명한개발자가되자

0개의 댓글