알고리즘

[DFS] 인접 행렬, 인접 리스트

keepgoing 2023. 4. 19. 13:29

세가지 그래프

방향 그래프

무방향 그래프

가중치 그래프

 

인접 행렬

문제 유형

1) 방향그래프가 주어지고 1번에서 N번으로 가는 모든 경로의 가지 수를 구하시오.

필요 자료구조

- 중복 탐색을 방지하기 위한 check 배열, check 배열은 n+1 크기를 갖는다(1 ~ n)

- 간선 설정을 위한 graph 2차원 배열(행, 열 모두 n+1 크기)

- n개의 정점과, m개의 간선 수 설정

- 문제를 해결하기 위한 DFS 메서드 구현 로직

 

핵심 로직

public void DFS(int val){
	if(val = n) answer++;
    else{
    	for(int i = 1; i <= n; i++){
        	if(graph[v][i] == 1 && ch[i] == 0){
            	ch[i] = 1;
                DFS(i+1);
                ch[i] = 0; // 백트래킹
            }
        }
    }
}

 

인접리스트

문제 유형

1) 방향그래프가 주어지고 1번에서 N번으로 가는 모든 경로의 가지 수를 구하시오.

 

장점 ) 인접 행렬보다 시간복잡도가 낮다.

 

필요 자료구조

- 중복 탐색을 방지하기 위한 check 배열

- 간선 설정을 위한 graph ArrayList 초기화

ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayLst>();

for(int i = 0; i <= n; i++){ // 정점 수 만큼 초기화
	graph.add(new ArrayList<Integer>);
}

for(int i = 0; i < m; i++){ // 간선 들 초기화
  	int a = in.nextInt();
	int b = in.nextInt();

    graph.get(a).add(b);
}

- n개의 정점과, m개의 간선 수 설정

- 문제를 해결하기 위한 DFS 메서드 구현 로직

public void DFS(int val){
        if(val == n) answer++;
        else{
            for(int nx : graph.get(val)){
                if(ch[nx] == 0) {
                    ch[nx] = 1;
                    DFS(nx);
                    ch[nx] = 0;
                }
            }
        }
    }