BOJ 알고리즘 캠프에는 총 N명이 참가하고 있다. 사람들은 0번부터 N-1번으로 번호가 매겨져 있고, 일부 사람들은 친구이다.
오늘은 다음과 같은 친구 관계를 가진 사람 A, B, C, D, E가 존재하는지 구해보려고 한다.
첫째 줄에 사람의 수 N (5 ≤ N ≤ 2000)과 친구 관계의 수 M (1 ≤ M ≤ 2000)이 주어진다.
둘째 줄부터 M개의 줄에는 정수 a와 b가 주어지며, a와 b가 친구라는 뜻이다. (0 ≤ a, b ≤ N-1, a ≠ b) 같은 친구 관계가 두 번 이상 주어지는 경우는 없다.
문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.
5 4
0 1
1 2
2 3
3 4
1
5 5
0 1
1 2
2 3
3 0
1 4
1
6 5
0 1
0 2
0 3
0 4
0 5
0
8 8
1 7
3 7
4 7
3 4
4 6
3 5
0 4
2 7
1
처음에는 문제를 잘 이해하지 못했다.
A - B - C - D - E 이렇게 친구가 되어야 된다는 소린데, 처음에는 BFS를 활용해서 해결하려했다.
그냥 BFS는 크나큰 문제가 있었다.
예를 들어
0 - 1 - 2 - 4 - 5
ㅣ
3
0에서 1과 3을 담고 visited[0]을 true로 만든 다음, 1과 3으로 넘어갔을 때 1은 2와 4 쪽으로 넘어갈 수 있지만 3은 끝이기 때문에 visited[1]을 True로 만들어버리면 돌아갈 방도가 없다. 백트래킹을 적용할 수가 없다.
따라서 재귀함수를 써야한다.
deque()를 쓰지 않고 재귀함수를 써서 넘어가게 되면 depth도 쉽게 쌓을 수 있다.
from collections import defaultdict
N, M = map(int, input().split())
dic = defaultdict(list)
for _ in range(M):
a, b = map(int, input().split())
dic[a].append(b)
dic[b].append(a)
def dfs(cur, depth):
if depth == 4:
print(1)
exit()
for nxt in dic[cur]:
if visited[nxt]:
continue
visited[nxt] = True
dfs(nxt, depth + 1)
visited[nxt] = False
for i in range(N):
visited = [False] * N
visited[i] = True
dfs(i, 0)
print(0)