문제유형

다익스트라

문제풀이

다익스트라 기본 문제, 원리를 이해하고 풀면 좋습니다.

  1. 이차원 a 배열을 생성, a값을 모두 inf(1000000000) 로 초기화
  2. x,y,z 값을 입력으로 받는다. 그리고 a[x][y] 가 z보다 큰경우 값을 업데이트 한다. (작은값을 찾아야 하므로)
  3. start, end를 입력으로 받는다.
  4. d를 배열로 생성한다. n+1 만큼 /마찬가지로 방문여부를 확인할 수 있는 c를 n+1만큼 선언 및 초기화
  5. n만큼 d에 inf 를 업데이트, n만큼 c를 false 로 업데이트
  6. d[start] = 0 으로 초기화 시작지점, d의 역할은 비용 이라고 보면됀다.
  7. 반복문을 n-1 만큼 순회한다.
  8. 노드의 최솟지점을 찾아야 하므로 min과 x를 선언합니다. (min은 최댓값으로 x는 -1), x는 인덱스를 저장할것임
  9. n만큼 순회하면서 방문하지 않은곳이고 min이 d[i] 보다 큰경우 min과 x를 업데이트 합니다.
  10. 업데이트할 노드를 찾았으므로 c[x] 방문처리합니다.
  11. n만큼 순회하면서 x와 연결되어있는 노선을 모두 파악해서 d[i]의 최소비용을 업데이트합니다.
    1. d[i]의 값이 d[x] + a[x][i] 보다 큰 경우 업데이트 해줍니다.
  12. d[end]값을 출력해줍니다.

코드

package backjun;
import java.util.*;
import java.io.*;
public class BOJ_1916_최소비용구하기 {
static int inf = 1000000000;
static int[][] a = new int[1001][1001];
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
for(int i=0; i<a.length; i++) {
Arrays.fill(a[i], 1000000000);
}
for(int i=0; i<M; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int X = Integer.parseInt(st.nextToken());
int Y = Integer.parseInt(st.nextToken());
int Z = Integer.parseInt(st.nextToken());
if(a[X][Y]>Z)
a[X][Y]=Z;
}
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int[] d = new int[N+1];
boolean[] c = new boolean[N+1];
for(int i=1; i<=N; i++) {
d[i] = inf;
c[i] = false;
}
d[start] = 0;
for(int i=0; i<N-1; i++) {
int min = inf+1;
int x = -1;
for(int j=1; j<=N; j++) {
if(c[j]==false && min>d[j]) {
min = d[j];
x = j;
}
}
c[x] = true;
for(int j=1; j<=N; j++) {
if(d[j]>d[x]+a[x][j]) {
d[j] = d[x]+a[x][j]; //현재비용 + 간선비용
}
}
}
System.out.println(d[end]);
}
}

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

완주하지못한선수 / k번째 수  (0) 2021.05.08
알고리즘 :: 신규 아이디 추천 (javascript)  (0) 2021.05.07
숨바꼭질4  (0) 2020.11.07
특정거리의 도시찾기  (0) 2020.11.07
멀쩡한사각형  (0) 2020.11.07