1. ๋ฌธ์ ์ค๋ช
๋ฌธ์ ์ค๋ช ์ด ์กฐ๊ธ ์ง๊ด์ ์ด์ง ์์๋ฐ, A๋ ์น๊ตฌ์ ์น๊ตฌ๋ฅผ ํ๋ฌ๊ฐ์ E๊น์ง ์น๊ตฌ๊ฐ ๋๋ค. ์ฆ DFS๋ก ํ์ ๋, ๊น์ด๊ฐ 5๊น์ง ๊ฐ๋ ๊ด๊ณ๊ฐ ์๋์ง ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
2. ์ ๊ทผ ๋ฐฉ์
๋ฌธ์ ์ ๋์ ์๋ฏ์ด, ์์์ ์์ ๋ ธ๋๋ฅผ ์ ์ ํด์, ๊ฑฐ๊ธฐ์๋ถํฐ ๊น์ด๊ฐ 5์ธ DFS ์ฌ๊ท๊ฐ ์ฑ๋ฆฝํ๋ ๊ฒ ์์ผ๋ฉด 1, ๋ชจ๋ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋๋ก ๋๊ณ ํด๋, ๊น์ด๊ฐ 5์ธ ์ฌ๊ท๊ฐ ์ฑ๋ฆฝํ์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static ArrayList<Integer>[] lists;
static boolean [] isVisited;
static boolean isValid = false;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
lists = new ArrayList[N];
isVisited = new boolean[N];
for (int i = 0; i < N; i++) {
lists[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
lists[start].add(end);
lists[end].add(start);
}
for (int i = 0; i < N; i++) {
isVisited[i] = true;
dfs(0,i);
isVisited[i] = false;
if(isValid) break;
}
if(!isValid) System.out.println(0);
else System.out.println(1);
}
public static void dfs(int depth, int vertex) {
if(depth == 4){
isValid = true;
return;
}
for (int i = 0; i < lists[vertex].size(); i++) {
int next = lists[vertex].get(i);
if(!isVisited[next]){
isVisited[next] = true;
dfs(depth+1, next);
if(isValid) return;
isVisited[next] = false;
}
}
}
}
4. ์ฑ์ฅํ๊ธฐ
์๊ฐ ์ด๊ณผ๊ฐ ๋ ์ ์๋ ๋ฌธ์ ์์ ์๊ฐ์ด๊ณผ
ํน์ ํ๋ ธ์ต๋๋ค
๊ฐ ๋ฌ๋ค.
DFS๋ ์ต์
์ ์๊ฐ๋ณต์ก๋๊ฐ O(V+E)๋ก ํด๋น ๋ฌธ์ ์์๋ ์ ์ ์ด ์ต๋ 2000, ๊ฐ์ ์ด ์ต๋ 2000์ด๋ค. ์ต์
์ ๊ฒฝ์ฐ, ํด๋น DFS๋ฅผ ๋ชจ๋ ๋
ธ๋์ ๋ํด ์คํํด์ผํ๋, 4000*2000 = 8000000 ์ด ๋๋ค.
๊ทผ๋ฐ ๋๋ 2๊ฐ์ง ์ค์๋ฅผ ํด์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌ๋ค.
- ๊ธฐ์ ์กฐ๊ฑด์ ์ข
๋ฃ๋ฅผ
depth == 5
๋ก ๋์๋ค. ๊ทธ๋์ ๊น์ด๊ฐ 6์ธ ๊ฒ์ ์ฐพ์์ผ ๊ทธ๋ง๋๋ค. - ์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ์ง ์์๋ค.
๋ด ํ์ด์ ๊ฒฝ์ฐ, ๋ค์ Node ๋ค์ด๊ฐ๊ธฐ ์ ์, ํด๋น Node๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ ํ์์ผ๋ก ํ๋ค.
๊ทธ๋ฌ๋๊น ํ์ฌ ๋
ธ๋๊ฐ ์๋, ๋ค์ ๋
ธ๋๋ฅผ true ์ฒ๋ฆฌ ํ ๊ฒ์ด๋ค. ์ด๋ฐ ์์ผ๋ก ํ๋, ๋งจ ์ฒ์ ์์ ๋
ธ๋์ ๋ํ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ๋นผ๋จน์๋ค.
public static void dfs(int depth, int now) {
if(depth == 4 || isValid == true){
isValid = true;
return;
}
isVisited[now] = true;
for (int i = 0; i < lists[now].size(); i++) {
int next = lists[now].get(i);
if(!isVisited[next]){
dfs(depth+1, next);
}
}
isVisited[now] = false;
}
์ด๋ฐ ์์ผ๋ก ํ ๋
ธ๋์ ๋ํด ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค๋ฉด, ์์ ์ ์ ์ ๋์น ์ผ์ ์์ ๊ฒ์ด๋ค.
(์ด๊ฒ ์ซ๋ค๋ฉด, DFS ํจ์ ๋ค์ด์ค๊ธฐ ์ ์, ์์ ๋
ธ๋์ ๋ํ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.)