#2252 문제는 위상 정렬을 이용해서 풀 수 있는 문제입니다.
문제의 링크입니다.
https://www.acmicpc.net/problem/2252
2252번: 줄 세우기
첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의
www.acmicpc.net
위상 정렬은 작업의 선후관계 등에서 많이 사용됩니다. 소프트웨어 공학에서는 작업의 전체 시간을 결정하는 요소로도 많이 사용됩니다. 대부분의 경우 작업의 종류가 많지 않기 때문에 손쉽게 수작업으로도 표시할 수 있습니다.
위상 정렬과 관련된 문제들이 많이 있었으니, 참조하시길 바랍니다.
[C/C++] 백준 #2056 작업(위상정렬)
https://www.acmicpc.net/problem/2056 2056번: 작업 수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게
sdev.tistory.com
[C/C++] 백준 #1766 문제집(위상정렬)
이번 문제는 일을 처리하는데 있어서 우선순위가 주어진 경우 그것을 해결하는 방법입니다. 1. N개의 문제는 반드시 풀어야 한다. 2. 먼저 푸는 것이 좋은 문제가 있는 경우에는 더 쉬운 문제를
sdev.tistory.com
#1516 게임 개발
게임 개발 문제는 위상정렬(Topology sort)를 사용해서 풀 수 있는 문제입니다. https://www.acmicpc.net/problem/1516 1516번: 게임 개발 첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는
sdev.tistory.com
[C/C++] 백준 #1005 ACM Craft(위상 정렬)
그래프 이론과 관련된 알고리즘은 종류도 여러가지이고, 하나의 문제에 해법도 여러가지가 존재합니다. 프림, 다익스트라, A* 로 이루어지는 알고리즘은 같은 형태이지만, 인접 노드들을 찾아서
sdev.tistory.com
줄 세우기 문제는 모두의 키에 대한 자료는 없지만, 일부의 학생들간에 누가 더 키가 큰지에 대한 정보를 가지고, 그 정보에 위배되지 않게 줄세우기 하는 방법입니다. 기타 다른 조건이 없이 여러가지 방법 중 하나만 제시하면 됩니다.
위상 정렬 알고리즘에 대한 자세한 설명은 이전 게시글을 참고바랍니다.
제가 작성한 소스입니다.
//------------------------------------------------
// baekjoon #2252
// - by Aubrey Choi
// - created at 2019-09-28
//------------------------------------------------
#include <stdio.h>
#include <algorithm>
#include <queue>
int main()
{
int n, m, f, t;
static int v[32000], e[100000];
std::queue<int> q;
scanf("%d%d", &n, &m);
for(int i=0;i<m;i++) { scanf("%d%d",&f,&t); e[i]=(f-1)<<16|(t-1); v[t-1]++; }
for(int i=0;i<n;i++) { if(!v[i]) q.push(i); }
std::sort(e,e+m);
while(!q.empty())
{
f=q.front(); q.pop();
printf("%d ", f+1);
auto it=std::lower_bound(e,e+m,f<<16);
for(int i=std::distance(e,it);i<m;i++)
{
if((e[i]>>16)!=f) break;
t=e[i]&0xffff;
if(--v[t]==0) q.push(t);
}
}
putchar('\n');
}
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #2268 수들의 합 7(세그먼트 트리) (0) | 2023.04.19 |
---|---|
[C/C++] 백준 #2261 가장 가까운 두 점(분할 정복) (0) | 2023.04.19 |
[C/C++] 백준 #2251 물통(너비 우선 탐색) (2) | 2023.04.19 |
[C/C++] 백준 #2250 트리의 높이와 너비(이진 탐색 트리) (0) | 2023.04.19 |
[C/C++] 백준 #2247 실질적 약수(수학) (2) | 2023.04.18 |
댓글