๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 2252 ์ค„์„ธ์šฐ๊ธฐ

by Jouureee 2021. 2. 14.

๋ฌธ์ œ : www.acmicpc.net/problem/2252

 

2252๋ฒˆ: ์ค„ ์„ธ์šฐ๊ธฐ

์ฒซ์งธ ์ค„์— N(1≤N≤32,000), M(1≤M≤100,000)์ด ์ฃผ์–ด์ง„๋‹ค. M์€ ํ‚ค๋ฅผ ๋น„๊ตํ•œ ํšŒ์ˆ˜์ด๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ํ‚ค๋ฅผ ๋น„๊ตํ•œ ๋‘ ํ•™์ƒ์˜ ๋ฒˆํ˜ธ A, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” ํ•™์ƒ A๊ฐ€ ํ•™์ƒ B์˜ ์•ž์— ์„œ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด

www.acmicpc.net

๋ถ„์„ :

์ด ๋ฌธ์ œ๋Š” ์ข…๋งŒ๋ถ DFS BFS ๋ถ€๋ถ„์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ œ ์ค‘ ์œ„์ƒ ์ •๋ ฌ์— ๊ด€ํ•œ ๋ฌธ์ œ์˜€๋‹ค.

์œ„์ƒ ์ •๋ ฌ์ด๋ž€ ์˜์กด์„ฑ์ด ์žˆ๋Š” ์ž‘์—…์ด ์ฃผ์–ด์งˆ ๋•Œ ์ด๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•œ๋‹ค.

์ด๋•Œ ์˜์กด ๊ด€๊ณ„๋ฅผ DAG(์‚ฌ์ดํด ์—†๋Š” ๊ทธ๋ž˜ํ”„) ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ์‚ฌ์ดํด์ด ์—†๋‹ค๋Š” ๋œป์€ ์ฆ‰ ํ•œ ๋ฐฉํ–ฅ์—์„œ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€๋Š” ๊ผด์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด DFS BFS ๋Š” ํŠธ๋ฆฌ ๋…ธ๋“œ์— ๊ฐ„์„ ์„ ํ‘œ์‹œํ•  ๋•Œ ์„œ๋กœ๊ฐ€ ์„œ๋กœ์— ๋Œ€ํ•ด ์˜์กดํ•˜๊ฒŒ๋”(-> <-) ํ•œ ๋’ค ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์—ˆ๋Š”๋ฐ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„  ์ฆ‰ indegree๋งŒ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

indegree๊ฐ€ 0์ด ๋˜๋ฉด queue์— push ๋ฅผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  q๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋™์•ˆ ๋…ธ๋“œ์— indegree๊ฐ€ ๋‚จ์•„ ์žˆ๋‹ค๋ฉด for๋ฌธ์„ ํ†ตํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ indegree๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚จ๋‹ค. ๋‹ค ๋Œ๊ณ  indegree๊ฐ€ ๊ฒฐ๊ตญ 0 ์ด๋˜๋ฉด ์ดˆ๊ธฐ indegree๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ queue์— ๋„ฃ์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ queue์— ๋„ฃ์–ด ์ค€๋‹ค. 

 

c++ ์ฝ”๋“œ :

//
//  2252_line.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/02/08.
//

#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>

#define INTMAX 32001

using namespace std;

void line(){
    int N, n;
    //input
    cin >> N >> n;
    queue<int> q;
    vector<int> arr[INTMAX];
    int indegree[N+1];

    for(int i = 0; i < N+1; i++){ // indegree ์ดˆ๊ธฐํ™”
        indegree[i] = 0;
    }

    int s1, s2;
    for(int i = 0; i< n; i++){
        cin >> s1 >> s2; // ํ‚ค ๋น„๊ตํ•œ ๋‘ ํ•™์ƒ
        indegree[s2]++; // ๋“ค์–ด์˜จ ๊ฒƒ๋งŒ ๊ธฐ๋กํ•˜๋ฉด ๋˜๋ฏ€๋กœ ํ•˜๋‚˜๋งŒ ์ €์žฅ
        arr[s1].push_back(s2);
    }

    for(int i = 1; i < N+1; i++){//์ดˆ๊ธฐ indegree 0 ์ธ๊ฒƒ == ๊ฒ€์‚ฌ ๋Œ€์ƒ 
        if(indegree[i] == 0){
            q.push(i); // indegree 0 ๋˜๋ฉด์€ q์— push
        }
    }

    while(!q.empty()){
        int temp = q.front(); //1
        q.pop();
        cout << temp << " ";
        for(int i = 0; i < (int)arr[temp].size(); i++){
            indegree[arr[temp][i]]--;
            if(indegree[arr[temp][i]] == 0) q.push(arr[temp][i]);
        }

    }
    cout << endl;

}


int main(){
    line();
    return 0;
}

 

๋Œ“๊ธ€