[백준] 10282: 해킹 - Java (Dijkstra)
Algorithm/BackJun 2024. 3. 29.
반응형
목 차
- 문제
- 접근 방식
- 풀이
문제
접근 방식
먼저 이 문제는 다익스트라(Dijkstra) 알고리즘을 사용하여 푸는 문제이다.
A 컴퓨터가 B 컴퓨터를 의존한다. 이 때 B 가 감염되면 A 컴퓨터도 감염된다. 이 뜻은 B 가 출발점, A 가 도착점이 된다.
다익스트라의 경우 비슷비슷하기 때문에 크게 문제가 되지는 않지만 입력이 아래와 같을 때 문제가 발생하게 된다.
1
4 5 1
4 1 1
2 4 10
3 1 2
2 3 2
3 2 2
answer 4 4
이 경우는 1 -> 4 로 1초의 시간이 걸리고, 1 -> 3으로 2초의 시간이 걸린다. 이 경우에 걸리는 시간은 2초이다. 만약 평소대로 다익스트라 알고리즘을 사용한다면 여기서 걸리게 되어 답이 5가 출력될 것이다.
해결방법은 간단하다. 시간을 담아놓은 배열에 MAX_VALUE 값을 제외한 나머지 값 중에 큰 값을 가져오면 된다.
풀이
package src.Graph.Dijkstra;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class 해킹_10282 {
static List<int[]>[] graph;
static boolean[] isVisited;
static PriorityQueue<int[]> pq;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
// test
StringBuilder sb = new StringBuilder();
while(t-- > 0){
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
graph = new List[n + 1];
isVisited = new boolean[n + 1];
pq = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[1], o2[1]);
}
});
for(int i = 1; i <= n; i++){
graph[i] = new ArrayList<>();
}
for(int i = 1; i <= d; i++){
StringTokenizer computer = new StringTokenizer(br.readLine());
int a = Integer.parseInt(computer.nextToken());
int b = Integer.parseInt(computer.nextToken());
int s = Integer.parseInt(computer.nextToken());
graph[b].add(new int[] {a, s});
}
int max = 0;
int result_c = 1;
// pq = {도착 노드, 가중치}
for(int[] el : graph[c]){
max = Math.max(max, el[1]);
pq.add(new int[] {el[0], el[1]});
}
isVisited[c] = true;
int result_w = max;
while(!pq.isEmpty()){
int[] popped = pq.poll();
int arrived = popped[0];
int w = popped[1];
if(isVisited[arrived]) continue;
result_c += 1;
isVisited[arrived] = true;
for(int i = 0; i < graph[arrived].size(); i++){
if(isVisited[graph[arrived].get(i)[0]]) continue;
max = Math.max(max, graph[arrived].get(i)[1]);
pq.add(new int[] {graph[arrived].get(i)[0], graph[arrived].get(i)[1]});
}
result_w += max;
max = 0;
}
sb.append(result_c).append(" ").append(result_w).append('\n');
}
System.out.println(sb);
}
}
반응형
'Algorithm > BackJun' 카테고리의 다른 글
[백준] 2470: 두 용액 - Java (Two Pointer) (0) | 2024.03.30 |
---|---|
[백준] 2448: 별찍기 11 - Java (RecursiveFunction) (0) | 2024.03.30 |
[백준] 2109: 순회강연 - Java (우선순위 큐) (0) | 2024.02.15 |
[백준] 7576: 토마토 - Java (그래프) (0) | 2024.01.23 |
[백준] 11722: 가장 긴 감소하는 부분 수열 - Java (DP) (0) | 2024.01.22 |