ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 18352 νŠΉμ • 거리의 λ„μ‹œ μ°ΎκΈ°_JAVA
    STUDY πŸ’›/μ•Œκ³ λ¦¬μ¦˜ 2021. 2. 9. 09:57
    λ°˜μ‘ν˜•

     

    [문제]

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

     

    18352번: νŠΉμ • 거리의 λ„μ‹œ μ°ΎκΈ°

    첫째 쀄에 λ„μ‹œμ˜ 개수 N, λ„λ‘œμ˜ 개수 M, 거리 정보 K, 좜발 λ„μ‹œμ˜ 번호 Xκ°€ 주어진닀. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) λ‘˜μ§Έ 쀄뢀터 M개의 쀄에 κ±Έμ³μ„œ 두 개

    www.acmicpc.net


    μ–΄λ–€ λ‚˜λΌμ—λŠ” 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€μ˜ λ„μ‹œμ™€ M개의 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€. λͺ¨λ“  λ„λ‘œμ˜ κ±°λ¦¬λŠ” 1이닀.

    이 λ•Œ νŠΉμ •ν•œ λ„μ‹œ Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λͺ¨λ“  λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 μ •ν™•νžˆ K인 λͺ¨λ“  λ„μ‹œλ“€μ˜ 번호λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
    λ˜ν•œ 좜발 λ„μ‹œ Xμ—μ„œ 좜발 λ„μ‹œ X둜 κ°€λŠ” μ΅œλ‹¨ κ±°λ¦¬λŠ” 항상 0이라고 κ°€μ •ν•œλ‹€.

    예λ₯Ό λ“€μ–΄ N=4, K=2, X=1일 λ•Œ λ‹€μŒκ³Ό 같이 κ·Έλž˜ν”„κ°€ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž.



    이 λ•Œ 1번 λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 2인 λ„μ‹œλŠ” 4번 λ„μ‹œ 뿐이닀. 2번과 3번 λ„μ‹œμ˜ 경우, μ΅œλ‹¨ 거리가 1이기 λ•Œλ¬Έμ— 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.



    [μž…λ ₯]

    첫째 쀄에 λ„μ‹œμ˜ 개수 N, λ„λ‘œμ˜ 개수 M, 거리 정보 K, 좜발 λ„μ‹œμ˜ 번호 Xκ°€ 주어진닀. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N)
    λ‘˜μ§Έ 쀄뢀터 M개의 쀄에 κ±Έμ³μ„œ 두 개의 μžμ—°μˆ˜ A, Bκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ 주어진닀.
    μ΄λŠ” A번 λ„μ‹œμ—μ„œ B번 λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ” 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λŠ” μ˜λ―Έλ‹€. (1 ≤ A, B ≤ N)
    단, A와 BλŠ” μ„œλ‘œ λ‹€λ₯Έ μžμ—°μˆ˜μ΄λ‹€.



    [좜λ ₯]

    Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λͺ¨λ“  λ„μ‹œμ˜ 번호λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•œλ‹€.
    이 λ•Œ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λ„μ‹œκ°€ ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ -1을 좜λ ₯ν•œλ‹€.

     




    [Solution]
    - BFS(λ„ˆλΉ„μš°μ„ νƒμƒ‰) 문제
    - N은 μ΅œλŒ€ 300,000 M은 μ΅œλŒ€ 1,000,000 μ΄λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„ O(1,300,000)

    package boj18352_νŠΉμ •κ±°λ¦¬μ˜λ„μ‹œμ°ΎκΈ°;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
    
    public class Main {
       public static void main(String[] args) {
          Scanner s = new Scanner(System.in);
          
          int n = s.nextInt();   //λ„μ‹œμ˜ 개수
          int m = s.nextInt();   //λ„λ‘œμ˜ 개수
          int k = s.nextInt();   //거리 정보
          int x = s.nextInt();   //좜발 λ„μ‹œμ˜ 번호
          
          int[] distance = new int[300001];
          ArrayList<ArrayList<Integer>> linkLst = new ArrayList<ArrayList<Integer>>();
          
          //INIT link list & distance Array
          for(int i=0; i<=n; i++) {
             linkLst.add(new ArrayList<Integer>());
             distance[i] = -1;
          }
          
          distance[x] = 0;   //μΆœλ°œλ„μ‹œ->μΆœλ°œλ„μ‹œ 거리
          
          for(int i=0; i<m; i++) {
             int a = s.nextInt();
             int b = s.nextInt();
             
             linkLst.get(a).add(b);   //a->b 단방ν–₯
          }
          
          //BFS
          Queue<Integer> queue = new LinkedList<Integer>();
          queue.add(x);         //μΆœλ°œλ„μ‹œx
          
          while(!queue.isEmpty()) {
             int tmp = queue.poll();
             
             for(int i=0; i<linkLst.get(tmp).size(); i++) {
                int next = linkLst.get(tmp).get(i);
                
                //λ°©λ¬Έν•œμ  μ—†μœΌλ©΄
                if(distance[next] == -1) {
                   distance[next] = distance[tmp]+1;   //μΆœλ°œλ„μ‹œμ—μ„œ nextλ„μ‹œκΉŒμ§€ 거리
                   queue.add(next);
                }
             }
          }
          
          //μ΅œλ‹¨κ±°λ¦¬==k check, λ„μ‹œλ²ˆν˜Έ print
          boolean chk = false;
          for(int i=0; i<=n; i++) {
             if(distance[i] == k) {
                System.out.println(i);
                chk = true;
             }
          }
          if(!chk) System.out.println(-1);
       }
    }
    λ°˜μ‘ν˜•
Designed by Tistory.