반응형
Notice
Recent Posts
Recent Comments
Link
It's easy, if you try
[알고리즘] 다익스트라 알고리즘 수도 코드 (Java) 본문
반응형
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
/*
5
0 2 2 5 9
2 0 3 4 8
2 3 0 7 6
5 4 7 0 5
9 8 6 5 0
==> 8
4
0 94 53 16
79 0 24 18
91 80 0 98
26 51 92 0
==> 16
7
0 2 8 5 9 15 20
2 0 5 4 7 10 16
8 5 0 7 6 4 10
5 4 7 0 15 8 9
9 7 6 15 0 11 13
15 10 4 8 11 0 6
20 16 10 9 13 6 0
==> 14
*/
public class Dijkstra {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine().trim());
int V = Integer.parseInt(st.nextToken()); //정점 갯수
int start = 0;
int end = V-1; //도착점 인덱스
final int INFINITY = Integer.MAX_VALUE;
int[][] matrix = new int[V][V];
int[] distance = new int[V];
boolean[] visited = new boolean[V];
for(int i=0; i<V; ++i){
st = new StringTokenizer(in.readLine().trim(), " ");
for(int j=0; j<V; ++j){
matrix[i][j] = Integer.parseInt(st.nextToken());
}
}
Arrays.fill(distance, INFINITY);
distance[start] = 0;
int min=0, current=0;
for(int i=0; i<V; ++i){
//a단계 : 방문하지 않은 정점들 중 최소가중치의 정점 선택
min = INFINITY;
for(int j=0; j<V; ++j){
if(!visited[j] && distance[j] < min){
min = distance[j];
current = j;
}
}
visited[current] = true; // 선택 정점 방문 처리
if(current == end){ // 선택 정점이 도착정점이면 탈출.
break;
}
//b단계: current정점을 경유지로 하여 갈수 있는 다른 방문하지 않은 정점들에 대한 처리
for(int c=0; c<V; ++c){
if(!visited[c] && matrix[current][c] != 0
&& distance[c] > min+matrix[current][c]){
distance[c] = min+matrix[current][c];
}
}
}
System.out.println(distance[end]);
}
}
PriorityQueue를 사용한 버전
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Stack;
import java.util.StringTokenizer;
/*
5
0 2 2 5 9
2 0 3 4 8
2 3 0 7 6
5 4 7 0 5
9 8 6 5 0
==> 8
4
0 94 53 16
79 0 24 18
91 80 0 98
26 51 92 0
==> 16
7
0 2 8 5 9 15 20
2 0 5 4 7 10 16
8 5 0 7 6 4 10
5 4 7 0 15 8 9
9 7 6 15 0 11 13
15 10 4 8 11 0 6
20 16 10 9 13 6 0
==> 14
*/
public class Dijkstra_PQ {
private static class Node implements Comparable<Node>{
int vertex;
int totalDistance;
public Node(int vertex, int totalDistance) {
this.vertex = vertex;
this.totalDistance = totalDistance;
}
@Override
public int compareTo(Node o) {
return this.totalDistance-o.totalDistance;
}
@Override
public String toString() {
return "Node [vertex=" + vertex + ", distance=" + totalDistance + "]";
}
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine().trim());
int V = Integer.parseInt(st.nextToken()); //정점 갯수
int start = 0; //시작점 인덱스
int end = V-1; //도착점 인덱스
final int INFINITY = Integer.MAX_VALUE;
int[][] matrix = new int[V][V];
int[] distance = new int[V];
boolean[] visited = new boolean[V];
for(int i=0; i<V; ++i){
st = new StringTokenizer(in.readLine().trim());
for(int j=0; j<V; ++j){
matrix[i][j] = Integer.parseInt(st.nextToken());
}
}
Arrays.fill(distance, INFINITY);
distance[start] = 0;
PriorityQueue<Node> queue = new PriorityQueue<Node>();
queue.offer(new Node(start,distance[start]));
Node current = null;
while(!queue.isEmpty()){
//a단계 : 방문하지 않은 정점들 중 최소가중치의 정점 선택
current = queue.poll();
if(visited[current.vertex])continue;
visited[current.vertex] = true; // 선택 정점 방문 처리
if(current.vertex == end) break; // 선택 정점이 도착정점이면 탈출.
//b단계: current정점을 경유지로 하여 갈수 있는 다른 방문하지 않은 정점들에 대한 처리
for(int c=0; c<V; ++c){
if(!visited[c] && matrix[current.vertex][c] != 0
&& distance[c] >current.totalDistance+matrix[current.vertex][c]){
distance[c] = current.totalDistance+matrix[current.vertex][c];
queue.offer(new Node(c,distance[c]));
}
}
}
System.out.println(distance[end]);
}
}
응용 문제 살펴보기
2021.03.25 - [알고리즘/자바(Java)] - [백준/boj] 14938: 서강그라운드 (Java) / 다익스트라 알고리즘
반응형
'알고리즘' 카테고리의 다른 글
컨벡스 헐 (Convex hull: 볼록 껍질), 그라함 스캔, CCW / 기하학 (0) | 2021.04.19 |
---|---|
[알고리즘] PRIM 알고리즘 / 수도 코드 (Java) (0) | 2021.03.25 |
Comments