๐๐ปโโ๏ธ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๋ก ๋ณ๊ฒฝ๋๊ธฐ๋๋ฌธ์ด๋ค.