μ½”λ”©ν…ŒμŠ€νŠΈ

[DFS] 12. κ²½λ‘œνƒμƒ‰

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2024. 2. 8. 07:19

<<풀이>>

 

μ΄λ²ˆμ—λŠ” κ²½λ‘œνƒμƒ‰μ„ DFS λ°©μ‹μœΌλ‘œ ν’€μ—ˆλ‹€.

 

이번 1λ²ˆμ—μ„œ 5λ²ˆκΉŒμ§€ κ°€λŠ” 경둜 갯수λ₯Ό νƒμƒ‰ν•˜λŠ” 것인데

 

μš°μ„  1번이 갈 수 μžˆλŠ” 값이 κ°„μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” 자기 μžμ‹ μ„ μ œμ™Έν•œ 값이닀.

 

κ·Έ 값이 μžˆλ‹€λ©΄ κ·Έ κ°’μœΌλ‘œ 이동을 ν•˜κ³  λ˜‘κ°™μ€ κ°’μœΌλ‘œλŠ” 갈 수 없기에 ch(체크) 배열에 κ·Έκ°’κ³Ό 같은 μΈλ±μŠ€μ— 1을 μΆ”κ°€ν•΄μ€€λ‹€.

 

이번 문제λ₯Ό ν’€λ©΄μ„œ

DFS 방식은 DFS(n + 1) λ˜λŠ” DFS(2n) κ³Ό 이전 DFS(n)κ³Ό μ—°κ΄€(μ—°μ‚° λ“±)λ˜μ–΄ μ›€μ§μ˜€μ§€λ§Œ, μ΄λ²ˆμ—λŠ” 연관이 μžˆλ‹€κΈ° 보닀 λ§Œμ‘±ν•˜λŠ” 값이 λ“€μ–΄κ°€μ„œ μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆλ‹€. 

 

μ΄λ ‡κ²Œ μ—¬λŸ¬κ°€μ§€ DFSλ₯Ό λ³΄λ‹ˆ 쑰금 더 감을 μž‘μ„ 수 μžˆλŠ” 계기가 λ˜μ—ˆλ‹€!!

import java.util.Scanner;

class Main {
  

    static int n, m, answer = 0;
    static int[][] arr;
    static int[] ch;
    public void DFS(int v) {
        if(v == n) answer++;
        else {
            for (int i = 0; i <= n ; i++) {
                if(arr[v][i] == 1 && ch[i] == 0) {
                    ch[i] = 1;
                    DFS(i);
                    ch[i] = 0;
                }
                
            }
        }
    }
    

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        arr = new int[m + 1][m + 1];
        n = in.nextInt();
        m = in.nextInt();
        ch = new int[j + 1];

        for(int i = 0; i < m; i++) {
            int a = in.nextInt();
            int b = in.nextInt();
            arr[a][b] = 1;
        }
        ch[1] = 1;
        T.DFS(1);

        System.out.println(answer);
    }
}