[Java] λ°±μ€ 5214λ² - νμΉ
[λ¬Έμ ]
https://www.acmicpc.net/problem/5214
5214λ²: νμΉ
첫째 μ€μ μμ μ Nκ³Ό ν νμ΄νΌνλΈκ° μλ‘ μ°κ²°νλ μμ κ°μ K, νμ΄νΌνλΈμ κ°μ Mμ΄ μ£Όμ΄μ§λ€. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000) λ€μ Mκ° μ€μλ νμ΄νΌνλΈμ μ λ³΄κ° ν μ€μ νλμ© μ£Όμ΄
www.acmicpc.net
[νμ΄]
BFS(λλΉ μ°μ νμ)μ μ΄μ©νμ¬ νμ΄νμμ΅λλ€.
μ λ ₯μΌλ‘ λ€μ΄μ€λ μ«μλ€μ 2κ°λ‘ λλμ΄ μκ°νμμ΅λλ€.
tubeOut κ° νμ΄ννλΈκ° μ΄λν μ μλ μ λ²νΈ
tubeIn κ° μλ€μ΄ μ΄λν μ μλ νμ΄ννλΈ λ²νΈ
λ°λΌμ μμ 1λ²μ μ¬μ©νλ©΄ tubeOutκ³Ό tubeInλ μλμ κ°μ΄ ꡬμ±λ©λλ€.
λ ArrayListλ₯Ό νμ©ν΄μ findStation()λ₯Ό ν΅ν΄ BFSλ₯Ό μ§ννλ©΄,
( μ΄λ N = 1μ΄λΌλ©΄ 무μ 건 1λ²λ§μ μμ μ΄λ κ°λ₯νλ€λ μμΈ μ²λ¦¬λ₯Ό νμ§ λͺ»ν΄ 100%μμ μ€λ΅μ²λ¦¬κ° λλ λ¬Έμ κ° λ°μνμμ΅λλ€. )
1λ² μ -> 2,3νλΈλ‘ μ΄λ κ°λ₯ ( 1λ² μ΄λ )
2λ² μ -> 1λ²νλΈλ μ΄λ―Έ λ°©λ¬ΈνμΌλ continue
3λ²μ -> 3λ² νλΈλ‘ μ΄λ κ°λ₯ ( 2λ² μ΄λ )
3λ² νλΈ -> 3, 6, 7λ² μμΌλ‘ μ΄λ κ°λ₯
3λ² μ -> μ΄λ―Έ λ°©λ¬Έ νμΌλ continue
6λ² μ -> 4, 5 νλΈλ‘ μ΄λ κ°λ₯ ( 3λ² μ΄λ )
5λ² νλΈμ Nμκ° 9κ° μμΌλ―λ‘ ( 4λ² μ΄λ ) 4λ₯Ό μΆλ ₯ν©λλ€.
[μ½λ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
class Station implements Comparable<Station>{
int index;
int sum;
public Station(int index, int sum) {
this.index = index;
this.sum = sum;
}
@Override
public int compareTo(Station o) {
return this.sum - o.sum;
}
}
public class Main {
public static int N; // μμ κ°μ
public static int K; // ν νμ΄νΌνλΈκ° μ°κ²°νλ μμ κ°μ
public static int M; // νμ΄νΌνλΈμ κ°μ
public static ArrayList<ArrayList<Integer>> tubeOut = new ArrayList<>(); // κ° νλΈκ° κ° μ μλ μ μ μ₯
public static ArrayList<ArrayList<Integer>> tubeIn = new ArrayList<>(); // κ° μμ΄ κ° μμλ νλΈ μ μ₯
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
for(int i=0;i<=N;i++) {
tubeIn.add(new ArrayList<Integer>());
}
tubeOut.add(new ArrayList<Integer>());
for(int i=1;i<=M;i++) {
tubeOut.add(new ArrayList<Integer>());
st = new StringTokenizer(br.readLine());
for(int j=0;j<K;j++) {
int num = Integer.parseInt(st.nextToken());
tubeOut.get(i).add(num);
tubeIn.get(num).add(i);
}
}
findStation();
}
public static void findStation() {
if(N == 1) {
System.out.println(1);
return;
}
PriorityQueue<Station> pq = new PriorityQueue<>();
pq.offer(new Station(1, 1));
boolean[] visitTube = new boolean[M + 1];
boolean[] visitStation = new boolean[N + 1];
while(!pq.isEmpty()) {
Station p = pq.poll();
visitStation[p.index] = true;
for(Integer tube:tubeIn.get(p.index)) {
if(visitTube[tube]) {
continue;
}
visitTube[tube] = true;
for(Integer station:tubeOut.get(tube)) {
if(!visitStation[station]) {
visitStation[station] = true;
if(station == N) {
System.out.println(p.sum + 1);
return;
}
pq.offer(new Station(station, p.sum + 1));
}
}
}
}
System.out.println(-1);
}
}