위상 정렬
시간 복잡도 : O(|V|+|E|)
indegree : 한 정점에 들어오는 간선 수
ex ) a -> c, b -> c 라면 c의 indegree는 2, a,b의 indegree는 0이 된다.
기본 코드
// 해당 노드에 향하는 간선(indegree)이 0인경우 q에 추가한다. for (int i = 1; i <= n; i++) if (indegree[i] == 0) q.push(i); while (!q.empty()) { // 큐에서 하나의 노드를 가져온다. int cur = q.front(); q.pop(); // 현재 cur노드에서 indegree를 감소시키며 이동한다. while (!v[cur].empty()) { int next = v[cur].back(); v[cur].pop_back(); indegree[next]--; // 노드의 indegree가 0이되면 큐에 넣는다. if (indegree[next] == 0) q.push(next); } // 노드를 저장한다. ans.push_back(cur); } // 만약 주어진 모든 노드를 이용하여 하나의 위상정렬을 할 수 있는지 물어본다면! // indegree가 0이 아닌 노드가 존재한다면 불가능하다! for (int i = 1; i <= n; i++) { if (indegree[i] != 0) { printf("0"); return 0; } }
기본 예제
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <math.h>
#include <queue>
#include <utility>
#include <functional>
#define MAX 40005
#define MOD 1000000007
#pragma warning(disable:4996)
using namespace std;
int n, m, a, b, c, indegree[32005];
vector<int> v[32005], ans;
queue<int> q;
int main()
{
fill_n(&indegree[0], 32005, 0);
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++)
{
scanf("%d %d", &a, &b);
for (int k = 0; k < a - 1; k++)
{
scanf("%d", &c);
v[b].push_back(c);
// b->c를 향하는 간선을 저장한다.
indegree[c]++;
// c 노드에 향하는 간선의 개수를 저장한다.
b = c;
}
}
// 입력을 받아 온다.
// 해당 노드에 향하는 간선(indegree)이 0인경우 q에 추가한다.
for (int i = 1; i <= n; i++)
if (indegree[i] == 0)
q.push(i);
while (!q.empty())
{
// 큐에서 하나의 노드를 가져온다.
int cur = q.front();
q.pop();
// 현재 cur노드에서 indegree를 감소시키며 이동한다.
while (!v[cur].empty())
{
int next = v[cur].back();
v[cur].pop_back();
indegree[next]--;
// 노드의 indegree가 0이되면 큐에 넣는다.
if (indegree[next] == 0)
q.push(next);
}
// 노드를 저장한다.
ans.push_back(cur);
}
// 만약 주어진 모든 노드를 이용하여 하나의 위상정렬을 할 수 있는지 물어본다면!
// indegree가 0이 아닌 노드가 존재한다면 불가능하다!
for (int i = 1; i <= n; i++)
{
if (indegree[i] != 0)
{
printf("0");
return 0;
}
}
for (int i = 0; i < ans.size(); i++)
printf("%d\n", ans[i]);
return 0;
}'IT > 알고리즘 및 자료구조' 카테고리의 다른 글
| [알고리즘 정리]네트워크 플로우(Network Flow) 알고리즘_에드몬드 카프 알고리즘(Edmonds-Karp algorithm) (0) | 2018.10.03 |
|---|---|
| [알고리즘 정리] 이분 매칭 (0) | 2018.09.30 |
| [알고리즘 정리] 세그먼트 트리 (0) | 2018.09.17 |
| [알고리즘 정리] 이분 탐색 (0) | 2018.09.14 |
| [알고리즘 정리] 그라함 알고리즘(Graham’s scan) 알고리즘 (0) | 2018.08.26 |