위상 정렬
Directed Acyclic Graph(DAG, 비순환 방향 그래프)에서 정점들을 순서대로 나열하는 알고리즘
위상 정렬의 기본 개념
진입 차수: 특정 노드로 들어오는 간선의 수
위상 정렬의 조건: DAG에서만 가능, 만약 사이클이 있다면 위상 정렬 불가
순서
- 그래프의 각 정점에 대해 진입 차수를 계산합니다.
- 진입 차수가 0인 정점들을 큐에 넣습니다.
- 큐에서 정점을 하나씩 꺼내며 그 정점과 연결된 다른 정점들의 진입 차수를 감소시킵니다.
- 진입 차수가 0이 된 정점은 다시 큐에 넣고, 큐가 비어지면 알고리즘을 종료합니다.
시간 복잡도
- O(V + E)
- V: 정점 수
- E: 간선 수
코드 (백준: 2252)
https://www.acmicpc.net/problem/2252

int main()
{
static int N, M;
std::cin >> N >> M;
std::vector<std::vector<int>> edges(N+1);
std::vector<int> indegree(N + 1);
for (int i = 0; i < M; ++i)
{
int start, end;
std::cin >> start >> end;
edges[start].push_back(end);
indegree[end]++;
}
std::queue<int> queue;
for (int i = 1; i <= N; ++i)
{
if (indegree[i] == 0)
{
queue.push(i);
}
}
while (!queue.empty())
{
int now = queue.front();
queue.pop();
std::cout << now << " ";
for (int next : edges[now])
{
indegree[next]--;
if (indegree[next] == 0)
{
queue.push(next);
}
}
}
}
'알고리즘 > 그래프' 카테고리의 다른 글
| [알고리즘/그래프] 벨만-포드 알고리즘 (1) | 2025.08.17 |
|---|---|
| [알고리즘/그래프] 다익스트라 (Dijkstra) (3) | 2025.08.06 |
| [알고리즘/그래프] 유니온 파인드 (Union Find) (0) | 2025.07.06 |
| [알고리즘/그래프] 그래프 알고리즘 (0) | 2024.10.26 |