본문 바로가기
알고리즘 풀이/백준

[BOJ] 9370. 미확인 도착지 - JAVA

by 2245 2023. 2. 6.

🔗 문제

https://www.acmicpc.net/problem/9370

 

9370번: 미확인 도착지

(취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서

www.acmicpc.net

 

🧩 풀이 및 코드

문제 유형 : 그래프 이론, 다익스트라

 

풀이

문제는 시작정점에서 목적지 정점까지 가는 최단 경로 중 g-h 또는 h-g 를 포함하는 목적지를 찾는 것이다.

g-h 를 뺀 나머지 간선들의 비용은 짝수로, g-h 는 홀수로 변경해서 만약, 최단경로가 홀수라면 g-h 를 포함한 경로이므로 목적지 후보에 포함시킨다.

 

느낀 점

이걸 어떻게 생각하지...

 

 

전체 코드

import java.io.*;
import java.lang.reflect.Array;
import java.util.*;

/*
 * 목적지 후보 중에서 s-g 또는 g-s 를 거치는 최단경로를 가진 목적지만 출력하기
 * sol)
 * s-g 가중치만 홀수로 바꿔서 최단경로 비용이 홀수라면 이 가중치를 포함한 경로
 */

public class Main_bj_9370_미확인도착지 {
	
	static int INF = 100_000_000;
	
	static class Node {
		int to;
		int weight;
		Node link;
		
		Node(int to, int weight, Node link) {
			this.to = to;
			this.weight = weight;
			this.link = link;
		}
	}

	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("res/input_bj_9370.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		
		StringTokenizer st;
		int n, m, t, s, g, h, u, v, w;
		Node[] adjList;
		int[] distance;
		List<Integer> candidate;
		boolean[] visited;
		for(int tc=0; tc<T; tc++) {
			st = new StringTokenizer(br.readLine(), " ");
			n = Integer.parseInt(st.nextToken());		// 정점의 갯수
			m = Integer.parseInt(st.nextToken());		// 간선의 갯수
			t = Integer.parseInt(st.nextToken());		// 목적지 후보의 갯수
			
			st = new StringTokenizer(br.readLine(), " ");
			s = Integer.parseInt(st.nextToken());		// 출발지
			g = Integer.parseInt(st.nextToken());		// 듀오가 지나간 정점 u
			h = Integer.parseInt(st.nextToken());		// 듀유가 지나간 정점 v
			
			adjList = new Node[n+1];
			// 양방향 도로
			for(int i=0; i<m; i++) {
				st = new StringTokenizer(br.readLine(), " ");
				u = Integer.parseInt(st.nextToken());
				v = Integer.parseInt(st.nextToken());
				w = Integer.parseInt(st.nextToken());
				
				if((u==g && v==h) || (u==h && v==g)) {
					w = w*2-1;			// 홀수로 변경
				} else {
					w *=2;				// 짝수로 변경
				}
				
				adjList[u] = new Node(v, w, adjList[u]);
				adjList[v] = new Node(u, w, adjList[v]);
			}
			
			// 목적지 후보 저장
			candidate = new ArrayList<>();
			for(int i=0; i<t; i++) {
				candidate.add(Integer.parseInt(br.readLine()));
			}
			Collections.sort(candidate);
			
			// dijkstra
			distance = new int[n+1];
			Arrays.fill(distance, INF);
			distance[s] = 0;
			
			PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> (o1[1] - o2[1]));		// 최소 우선순위 큐
			pq.add(new int[] {s, 0});
			
			visited = new boolean[n+1];
			
			while(!pq.isEmpty()) {
				int[] now = pq.poll();
				
				if(visited[now[0]]) continue;
				visited[now[0]] = true;
				
				// 이웃 검사
				for(Node temp = adjList[now[0]]; temp!=null; temp=temp.link) {
					if(!visited[temp.to] && distance[temp.to] > now[1] + temp.weight) {
						distance[temp.to] = now[1] + temp.weight;
						pq.add(new int[] {temp.to, distance[temp.to]});
					}
				}
			}
			
			for(int d : candidate) {
				if(distance[d]%2 == 1) {		// g-h 를 거친 최단경로
					sb.append(d).append(" ");
				}
			}
			sb.append("\n"); 
		}
		
		System.out.println(sb.toString());
		br.close();
	}

}

 


Reference

https://pangtrue.tistory.com/255

 

[백준 9370 : JAVA] 미확인 도착지 / 다익스트라

문제 풀이 최단 경로를 구하는 문제로 다익스트라 알고리즘을 이용해 풀 수 있는 문제다. 위의 예제 입력에서 첫 번째 테스트 케이스를 그래프로 시각화해보자. 특정 목적지로의 최단 경로 중

pangtrue.tistory.com