문제 풀이/문제 풀이(BOJ)

[Gold V] ABCDE - 13023

풀뿌리 2024. 6. 27. 15:41

[문제 위치]

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

[문제 풀이]

DFS 문제이며 백트래킹 문제이다.

모든 사람들을 돌며 DFS 5단계까지 들어갈 수 있는지 확인하고 5가 된다면 탐색 종류 및 참 반환 그렇지 않다면 방문하지 않은 노드로 표시하며 재탐색 여부를 열어놓는 백트래킹을 실시한다.

 

아래는 그 코드이다.

#include <iostream>
#include <vector>
#include <cstring>

#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;

vector<int> people[2001]; // 친구 목록
bool visited[2001] = { 0 }; // 방문 여부

bool DFS(int start, int cnt) {
    visited[start] = true;
    cnt += 1;
    if (cnt == 5) {
        return true;
    }

    for (int next_node : people[start]) {
        if (!visited[next_node]) {
            if (DFS(next_node, cnt)) {
                return true;
            }
        }
    }
    visited[start] = false; // 백트래킹
    return false;
}

int main() {
    fastio;
    int N, M;
    cin >> N >> M;
    for (int i = 0; i < M; i++) {
        int P1, P2;
        cin >> P1 >> P2;
        people[P1].push_back(P2);
        people[P2].push_back(P1); // 친구 관계는 양방향
    }

    for (int i = 1; i <= N; i++) {
        memset(visited, 0, sizeof(visited)); // 방문 여부 초기화
        if (DFS(i, 0)) {
            cout << 1 << endl;
            return 0;
        }
    }

    cout << 0 << endl;
    return 0;
}