[알고리즘] 위상 정렬(Topological Sort)

2024. 8. 27. 10:59·CS/알고리즘

0. 위상 정렬(Topological Sort)

위상 정렬은 유향 그래프의 정점들을 나열하는 것을 의미한다.

순서가 정해져 있는 작업들을 차례대로 수행해야 할 때, 그 순서를 결정해주는 알고리즘으로 위상 정렬의 결과는 여러 개일 수 있다.

가장 잘 설명되는 예시로는 선수과목(prerequisite) 구조이다. 만약 특정 수강 과목에 선수 과목이 있다면 그 선수 과목부터 수강해야 하므로, 특정 과목들을 수강해야 할 때 위상 정렬을 통해 수강 순서를 찾아낼 수 있다.

위상 정렬이 성립하기 위해서는 그래프의 순환이 존재하지 않는 비순환 유향 그래프(directed acyclic pragh)여야 한다.

 

위상 정렬은 아래 2가지에 대한 판단이 가능하다.

  1. 현재 그래프는 위상 정렬이 가능한지 → 사이클이 존재하지 않는지
  2. 위상 정렬이 존재한다면 그 결과는 무엇인지


1. 알고리즘

위상 정렬은 BFS와 DFS로 모두 구현이 가능하다.

이번에는 큐를 이용한 BFS로 구현할 예정이다.

  1. 진입 차수가 0인 정점을 큐에 모두 넣는다.
  2. 큐에서 진입 차수가 0인 정점을 꺼내어 자신과 인접한 정점의 간선을 제거한다. → 인접한 정점의 진입 차수를 1 감소시킨다.
  3. 큐가 공백이 될 때까지 1번부터 작업을 반복한다.
  4.  모든 노드가 다 처리되었다면 위상 정렬 완성, 처리되지 않은 노드가 있다면 사이클 발생

2. 구현

2-1. 위상 정렬이 가능한 경우

2-2. 위상 정렬이 불가능한 경우(사이클이 발생한 경우)

반응형
저작자표시 비영리 변경금지 (새창열림)
'CS/알고리즘' 카테고리의 다른 글
  • [알고리즘] 최소 신장 트리(MST) - Kruskal, Prim 알고리즘
  • [알고리즘] 서로소 집합(Disjoint-set): Union-Find Algorithm
  • [알고리즘] 병합 정렬(Merge Sort)
  • [알고리즘] 백트래킹(Backtracking)
Dreaming-J
Dreaming-J
개발자로 성장해가는 과정을 기록하기 위한 공간
    반응형
  • Dreaming-J
    꿈꾸는 개발 공간
    Dreaming-J
  • 전체
    오늘
    어제
    • 카테고리 (46)
      • Infra (2)
      • CS (25)
        • 네트워크 (3)
        • 운영체제 (3)
        • 자료구조 (4)
        • 알고리즘 (15)
      • JAVA (10)
        • IntelliJ (1)
        • Stream (2)
        • String (4)
        • Map (1)
        • 기타 (1)
      • Git·Github (7)
      • 독서 (2)
        • 객체지향 설계 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Prim
    그래프
    dp
    GitLab
    0/1
    코딩테스트
    string
    Dijkstra
    0/1 knapsack
    플로이드-워샬
    Git
    동적 계획법
    순열
    Kruskal
    정렬
    sort
    알고리즘
    다익스트라
    집합
    Binary search
    disjoint
    워셜
    github
    탐색
    stream
    조합
    java
    워샬
    독서
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Dreaming-J
[알고리즘] 위상 정렬(Topological Sort)
상단으로

티스토리툴바