๋ฌธ์ : www.acmicpc.net/problem/2252
๋ถ์ :
์ด ๋ฌธ์ ๋ ์ข ๋ง๋ถ 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;
}
'Algorithm๐ฐ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 10818 ์ต์, ์ต๋ (0) | 2021.02.16 |
---|---|
[๋ฐฑ์ค] 2110 ๊ณต์ ๊ธฐ ์ค์น (0) | 2021.02.16 |
[๋ฐฑ์ค] 10828 stack (0) | 2021.02.06 |
[๋ฐฑ์ค] 1915 ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ DP (0) | 2021.02.05 |
[๋ฐฑ์ค] 1987 ์ํ๋ฒณ DFS (0) | 2021.02.05 |
๋๊ธ