알고리즘 문제풀기/인프런 강의 정답

64. 경로탐색 (그래프 DFS : Depth First Search) [재귀 & 깊이/넓이 우선탐색(DFS, BFS)]

코다람쥐 2022. 5. 10. 14:02

나의정답.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>

int cnt = 0;
int** copyMap(int** map, int size) {
	int** tmp = new int* [size];
	for (int i = 0; i < size; i++)
		tmp[i] = new int[size];

	for (int i = 0; i < size; i++) {
		for (int j = 0; j < size; j++) {
			tmp[i][j] = map[i][j];
		}
	}
	return tmp;
}

void dfs(int curNode, int** map, int targetNode) {
	int size = targetNode + 1;
	int** tmp = new int* [size];
	for (int i = 0; i < size; i++)
		tmp[i] = new int[size];

	if (curNode == targetNode) {
		cnt++;
	}
	else {
		for (int j = 0; j < size; j++) {
			tmp = copyMap(map, size);

			if (map[curNode][j] == 1) {
				for (int i = 0; i < size; i++)
					tmp[i][curNode] = 0;
				dfs(j, tmp, targetNode);
			}	
		}
	}

	for (int i = 0; i < size; i++)
		delete[] tmp[i];
	delete[] tmp;
}

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);

	int n, m, a, b, i, j;
	scanf("%d %d", &n, &m);

	// 인접행렬 생성
	int** map = new int*[n];
	for (i = 0; i < n; i++)
		map[i] = new int[n];

	// 인접행렬 0으로 초기화
	for (i = 0; i < n; i++)
		for (j = 0; j < n; j++)
			map[i][j] = 0;

	// 간선 연결
	for (i = 0; i < m; i++) {
		scanf("%d %d", &a, &b);
		map[a - 1][b - 1] = 1;
	}
	
	dfs(0, map, n - 1);

	printf("%d", cnt);

	for (i = 0; i < n; i++)
		delete[] map[i];
	delete[] map;
}