https://www.acmicpc.net/problem/13023

직접 종이에 예제의 트리를 그려보니까, 백트래킹으로 풀 수 있는 문제라고 생각했다. n명한테 모두 DFS를 돌려서 한명이라도 저런 친구 관계가 있으면 break하고 1을 출력하면 된다. 없으면 최종적으로는 0을 출력한다.
처음 DFS를 돌릴 때 깊이를 1로 두고, 깊이가 5 이상이 되면 저 친구 관계가 성립하는 것이다.
처음에 사람 수 만큼 DFS를 돌릴 때 visted배열 초기화를 안 해서 틀렸었다. 이 부분을 조심하자.
#include <iostream>
#include <vector>
using namespace std;
int n, m;
vector<int> vec[2000];
vector<bool> visited(2000, false);
bool dfs(int x, int dis) {
if (dis >= 5) return true; // 깊이가 5 이상이면 종료
visited[x] = true;
for (size_t i = 0; i < vec[x].size(); i++) {
int node = vec[x][i];
if (!visited[node]) {
if (dfs(node, dis + 1)) {
return true;
}
}
}
visited[x] = false; // 백트래킹
return false;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cin >> n >> m;
int a, b;
for (int i = 0; i < m; i++) {
cin >> a >> b;
vec[a].push_back(b);
vec[b].push_back(a);
}
int ans = 0;
for (int i = 0; i < n; i++) {
fill(visited.begin(), visited.end(), false); // `visited` 초기화. 이거 안해줘서 틀렸었다.
if (dfs(i, 1)) {
ans = 1;
break;
}
}
cout << ans;
return 0;
}