일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 리눅스
- SWIFT
- 독일어
- 분할정복
- 독학
- 부주상골수술
- IOS
- dp
- 세브란스
- 프로그래머스
- 카카오인턴십
- DFS
- c++
- 부주상골수술후기
- 카카오코테
- 부주상골증후군
- sql
- 코테
- 스택
- 구현
- ChatGPT
- 부주상골
- 롯데정보통신
- 코딩테스트
- 백준
- BFS
- SQLD
- istringstream
- 카카오인턴
- 독일어독학
Archives
- Today
- Total
슈뢰딩거의 고등어
[백준] 2252 줄 세우기 (위상 정렬, topology sort) 본문
https://www.acmicpc.net/problem/2252
위상정렬 (topology sort) 를 사용하면 쉽게 풀리는 문제이다.
위상정렬은 일의 우선순위가 있을 경우, 일을 처리하는 순서를 찾는 알고리즘이다.
답은 어떤 노드를 먼저 탐색하느냐에 따라 여러가지가 나올 수 있다.
위상정렬의 기본 구현 방법은
1. 진입차수를 저장해둔다.
2. 진입차수가 0 일 경우 queue 에 넣어준다.
3. bfs 로 맵을 이동한다. 이동할때마다 진입차수를 -- 해주는 것을 잊지 말자.
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int n,m;
vector <int> map[32001];
int input[32001];
vector <int> answer;
queue <int> q;
void topology() {
while(!q.empty()) {
int cur = q.front();
q.pop();
answer.push_back(cur);
for(int i=0; i<map[cur].size(); i++) {
int next = map[cur][i];
if(--input[next] == 0) // 진입차수가 0 이 되면 넣어준다.
q.push(next);
}
}
}
int main() {
scanf("%d %d", &n, &m);
for(int i=0; i<m; i++) {
int a, b;
scanf("%d %d", &a, &b);
input[b]++; // 진입차수
map[a].push_back(b);
}
for(int i=1; i<=n; i++) {
if(input[i] == 0) {
q.push(i);
}
}
topology();
for(auto a: answer)
printf("%d ", a);
}
'알고리즘' 카테고리의 다른 글
[백준] 9625 BABBA (0) | 2022.02.03 |
---|---|
[프로그래머스] 다리를 지나는 트럭 (0) | 2022.02.03 |
[프로그래머스] 그래프 > 순위 (0) | 2022.01.31 |
[백준] 17085 십자가 2개 놓기 (0) | 2022.01.27 |
[백준] 17406 배열 돌리기 4 (0) | 2022.01.25 |
Comments