본문 바로가기
Problem solving/BOJ

[BOJ] 18352. 특정 거리의 도시 찾기 (C++)

by 겸 2023. 7. 22.

문제

어떤 나라에는 1번부터 N번까지의 도시와 M개의 단방향 도로가 존재한다. 모든 도로의 거리는 1이다

X로부터 출발하여 도달할 수 있는 도시 중, 최단 거리가 K인 도시의 번호 출력, 없으면 -1 출력

생각할 것

모든 도로의 거리가 1이므로 가중치가 모두 동일하다!

따라서 BFS를 사용하면 된다

코드

1. BFS

BFS는 그냥 큐를 이용한다! 한번씩만 업데이트하므로 visited대신 dist가 INF인지 확인하면 된다.

#include <iostream>
#include <vector>
#include <queue>

#define INF 1e9

using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int N, M, K, X, A, B;
    cin >> N >> M >> K >> X;

    vector<vector<int>> adj(N + 1);
    for (int i = 0; i < M; i++) {
        cin >> A >> B;
        adj[A].push_back(B);
    }

    queue<int> q;
    vector<int> dist(N + 1, INF);

    q.push(X);
    dist[X] = 0;

    while (!q.empty()) {
        int cur = q.front();
        q.pop();

        for (int i = 0; i < adj[cur].size(); i++) {
            int next = adj[cur][i];
            if (dist[next] != INF) continue;
            dist[next] = dist[cur] + 1;
            q.push(next);
        }
    }

    int count = 0;
    for (int i = 1; i <= N; i++) {
        if (dist[i] == K) {
            cout << i << "\\n";
            count++;
        }
    }

    if (count == 0) cout << -1;

    return 0;
}

2. 다익스트라

다익스트라는 우선순위 큐를 사용한다. (이 문제에서는 가중치가 없어서 필요 없지만..!)

#include <iostream>
#include <vector>
#include <queue>

#define INF 1e9

using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int N, M, K, X, A, B;
    cin >> N >> M >> K >> X;

    vector<vector<int>> adj(N + 1);
    for (int i = 0; i < M; i++) {
        cin >> A >> B;
        adj[A].push_back(B);
    }

    priority_queue<int> pq;
    vector<int> dist(N + 1, INF);

    pq.push(X);
    dist[X] = 0;
    while (!pq.empty()) {
        int cur = pq.top();
        pq.pop();

        for (int i = 0; i < adj[cur].size(); i++) {
            int next = adj[cur][i];
            if (dist[next] > dist[cur] + 1) {
                dist[next] = dist[cur] + 1;
                pq.push(next);
            }
        }
    }

    int count = 0;
    for (int i = 1; i <= N; i++) {
        if (dist[i] == K) {
            cout << i << "\\n";
            count++;
        }
    }

    if (count == 0) cout << -1;

    return 0;
}
반응형