일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- it
- python
- 다이나믹프로그래밍
- mmcv
- 파이썬
- 강의
- dp
- 슬픔
- python 강의
- C++
- 라즈베리파이 모니터
- 자작시
- 계획
- 철학
- 2021
- 라즈베리파이
- 백준
- 프로그래밍
- dynamic programming
- python 강좌
- 알고리즘
- 2020
- 강좌
- 파이썬 강좌
- 라즈베리파이3
- 머신러닝
- 파이썬 강의
- mmdetection
- BOJ
- 공부
Archives
- Today
- Total
Stargazer
[백준] 2252번 : 줄 세우기 C++ (위상정렬) 본문
반응형
접근:
처음에는 어떻게 접근 해야 할지 직접 그려보면서, 관계를 파악해보았다.
대충 봐도 그래프 이론으로 풀어야 하는데, 그 중 순서 정렬이 필요하기 때문에
위상 정렬로 풀어야 한다는 걸 알 수 있다.
전략:
대소 관계를 표현하기 위해 입력을 digraph(유향그래프) 형태로 입력을 받는다.(형식은 자유 - 행렬, 인접리스트)
진입 차수가 0인 노드부터 큐에 넣고, 큐에서 하나씩 제거하면서 출력한다.
제거한 노드가 가리키는 다른 노드의 진입 차수를 한개 줄이고, 만약 0이라면 큐에 삽입한다.
코드:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n,m;
vector<vector<int>> comp;
vector<int> income;
int main(){
cin >> n >> m;
comp.resize(n+1);
income.resize(n+1);
for(int i=0;i<m;i++){
int tall, small;
cin >> tall >> small;
comp[tall].push_back(small);
income[small]++;
}
queue<int> inc0;
for(int i=1;i<=n;i++){
if(income[i] == 0) inc0.push(i);
}
while(!inc0.empty()){
auto cur = inc0.front(); inc0.pop();
cout << cur << ' ';
for(auto chi: comp[cur]){
if(--income[chi] == 0){
inc0.push(chi);
}
}
}
cout << '\n';
return 0;
}
반응형
'Undergraudate basics(학부생 기초) > 자료구조, 알고리즘' 카테고리의 다른 글
[백준] 5430번 : AC (deque (or vector)) (0) | 2022.07.09 |
---|---|
[백준] 2473번 : 세 용액 C++ (두 포인터) (0) | 2022.07.09 |
[백준] 2239번: 스도쿠 C++ (백트래킹) (0) | 2022.07.04 |
[백준] 1644번: 소수의 연속합 c++ 풀이 (에라토스테네스의 체, 투 포인터) (0) | 2022.06.25 |
[백준] 1305번 : 광고 (KMP 알고리즘) c++ 풀이 (0) | 2022.05.29 |
Comments