728x90
문제
https://www.acmicpc.net/problem/1916
어떻게 풀 것인가?
문제의 제목부터가 "최소비용 구하기" 이다.
그래서 다익스트라 최단경로 구하는 알고리즘을 사용하였다.
사실 그래서 처음 접근 자체는 크게 어렵지 않았다.
어떠한 문제를 풀 때 문제의 알고리즘 유형 파악이 빠르다면 코드는 그다지 어렵지 않다.
풀면서 놓쳤던점
X
이 문제를 통해 얻어갈 것
다익스트라 알고리즘
내 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
// 백준알고리즘 1916번 최소비용 구하기
public class Main {
static int N, M;
static int start, end;
static ArrayList<Node>[] graph;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
graph = new ArrayList[N + 1];
for (int i = 0; i <= N; i++) graph[i] = new ArrayList<>();
for (int i = 0; i < M; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
graph[v].add(new Node(w, cost));
}
StringTokenizer st = new StringTokenizer(br.readLine());
start = Integer.parseInt(st.nextToken());
end = Integer.parseInt(st.nextToken());
Dijkstra();
}
public static void Dijkstra() {
boolean[] check = new boolean[N + 1];
int[] dist = new int[N + 1];
int INF = Integer.MAX_VALUE;
Arrays.fill(dist, INF);
dist[start] = 0;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.offer(new Node(start, 0));
while (!pq.isEmpty()) {
int nowVertex = pq.poll().index;
if (check[nowVertex]) continue;
check[nowVertex] = true;
//index의 연결된 정점 비교
for (Node next : graph[nowVertex]) {
if (dist[next.index] > dist[nowVertex] + next.cost) {
dist[next.index] = dist[nowVertex] + next.cost;
pq.offer(new Node(next.index, dist[next.index]));
}
}
}
System.out.print(dist[end]);
}
}
class Node implements Comparable<Node> {
int index;
int cost;
public Node(int index, int cost) {
this.index = index;
this.cost = cost;
}
@Override
public int compareTo(Node o) {
return Integer.compare(this.cost, o.cost);
}
}
참고
728x90
'BaekJoon' 카테고리의 다른 글
[BaekJoon] 1865번 웜홀 (Java) 문제 풀이 [Gold 3] (0) | 2023.07.31 |
---|---|
[BaekJoon] 11054번 가장 긴 바이토닉 부분 수열 (Java) 문제 풀이 [Gold 4] (0) | 2023.07.31 |
[BaekJoon] 20529번 가장 가까운 세 사람의 심리적 거리 (Java) 문제 풀이 [Silver 1] (0) | 2023.07.27 |
[BaekJoon] 1477번 휴게소 세우기 (Java) 문제 풀이 [Gold 4] (0) | 2023.07.27 |
[BaekJoon] 1300번 k번째 수 (Java) 문제 풀이 [Gold 2] (2) | 2023.07.25 |