말랑말랑한 개발자 이야기

[백준 13023번] ABCDE 본문

알고리즘/백준

[백준 13023번] ABCDE

말랑너구리 2021. 6. 22. 09:14

[백준 13023번] ABCDE

www.acmicpc.net/problem/13023

 

13023번: ABCDE

문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.

www.acmicpc.net

 

 

 문제

 BOJ 알고리즘 캠프에는 총 N명이 참가하고 있다. 사람들은 0번부터 N-1번으로 번호가 매겨져 있고, 일부 사람들은 친구이다.

 오늘은 다음과 같은 친구 관계를 가진 사람 A, B, C, D, E가 존재하는지 구해보려고 한다.

  • A는 B와 친구다.
  • B는 C와 친구다.
  • C는 D와 친구다.
  • D는 E와 친구다.

 위와 같은 친구 관계가 존재하는지 안하는지 구하는 프로그램을 작성하시오.

 

 

 입력

 첫째 줄에 사람의 수 N (5 ≤ N ≤ 2000)과 친구 관계의 수 M (1 ≤ M ≤ 2000)이 주어진다.

 둘째 줄부터 M개의 줄에는 정수 a와 b가 주어지며, a와 b가 친구라는 뜻이다. (0 ≤ a, b ≤ N-1, a ≠ b) 같은 친구 관계가 두 번 이상 주어지는 경우는 없다.

 

 

 출력

 문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다.

 

 

 풀이

#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> arr[2000];
bool visit[2000] = {false,};
int target = 0;

void ff(int value, int cnt){
	// cout << cnt << ' ' << value << '\n';
	if(cnt == 4){
		target = 1;
		return;
	}
	
	for(int i=0;i<arr[value].size();i++){
		int k = arr[value][i];
		if(!visit[k]){
			visit[k] = true;
			if(target == 1) return;
			else ff(k, cnt + 1);
			visit[k] = false;
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> N >> M;
	for(int i=0;i<M;i++){
		int a, b;
		cin >> a >> b;
		arr[a].push_back(b);
		arr[b].push_back(a);
	}
	
	
	for(int i=0;i<N;i++){
		for(int i=0;i<N;i++) visit[i] = false;
		visit[i] = true;
		ff(i, 0);
		if(target == 1){
			cout << target;
			return 0;
		}
	}
	cout << target;
	return 0;
}

 모든 사람에 대해 친구관계의 DFS를 진행하면서 그 깊이가 4가 되면 문제에서 요구하는 바를 만족시키게 된다. a와 b가 친구라면 b와 a또한 친구이기 때문에 이 점 유의해주고 중복방지를 위해 방문처리를 해주고 늘 하던 DFS의 형식 for(true -> ff -> false) 로 계산해준다. 문제의 조건에 맞는 경우가 존재하면 그 즉시 종료하고 출력한다.

 

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 9847번] 4SUM  (0) 2021.09.14
[백준 19951번] 태상이의 훈련소 생활  (0) 2021.09.14
[백준 1976번] 여행가자  (0) 2021.06.22
[백준 20040번] 사이클 게임  (0) 2021.06.22
[백준 17836번] 공주님을 구해라!  (0) 2021.06.22