문제링크 : 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 |