이 영역을 누르면 첫 페이지로 이동
컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

페이지 맨 위로 올라가기

컴퓨터와 수학, 몽상 조금

컴퓨터공학, 딥러닝, 수학 등을 다룹니다.

15. 방향 비싸이클 그래프와 위상 정렬 (DAG and Topological Sort)

  • 2020.12.01 15:46
  • 학부 수업/알고리즘
반응형

방향싸이클이 존재하지 않는 방향 그래프를 방향 비싸이클 그래프Directed Acyclic Graph라고 한다.
어떤 방향 그래프에서, 모든 $i<j$인 간선 $(v_i, v_j)$에 대해 노드들을 번호로 나열한 것을 위상 순서Topological Order라 한다.

즉, 그래프가 DAG이면 위상순서를 가지며, 위상순서를 갖는 그래프는 DAG이다.

위상 정렬

위상 정렬이란, DAG에서 위상 순서를 얻는 절차를 말한다. 일반적인 위상 정렬 알고리즘과, DFS를 특화한 위상 정렬 DFS 알고리즘이 있다.

def topologicalSort(G):
    Q = queue()
    for u in G.vertices:
        if in(u) == 0: # 현재 노드의 진입 차수(노드 u로 들어오는 간선 수)가 0이면
            Q.enqueue(u)
    i=1 # 위상
    while !Q.isEmpty():
        u = Q.dequeue()
        u.topology = i # u의 위상, 선택사항임
        i += 1
        for e in u.outIncidentEdges: # u의 진출 간선들
            w = G.opposite(u, e) # 반대쪽 노드
            in(w) -= 1 # 반대쪽 노드의 진입차수 하나 줄이기
            if in(w) == 0:
                Q.enqueue(w)
    if i <= n: # 노드 수보다 위상이 적을 때
        print("G has a directed cycle")
    return
def topologicalSortDFS(G):
    n = len(G.vertices)
    for u in G.vertices:
        l(u) = Fresh
    for v in G.vertices:
        if I(v) == Fresh:
            rTopologicalSortDFS(G, v, n)
def rTopologicalSortDFS(G, v):
    I(v) = Visited
    for e in v.outIncidentEdges:
        w = opposite(v, e)
        if I(w) == Fresh:
            rTopologicalSortDFS(G, w)
        elif I(w) == Visited: #이미 위상이 정해져있음
            print("G is not DAG")
        else:
            # e is nontree edge
    v.topology = i
    n = n-1

두 버전 모두 $O(n+m)$ 시간이 소요되고, $G$의 위상순서를 계산한다. 이 때, 그래프 안에 싸이클이 존재하면 (DAG가 아니면) 일부 노드에 순위를 매기지 않고 중단한다.

반응형

'학부 수업 > 알고리즘' 카테고리의 다른 글

17. 최단 경로 알고리즘  (0) 2020.12.14
16. 최소신장트리 (Minimum Spanning Tree)  (0) 2020.12.12
14. 방향그래프 (Directed Graph)  (0) 2020.11.24
13. 그래프 순회 (Graph Traversal)  (0) 2020.11.24
12. 그래프 ADT (Graph ADT)  (0) 2020.11.11

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 17. 최단 경로 알고리즘

    17. 최단 경로 알고리즘

    2020.12.14
  • 16. 최소신장트리 (Minimum Spanning Tree)

    16. 최소신장트리 (Minimum Spanning Tree)

    2020.12.12
  • 14. 방향그래프 (Directed Graph)

    14. 방향그래프 (Directed Graph)

    2020.11.24
  • 13. 그래프 순회 (Graph Traversal)

    13. 그래프 순회 (Graph Traversal)

    2020.11.24
다른 글 더 둘러보기

정보

컴퓨터와 수학, 몽상 조금 블로그의 첫 페이지로 이동

컴퓨터와 수학, 몽상 조금

  • 컴퓨터와 수학, 몽상 조금의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (276)
    • Tech Trend (3)
    • Deep Learning (77)
      • 공부 노트 (21)
      • 논문 리뷰 (44)
      • 논문 스키밍 (1)
      • 영상처리 (11)
    • Engineering (3)
      • Tips (2)
      • Experiences (1)
    • Blog (42)
      • 회고 & 계획 (16)
      • 내 이야기 (8)
      • 리뷰 (3)
      • 군대에 간 공돌이 (9)
      • ML엔지니어 취업 도전기 (1)
      • 여행 (4)
    • 학부 수업 (141)
      • 머신러닝 (16)
      • C프로그래밍 (8)
      • 자료구조 (11)
      • 알고리즘 (17)
      • 디지털시스템 (25)
      • 컴퓨터구조 (11)
      • 확률과 통계 (21)
      • 선형대수학 (14)
      • 이산수학 (18)
      • 데이터시각화 (0)
    • 강의 (9)
      • 딥러닝 기초 (7)
      • Python (2)

공지사항

인기 글

정보

백지오의 컴퓨터와 수학, 몽상 조금

컴퓨터와 수학, 몽상 조금

백지오

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
반응형

나의 외부 링크

  • profile
  • github
  • linkedin

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. © 백지오. Designed by Fraccino.

티스토리툴바