본문 바로가기

백준/골드

[백준 1766] 문제집 (C++)

문제링크 : https://www.acmicpc.net/problem/1766

 

1766번: 문제집

첫째 줄에 문제의 수 N(1 ≤ N ≤ 32,000)과 먼저 푸는 것이 좋은 문제에 대한 정보의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 둘째 줄부터 M개의 줄에 걸쳐 두 정수의 순서쌍 A,B가 빈칸을 사이에 두고 주

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int N, M, A, B;
int inDegree[32001]; // 진입 차수 저장
vector<int> graph[32001]; // 간선 정보 저장
vector<int>result; 
priority_queue<int, vector<int>, greater<int>> pq; //위상 정렬을 위한 큐 (오름차순)

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    cin >> N >> M;
    for(int i=0; i<M; i++) 
    {
        cin >> A >> B;
        graph[A].push_back(B);
        inDegree[B]++; //진입 차수 즈가 (A가 우선)
    }

    for(int i=1; i<=N; i++) if(inDegree[i]==0) pq.push(i);

    while(!pq.empty())
    {
        int cur = pq.top(); pq.pop();
        cout << cur << " ";
        for(int i=0; i<graph[cur].size(); i++) //인접 노드 체크
        {
            int next = graph[cur][i];
            if(--inDegree[next]==0) pq.push(next);
        }
    }


    return 0;
}

 

기본적인 위상정렬 문제에 오름차순 정렬이 추가된 문제다.

해당 문제의 3번 조건인 가능하면 쉬운 것 부터 풀어야 한다는 조건을 해결하기 위해 작은 값부터 먼저 해결해줘야 한다.

이를 위해 우선 순위 큐를 이용해 큐에 담긴 값을 오름차순으로 정렬해준다.

이외에는 기본적인 위상정렬 문제와 동일하다.

 

참고링크 : https://blob-thinking.tistory.com/281

 

[백준 2252번] 줄 세우기 (C++)

문제링크 : https://www.acmicpc.net/problem/2252 2252번: 줄 세우기 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B

blob-thinking.tistory.com

 

 

'백준 > 골드' 카테고리의 다른 글

[백준 17845번] 수강 과목 (C++)  (0) 2024.01.13
[백준 2228번} 구간 나누기 (C++)  (0) 2024.01.12
[백준 18513번] 샘터 (C++)  (0) 2024.01.04
[백준 16509번] 장군 (C++)  (0) 2024.01.02
[백준 14699번] 관악산 등산 (C++)  (0) 2024.01.01