위상 정렬 6

백준(Python) 3665번 최종 순위 풀이

Python으로 구현한 3665번 최종 순위 문제 풀이입니다. https://www.acmicpc.net/problem/3665 3665번: 최종 순위 올해 ACM-ICPC 대전 인터넷 예선에는 총 n개의 팀이 참가했다. 팀은 1번부터 n번까지 번호가 매겨져 있다. 놀랍게도 올해 참가하는 팀은 작년에 참가했던 팀과 동일하다. 올해는 인터넷 예선 본부에 www.acmicpc.net from collections import deque # 테스트 케이스만큼 반복 for tc in range(int(input())) : # 노드의 개수 입력 받기 n = int(input()) # 모든 노드에 대한 진입차수는 -으로 초기화 indegree = [0] * (n + 1) # 각 노드의 연결된 간선 정보를 담기위한 ..

[그래프 이론] 이코테 (파이썬) 최종 순위 풀이

[문제] 올해 ACM-ICPC 대전 인터넷 예선에는 총 n개의 팀이 참가했습니다. 팀은 1번부터 n번까지 번호가 매겨져 있습니다. 놀랍게도 올해 참가하는 팀은 작년에 참가했던 팀과 동일합니다. 올해 인터넷 예선 본부에서는 최종 순위를 발표하지 않기로 했습니다. 그 대신에 작년에 비해서 상대적으로 순위가 바뀐 팀의 목록만 발표하려고 합니다. (작년에는 순위를 발표했습니다.) 예를 들어, 작년에 팀13이 팀6보다 순위가 높았는데, 올해 팀6이 팀13보다 순위가 높다면, (6, 13)을 발표할 것입니다. 창영이는 이 정보만을 가지고 올해 최종 순위를 만들어보려고 합니다. 작년 순위와 상대적인 순위가 바뀐 모든 팀의 목록이 주어졌을 때, 올해 순위를 만드는 프로그램을 작성하세요. 하지만, 본부에서 발표한 정보를..

[파이썬] 위상 정렬

[위상 정렬이란 ?] 위상 정렬은 사이클이 없는 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는 것을 의미한다. 위상 정렬 알고리즘 학습 시 진입차수(Indegree)와 진출차수(Outdegree)가 존재하는데, 진입차수는 특정한 노드로 들어오는 간선의 개수이고, 진출차수는 특정한 노드에서 나가는 간선의 개수이다. 큐를 이용하는 위상 정렬 알고리즘의 동작 과정은 다음과 같다. 1. 진입차수가 0인 모든 노드를 큐에 삽입한다. 2. 큐가 빌 때까지 다음의 과정을 반복한다. (1) 큐에서 원소를 꺼내 해당 노드에서 나가는 간선을 그래프에서 제거한다. (2) 새롭게 진입차수가 0이 된 노드를 큐에 넣는다. 3. 결과적으로 각 노드가 큐에 들어온 순서가 위상 정렬을 수행한 결과와 같다. 구..

백준(C++) 1516번 게임 개발 풀이

C++로 구현한 2252번 줄 세우기 문제 풀이입니다. https://www.acmicpc.net/problem/1516 1516번: 게임 개발 첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부 www.acmicpc.net #include #include #include #define MAX 501 using namespace std; int n, inDegree[MAX], result[MAX], time[MAX]; vector a[MAX]; void topologySort() { queue q; for(int i=1; i

백준(C++) 2252번 줄 세우기 풀이

C++로 구현한 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 #include #include #include #define MAX 32001 using namespace std; int n, inDegree[MAX], result[MAX]; vector a[MAX]; void topologySort() { queue q; for(int i=1; i

위상 정렬(Topology Sort)

위상 정렬은 순서가 정해져있는 작업을 차례대로 수행해야 할 때 그 순서를 결정해주기 위해 사용하는 알고리즘이다. 주의할 점은 위상 정렬은 사이클이 발생하지 않는 방향 그래프 즉, DAG(Directed Acyclic Graph)에만 수행이 가능하다. 왜냐하면 위상 정렬은 기본적으로 시작점이 존재해야 하는데 사이클 그래프에서는 시작점부터 찾을 수 없기 때문이다. 위상 정렬을 수행하는 과정은 아래와 같다. 정점 1 2 3 4 5 6 7 진입차수 0 1 1 1 1 2 1 여기서 진입차수는 해당 정점에 들어오는 간선의 수이다. 즉, 정점6은 정점4와 정점5에서 간선이 들어오기 때문에 진입차수가 2이다. 또한, 정점1은 들어오는 간선이 없기 때문에 진입차수는 0이다. (1) 진입차수가 0인 정점1을 큐에 삽입한다..