https://www.acmicpc.net/problem/13023
13023번: ABCDE
문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.
www.acmicpc.net
코드설명
DFS(깊이우선탐색) + 브루트포스(bruteforce) 문제입니다.
문제에서 주어진
- A는 B와 친구다.
- B는 C와 친구다.
- C는 D와 친구다.
- D는 E와 친구다.
이 관계를 정의해보면, 즉 5명이 연속으로 친구인지 확인하는 문제입니다.
그렇기에 DFS로 깊이우선탐색하며 5명이지만 관계는 4번이므로 4번 탐색을 완료하면 성공한 사례입니다.
모든 관계를 확인하기 위해 0번 사람, 1번 사람, 2번 사람... 각각 의 사람별로 시작점을 모두 진행해줍니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { public static int N, M, T; public static int[] alphabet; public static int answer = 0; public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>(); public static boolean[] visited; 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()); visited= new boolean[N]; for(int i=0;i<N;i++) { graph.add(new ArrayList<Integer>()); } for(int i=0;i<M;i++) { st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); graph.get(a).add(b); graph.get(b).add(a); } for(int i=0;i<N;i++) { visited= new boolean[N]; visited[i] = true; simulate(0, i); if(answer == 1) break ; } System.out.println(answer); } public static void simulate(int level, int idx) { if(level == 4) { answer = 1; return ; } for(int i=0;i<graph.get(idx).size();i++) { int friend = graph.get(idx).get(i); if(visited[friend] == false) { visited[friend] = true; simulate(level + 1, friend); visited[friend] = false; } } } }