깊이 우선 탐색 예제 - 3
Last updated
Last updated
n(노드 개수), m(에지 개수)
a(그래프 데이터 저장 인접 리스트)
visit(방문 기록 리스트)
arrive(도착 확인 변수)
dfs(현재 노드, 깊이):
if 깊이 == 5:
arrive = true
함수 종료
방문 리스트에 현재 노드 방문 기록
현재 노드의 연결 노드 중 방문하지 않은 노드 dfs 실행 (호출마다 깊이 +1)
for m 반복:
a 인접 리스트에 그래프 데이터 저장
for n 반복:
노드마다 dfs 실행
if(arrive):
반복문 종료 # 깊이가 5에 도달한 적이 있다면
if arrive:
1 출력
else:
0 출력import sys
sys.setrecursionlimit(10000)
input = sys.stdin.readline
n, m = map(int, input().split())
arrive = False
A = [[] for _ in range(n + 1)]
visit = [False] * (n + 1)
def dfs(node, depth):
global arrive
if depth == 5:
arrive = True
return
visit[node] = True
for i in A[node]:
if not visit[i]:
dfs(i, depth + 1)
visit[node] = False
for i in range(m):
a, b = map(int, input().split())
A[a].append(b)
A[b].append(a)
for i in range(n):
dfs(i, 1)
if arrive:
break
if arrive:
print(1)
else:
print(0)import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Integer>[] A;
static boolean[] visit;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
A = new ArrayList[n];
visit = new boolean[n];
for (int i = 0; i < n; i++) {
A[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
A[a].add(b);
A[b].add(a);
}
for (int i = 0; i < n; i++) {
dfs(i, 1);
}
System.out.println(0);
}
private static void dfs(int node, int depth) {
if (depth == 5) {
System.out.println(1);
System.exit(0);
}
visit[node] = true;
for (int next : A[node]) {
if (!visit[next]) {
dfs(next, depth + 1);
}
}
visit[node] = false;
}
}