[BOJ] 2623번 | μŒμ•…ν”„λ‘œκ·Έλž¨ (C++)

2023. 12. 19. 15:48ㆍCoding Test/BOJ

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

2623번: μŒμ•…ν”„λ‘œκ·Έλž¨

첫째 μ€„μ—λŠ” κ°€μˆ˜μ˜ 수 Nκ³Ό 보쑰 PD의 수 M이 주어진닀. κ°€μˆ˜λŠ” λ²ˆν˜Έ 1, 2,…,N 으둜 ν‘œμ‹œν•œλ‹€. λ‘˜μ§Έ 쀄뢀터 각 보쑰 PDκ°€ μ •ν•œ μˆœμ„œλ“€μ΄ ν•œ 쀄에 ν•˜λ‚˜μ”© λ‚˜μ˜¨λ‹€. 각 μ€„μ˜ 맨 μ•žμ—λŠ” 보쑰 PDκ°€ λ‹΄λ‹Ήν•œ

www.acmicpc.net

 

πŸ§‘‍πŸ’»ν’€μ΄ κ³Όμ •

 

μœ„μƒ 정렬을 μ‚¬μš©ν•΄ ν’€ 수 μžˆλŠ” 문제인데, 사이클(Cycle) 감지 쑰건을 ν•˜λ‚˜ 더 λ„£μ–΄μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. μˆœμ„œλ₯Ό μ •ν•˜λŠ” 게 λΆˆκ°€λŠ₯ν•œ κ²½μš°λŠ” 각 κ°€μˆ˜λ“€μ˜ μˆœμ„œμ— 사이클이 μžˆλŠ” κ²½μš°κ°€ λ©λ‹ˆλ‹€. μ΄λŠ” λͺ¨λ“  λ…Έλ“œλ₯Ό 돌기 전에 큐(Queue)κ°€ λΉ„μ—ˆμ„ 경우둜 탐지 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

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

using namespace std;
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);

vector<int> Solution(const vector<vector<int>>& graph, vector<int>& inDegrees, int N) {
    vector<int> answers(N + 1);
    queue<int> nextSingers;

    for (int i = 1; i <= N; i++)
        if (inDegrees[i] == 0)
            nextSingers.push(i);
    
    for (int i = 1; i <= N; i++) {
        if (nextSingers.empty())
            return {0, 0};
        
        int singer = nextSingers.front();
        answers[i] = singer;
        nextSingers.pop();

        for (const auto& other : graph[singer]) {
            if (--inDegrees[other] == 0)
                nextSingers.push(other);
        }
    }

    return answers;
}

int main() {
    FAST_IO
    int N, M, singerCount;
    cin >> N >> M;

    vector<vector<int>> graph(N + 1, vector<int>());
    vector<int> inDegrees(N + 1, 0);

    for (int i = 0; i < M; i++) {
        cin >> singerCount;
        int from, to;

        for (int i = 0; i < singerCount; i++) {
            cin >> to;

            if (i == 0) {
                from = to;
                continue;
            }

            graph[from].emplace_back(to);
            inDegrees[to]++;
            from = to;
        }
    }

    vector<int> answers = Solution(graph, inDegrees, N);
    for (int i = 1; i < answers.size(); i++)
        cout << answers[i] << "\n";

    return 0;
}

 

 

728x90
λ°˜μ‘ν˜•