0x1A. 위상정렬 - 백준 2252번

1 분 소요

바킹독 0x15강 - 위상정렬Permalink

오늘은 바킹독의 위상정렬 공부

[실전 알고리즘] 0x1A강 - 위상 정렬

위상정렬 알고리즘Permalink

Untitled

2252번: 줄세우기Permalink

2252번: 줄 세우기

Untitled 1

알고리즘Permalink

  1. vertex의 indegree 값을 넣은 indegree table → vector<int> 로 생성
    1. index == B 인 애들만 +1
  2. indegree가 0인 vertex의 index을 queue 로 이동 → queue<int> 필요
  3. queue에서 하나씩 꺼내면서 결과 테이블로 이동 → vector<int> 필요
  4. 꺼낸 vertex와 이어진 vertex의 indegree를 -1 = 끊어졌기 때문에
    1. indegree가 0이 되면(독립적) queue 로 이동
  5. queue가 빌때까지 3,4 번을 반복

주의Permalink

  • 꺼낸 vertex와 이어진 vertex를 찾기 위해서 경로를 알 수 있는 변수가 필요 → map <int, vector<int> > 사용
  • 한가지 vertex에 2개 이상이 연결 된 경우 (1→3 , 1→2) : map의 vector를 사용
  • chatGPT: unordered_map > map , unordered_map 쓰는게 성능이 높다. vector<vector > 도 가능

Untitled 2

코드Permalink

#include <iostream>
#include <vector>
#include <queue>
#include <map>

using namespace std;

int main()
{

    int N,M;
    cin >> N >> M;
    vector<int> vec(N+1, 0);
    map <int, vector<int> > map;
    vector<int> result;

    for(int i=0;i<M;i++) {
        int A, B;
        cin >> A >> B;
        map[A].push_back(B);
        vec[B]++;
    }

    queue<int> que;
    for(int i=1;i<=N;i++) {
        if(vec[i] == 0) {
            que.push(i);
        }
    }
    while(!que.empty()){
        // cout << que.front() << "\n";
        int value = que.front();
        que.pop();

        result.push_back(value);
        while(map[value].size()>0) {
            int val = map[value].back();

            map[value].pop_back();
            vec[val]--;
            if(vec[val] == 0) {
                que.push(val);
            }
            
        }
        
    }
    for(int i=0;i<result.size();i++) {
        cout << result[i] << " ";
    }
}

카테고리:

업데이트: