티스토리 뷰
위상정렬(그래프정렬)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main(void){
ios_base::sync_with_stdio(false);
freopen("input.txt", "rt", stdin);
int n, m, a, b;
cin>>n>>m;
vector<vector <int> > graph(n+1, vector<int>(n+1, 0));
vector<int> degree(n+1);
queue<int> Q;
for(int i=0; i<m; i++){
cin>>a>>b;
graph[a][b]=1;
degree[b]++;
}
for(int i=1; i<=n; i++){
if(degree[i]==0) Q.push(i);
}
while(!Q.empty()){
int now=Q.front();
Q.pop();
cout<<now<<" ";
for(int i=1; i<=n; i++){
if(graph[now][i]==1){
degree[i]--;
if(degree[i]==0) Q.push(i);
}
}
}
return 0;
}
graph배열에 선후관계에 있는 것들을 1로 표시해준다.
그러면서 후순위에 있는 b를 인덱스로해서 degree함수에 1씩 더해준다.
후순위에 있어서 degree배열에서 숫자가 높으면 높을수록 가장 나중에 처리해야 하는 일이 된다.
이렇게 가장 나중에 처리해야할 일들을 표시하는데 만약 값이 0이라면 이것보다 앞에 처리해야할 일은 없으므로
Q에 넣어준다.
Q에 넣은 값들이 없을때까지 while문을 돌면서 pop된 값을 출력하고
해당 값을 now에 할당해서 그 값의 화살표를 받는 값이 있다면 degree에서 그 값을 인덱스로하는 곳을 1씩 빼준다.
1을 빼주었을 때 0이 된다면 그 값을 Q에 push한다.
이렇게 반복해서 출력하면 전체 일의 순서를 출력할 수 있다.
'lecture > algorithm - c++' 카테고리의 다른 글
[c++] 플로이드와샬 알고리즘 (0) | 2021.02.21 |
---|---|
[c++] 최대점수 구하기(냅색 알고리즘) (0) | 2021.02.20 |
[c++] 동전교환 (0) | 2021.02.18 |
[database] 데이터베이스 모델링 - 2 (0) | 2021.02.16 |
[database] 데이터모델링 (0) | 2021.02.16 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 재귀함수
- 알고리즘
- C++
- 구조체
- 교착상태
- 인접리스트
- C
- client side rendering
- BFS
- dfs
- 입출력장치
- 병행프로세스
- 동적프로그래밍
- react
- 최단경로
- Stack
- server side rendering
- 운영체제
- 인접행렬
- 클래스
- 퀵정렬
- stackframe
- 소프트웨어
- javascript
- 세마포어
- Java
- 스텍
- 배열
- 자료구조
- 이진탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함