코딩테스트/기타

[인접 행렬] 경로탐색 java

머밍 2024. 11. 14. 22:21

문제

방향그래프가주어지면 1번 정점에서 N번 정점으로 가는 모든 경로의 가지수를 출력하는 프로그램을 작성하세요

아래 그래프에서 1번 정점에서 N번 정점으로 가는 가지수는

 

1 2 3 4 5

1 2 5

1 3 4 2 5

1 3 4 5

1 4 2 5

1 4 5

총 6가지입니다

 

 

 

입력

첫째 줄에는 정점의 수  N(1<=N<=20)  와 간선의 수  M 가 주어진다

그 다음부터  M 줄에 걸쳐 연결정보가 주어진다

 

출력

총가지수 출력한다.

 

입력

5 9

1 2

1 3

1 4 

2 1

2 3

2 5

3 4

4 2

4 5

 

출력 

6

 

내 풀이 

예시 설명

 

 

1번 정점에서 5번 정점으로 가는 모든 경우의 수를 출력

첫번째로 1 2 3 4 5 

-> DFS 재귀 및 백트래킹

-> dfs희 현재 노드에서 갈 수 있는 경우는 1,2,3,4,5번 노드 -> for문 5번

-> 이미 방문했다면 방문하지 않음 -> 방문 배열 생성

-> 종착점인 5번 정점으로 도달했다면 정답 1 증가, 백트래킹을 방문배열 초기화와 함께 진행

-> 연결된 노드에 이어서 진행

 

import java.util.Scanner;


public class Main {
    static int n, m, answer = 0;
    static int[][] graph;
    static int[] ch;//방문배열

    public static void dfs(int v) {
        if(v == n) answer++;//경우의 수 찾음
        else {
            for(int i = 1; i<=n; i++) {
                if(graph[v][i] == 1 && ch[i] != 1) {//갈 정점이 있으면
                    ch[i] = 1;//방문처리
                    dfs(i);//이어서 정점 방문
                    //백하는 시점
                    ch[i] = 0;//방문 취소
                }
            }
        }

    }

    public static void main(String[] args) {

        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();

        graph = new int[n+1][n+1];//n번 정점까지 나와야함
        ch = new int[n+1];
        for(int i= 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            graph[a][b] = 1;
        }
        ch[1] =1;//시작 정점 1 -> 방문처리
        T.dfs(1);

        System.out.print(answer);


    }

}