Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- C++ 1937
- DP
- 조합론
- 16933
- 백준 숨바꼭질5
- 투포인터
- 백준 17071
- 다익스트라
- 프로그래머스
- 조합
- c언어
- C++ 17071
- 가장 긴 증가하는 부분 수열
- 소트 게임
- 위상정렬
- Backtracking
- BFS
- C++1167
- DFS
- C++1967
- 백트래킹
- 문자열
- 백준
- strtok
- 알고리즘
- LIS
- C++
- 순열
- 인덱스 트리
- C++ 1918
Archives
- Today
- Total
블로그
[6일차] 그래프1 B - 2252 : 줄 세우기 본문
728x90
골드 Ⅲ
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int N, M;
int indegree[32001] = { 0, };
vector<int> adjList[32001];
queue<int> toStart;
int main() {
scanf("%d%d", &N, &M);
int A, B;
while (M--) {
scanf("%d%d", &A, &B);
//들어오는 노드 indegree++
indegree[B]++;
//인접 리스트에 push
adjList[A].push_back(B);
}
//N개의 노드들 중 indegree가 0인 거 큐에 넣어줌
for (int i = 1; i <= N; i++) {
if (indegree[i] == 0) toStart.push(i);
}
//위상정렬 ㄱㄱ
while (toStart.size()) {
//toStart 비면 끝 -> 조건 while문 안에 씀
//toStart에서 시작할 노드 뽑기
int startNode = toStart.front();
toStart.pop();
printf("%d ", startNode);
//startNode 노드와 연결된 노드들 indegree 하나씩 뺴주기
for (auto i : adjList[startNode]) {
indegree[i]--;
//뺐는데 0 됐으면 toStart에 넣어주기
if (indegree[i] == 0) toStart.push(i);
}
}
}
위상정렬 문제
-> 여러개의 상위/하위 개념들을 주고 그에 따른 여러가지 순서가 가능할 때 하나의 순서 출력
그냥... 강사님 설명 듣고
틀릴줄알고 돌려본건데 왜 맞을까
제대로 완벽하게 이해가 되지 않았을거같은..느낌...
맞나
그리고 뭔가 코너 케이스도.. 안고려해봤어서
괜찮나?
'SDS ( -> PS)' 카테고리의 다른 글
[7일차] 그래프2 B - 1753: 최단경로 (0) | 2022.01.11 |
---|---|
[6일차] 그래프1 F - 1516: 게임 개발 (0) | 2022.01.11 |
[6일차] 그래프1 C - 1922 : 네트워크 연결 (0) | 2022.01.10 |
[6일차] 그래프1 A - 1717: 집합의 표현 (0) | 2022.01.10 |
[5일차] 조합론 D - 1256 : 사전 (0) | 2022.01.09 |