๐๐ปโโ๏ธDFS ์ด์ฉ!
N,M์ ์ต๋๋ฒ์๊ฐ 2000์ด๋ฏ๋ก ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ผ์ ๋ ์๊ฐ๋ณต์ก๋๋ O(4000)์ด๋ค.
์ด๋ฅผ ๋ชจ๋ ๋
ธ๋์ ์งํํ์๋ 2000 * 4000 = 8000000์ด๋ฏ๋ก DFS๋ฅผ ์ฌ์ฉํด๋ ๋๋ค.์ฃผ์ด์ง ๋ชจ๋ ๋
ธ๋์ DFS ์ํ์ฌ๊ท์ ๊น์ด๊ฐ 5์ด์(5๊ฐ์ ๋
ธ๋๊ฐ ์ฌ๊ท ํํ๋ก ์ฐ๊ฒฐ)์ด๋ฉด 1, ์๋๋ฉด 0์ ์ถ๋ ฅํ๋ค.
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
freind = new ArrayList[N];
for(int i =0; i<N; i++) {
freind[i] = new ArrayList<>();
}
sc.nextLine();
for(int i =0; i<M; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
freind[a].add(b);
freind[b].add(a);
sc.nextLine();
}
visited = new boolean[N];
for(int i =0; i<N; i++) {
int answer = DFS(i,1);
if(answer == 1) {
System.out.println("1");
return;
}
for(int j=0; j<N; j++) {
visited[j] = false;
}
}
System.out.println("0");
return;
}
public static int DFS(int person,int depth){
if(depth == 5) {
return 1;
}
visited[person] = true;
for(int i : freind[person]) {
if(!visited[i]) {
depth++;
DFS(i,depth);
}
}
return 0;
}
}
์ด๋ค ์์ ๋ฅผ ๋ฃ๋ ๋ฌด์กฐ๊ฑด 0์ด ์ถ๋ ฅ๋๋ค.
์ด๋ค ํ๋์ ๋ฃจํธ๋ฅผ ์ญ ๊ฒ์ฌํ๋ค๊ฐ, ์น๊ตฌ๊ฒ์ฌ๊ฐ ๋ค ๋๋์ depth๋ฅผ ํ๋ ์ด์ ์ผ๋ก ๊ฐ์ ๊ทธ ๋ค์๋ถ๋ถ์ ๊ฒ์ฌํ ๋๋ depth๋ ๋์ผํ๊ฒ -1์ด ๋์ด์ผํ๋๋ฐ, ๊ทธ๋ ์ง์๊ณ ์ด๋ค ์ํฉ์ด๋ depth๊ฐ ๊ณ์ ๋์ ๋์ด์ ๊ฐ๋ฅํ์ง์์๊ฒฝ์ฐ์๋ depth๊ฐ ๋์ ๋๋ฉฐ, ๊ฒ์ฌํ๋ ๊ฒฝ์ฐ์์๊ฐ 5๋ฒ ์ด๊ณผ์ด๋ฉด ๋ง์ง๋ง์ค์ return 0
์ด ์คํ๋ผ์ ๊ทธ๋ฐ๊ฒ์ด๋ค.
for๋ฌธ ๋ด์์ depth ๋ณ์๋ฅผ ๊ฐฑ์ ํ๊ณ ๊ทธ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ๋ ํ์๋ ์ํํ๋ค!!
DFS๋ฅผ ์ฌ๊ทํธ์ถํ ๋, ํ๋ผ๋ฏธํฐ์์ ๊ฐ์ ๊ณ์ฐํ๊ณ , ๊ฐฑ์ ํด์ฃผ๋์ผ์ ํ์ง๋ง์.
DFS(i,depth+1)
๋ก ์์ ํ๋ค.
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
freind = new ArrayList[N];
for(int i =0; i<N; i++) {
freind[i] = new ArrayList<>();
}
sc.nextLine();
for(int i =0; i<M; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
freind[a].add(b);
freind[b].add(a);
sc.nextLine();
}
visited = new boolean[N];
for(int i =0; i<N; i++) {
int answer = DFS(i,1);
if(answer == 1) {
System.out.println("1");
return;
}
for(int j=0; j<N; j++) {
visited[j] = false;
}
}
System.out.println("0");
return;
}
public static int DFS(int person,int depth){
if(depth == 5) {
return 1;
}
visited[person] = true;
for(int i : freind[person]) {
if(!visited[i]) {
DFS(i,depth+1);
}
}
return 0;
}
}
๊ทธ๋๋ ์ฌ์ ํ 1์ด ๋์์ผํ๋ ์์ ์์ 0์ด ์ถ๋ ฅ๋๋ค.
depth๊ฐ 5๋ฅผ ์ฐ์ผ๋ฉด return1์ด ๋๊ณ , ๊ทธ ํ ์ฌ๊ทํธ์ถ์ ๋น ์ ธ๋์ค๋ฉฐ ์ด์ depth๋ค์ด ์ ์ฉ๋์ด ์ต์ข ์ ์ผ๋ก 0์ด ์ถ๋ ฅ๋๋๊ฒ์ด์๋ค.
DFS๋ฅผ ํธ์ถํ๋ฉฐ, ํ ๋ฒ 1์ ์ฐ์ํ์๋ ๊ณ์ return 1
์ ์ ์งํ ์ ์๋๋ก, DFS ์ฌ๊ทํธ์ถ์ ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๊ณ , ํด๋น ๊ฒฝ์ฐ์๋ return 1์ด ๋๋๋ก ํ๋ค.
if(DFS(i,depth+1) ==1) {
return 1;
}
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
freind = new ArrayList[N];
for(int i =0; i<N; i++) {
freind[i] = new ArrayList<>();
}
sc.nextLine();
for(int i =0; i<M; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
freind[a].add(b);
freind[b].add(a);
sc.nextLine();
}
visited = new boolean[N];
for(int i =0; i<N; i++) {
int answer = DFS(i,1);
if(answer == 1) {
System.out.println("1");
return;
}
for(int j=0; j<N; j++) {
visited[j] = false;
}
}
System.out.println("0");
return;
}
public static int DFS(int person,int depth){
if(depth == 5) {
return 1;
}
visited[person] = true;
for(int i : freind[person]) {
if(!visited[i]) {
if(DFS(i,depth+1) ==1) {
return 1;
}
}
}
return 0;
}
}
์์ ๋ ๋ค ๋ง์๋๋ฐ, ๋ฐฑ์ค์์ ํ๋ ธ๋ค.
depth5๊น์ง ๊ฒ์ฌ๋ฅผ ์งํํ๋๋ฐ, ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ์ด์ ์ฌ๊ทํธ์ถ(depth == 4)๋ก ๋์๊ฐ์ ๋ค์ ๋ ธ๋๋ฅผ ๊ฒ์ฌํ๋ค. ์ด๋ ๊ฒ ๋์๊ฐ ๊ฒฝ์ฐ์๋ depth๋ง ์ค์ด๋ค๊ฒ์๋๋ผ depth๊ฐ 4์ธ ์ด์ ๋ ธ๋๊ฐ false๋ก ๋ฐ๋์ด์ผํ๋ค. ๊ทธ๋ ์ง์์ผ๋ฉด ์ดํ๊ฒ์ฌ์์ ํด๋น ๋ ธ๋๊ฐ ๊ณ์ ์ ์ธ๋๊ธฐ๋๋ฌธ์ด๋ค.
DFS์์ ๋ง์ง๋ง์ return 0
ํ๊ธฐ์ ์ ํด๋น ๋
ธ๋์์ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ, DFS ํธ์ถ์ True๋ก ๋ฐ๊พธ์๋ ๋ฐฉ๋ฌธ๋ฐฐ์ด์ ํด๋น๋
ธ๋๋ฅผ ๋ค์ false๋ก ๋ฐ๊ฟ์ฃผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
visited[person] = false;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static ArrayList<Integer>[] freind;
static boolean[] visited;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
freind = new ArrayList[N];
for(int i =0; i<N; i++) {
freind[i] = new ArrayList<>();
}
sc.nextLine();
for(int i =0; i<M; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
freind[a].add(b);
freind[b].add(a);
sc.nextLine();
}
visited = new boolean[N];
for(int i =0; i<N; i++) {
int answer = DFS(i,1);
if(answer == 1) {
System.out.println("1");
return;
}
for(int j=0; j<N; j++) {
visited[j] = false;
}
}
System.out.println("0");
return;
}
public static int DFS(int person,int depth){
if(depth == 5) {
return 1;
}
visited[person] = true;
for(int i : freind[person]) {
if(!visited[i]) {
if(DFS(i,depth+1) ==1) {
return 1;
}
}
}
visited[person] = false;
return 0;
}
}
mainํจ์์ for๋ฌธ์์ DFS๋ฅผ ์คํํ๊ณ ๋ ํ visited๋ฅผ false๋ก ์ด๊ธฐํ์์ผ์ฃผ๋๋ฐ, ์ด ์์
์ ํ์์๋ค.
depth 5๋ฅผ ์ฐ์ ๋
ธ๋๋ True๋ก ๋จ๊ฒ ์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ด์ DFS๋ฅผ ํธ์ถํ์ง์๊ธฐ๋๋ฌธ์ ๊ทธ ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ๋์ง์์ผ๋ฉฐ, depth 5๋ฅผ ์ฐ์ง์์์ ๋ ๊ฒ์ฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ DFSํจ์์ ๋ง์ง๋ง์ visited[person] = false;
๋ฅผ ํ๊ธฐ๋๋ฌธ์ ๊ฒฐ๊ตญ depth5๋ฅผ ์ ์ธํ ๋ชจ๋ ๋
ธ๋๋ค์ false๋ก ๋ณ๊ฒฝ๋๊ธฐ๋๋ฌธ์ด๋ค.