본문 바로가기
Problem Solving/백준

백준 5214 : 환승

by Libi 2021. 8. 27.
반응형

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

 

5214번: 환승

첫째 줄에 역의 수 N과 한 하이퍼튜브가 서로 연결하는 역의 개수 K, 하이퍼튜브의 개수 M이 주어진다. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000) 다음 M개 줄에는 하이퍼튜브의 정보가 한 줄에 하나씩 주어

www.acmicpc.net

[ 문제풀이 ]

"백준 2021 : 최소 환승 경로" 문제와 거의 비슷한 문제이다.

역이 아닌 하이퍼튜브를 정점으로 두는 아이디어를 적용한다면 쉽게 해결할 수 있다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	
	static class Node {
		int v, move;
		Node (int v, int move) {
			this.v = v;
			this.move = move;
		}
	}
	
	static int N, K, M;
	static List<Integer>[] hypertubes, stations;
	
	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			
			hypertubes = new ArrayList[M + 1];
			stations = new ArrayList[N + 1];
			for (int i = 0; i <= M; ++i) hypertubes[i] = new ArrayList<>();
			for (int i = 0; i <= N; ++i) stations[i] = new ArrayList<>();
			for (int i = 1; i <= M; ++i) {
				st = new StringTokenizer(br.readLine());
				for (int j = 0; j < K; ++j) {
					int station = Integer.parseInt(st.nextToken());
					hypertubes[i].add(station);
					stations[station].add(i);
				}
			}
			if (N == 1) bw.write(1 + "\n");
			else bw.write(bfs() + "\n");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static int bfs() {
		boolean[] visitHT = new boolean[M + 1];
		boolean[] visitS = new boolean[N + 1];
		Queue<Node> q = new LinkedList<>();
		visitS[1] = true;
		for (int v : stations[1]) {
			visitHT[v] = true;
			q.offer(new Node(v, 1));
		}
		
		while (!q.isEmpty()) {
			Node n = q.poll();
			for (int v : hypertubes[n.v]) {
				if (v == N) return n.move + 1;
				if (visitS[v]) continue;
				visitS[v] = true;
				for (int nv : stations[v]) {
					if (visitHT[nv]) continue;
					visitHT[nv] = true;
					q.offer(new Node(nv, n.move + 1));
				}
			}
		}
		return -1;
	}
}

 

 

반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 2234 : 성곽  (0) 2021.08.30
백준 5624 : 좋은 수  (0) 2021.08.29
백준 1826 : 연료 채우기  (0) 2021.08.26
백준 13308 : 주유소  (0) 2021.08.25
백준 15678 : 연세워터파크  (0) 2021.08.24

댓글