CS/자료구조 (Data Structure)

[자료구조] 16. 방향 그래프(Directed Graph = Digraph)

2023. 8. 16. 01:09
목차
  1. Directed graph에서 간선 정리
  2. Directed DFS
  3. Directed BFS
  4. Rechability와 Strong connectivity
  5. DAG와 Topological ordering
  6. Topological sorting(위상 정렬)
728x90

Directed graph란 유방향 간선으로 이루어진 그래프를 의미합니다. 이에 대치되는 개념은 앞선 시간에서 살펴보았던 undireced graph, 즉 무방향 간선으로 이루어진 그래프입니다.

Directed graph에서 간선 정리

Undirected graph에서 그래프 탐색을 할 때는 DFS의 경우 unvisited, discovery, back edge의 3가지 간선 종류가 있었고, BFS의 경우에는 unexplored, discovery, cross edge의 3가지 간선 종류가 있었습니다. Directed graph의 탐색된 간선은 4가지가 있는데, 이를 정리해 보도록 하겠습니다.

정점 v에서 시작하여 DFS와 BFS 등으로 탐색된 경로가 정점 v를 루트로 하는 트리와 같은 형식이라는 것을 염두에 둔다면 다음 내용을 이해하기 쉽습니다.

  • Discovery edge: 이전에 방문하지 않았던 정점으로 성공적으로 방문한 간선입니다.
  • Back edge: 이전에 방문했던 정점으로 이어지는 간선으로, 방문한 정점이 출발 정점의 조상인 간선입니다.
  • Forward edge: 이전에 방문했던 정점으로 이어지는 간선으로, 방문한 정점이 출발 정점의 후손인 간선입니다. 특성상 BFS에서는 존재하지 않는데, BFS는 단계별로 탐색을 하기에 방문한 정점이 후손이 되기 전에 이미 방문을 했을 것이기 때문입니다.
  • Cross edge(교차 간선): 이전에 방문했던 정점으로 이어지는 간선으로, 방문한 정점이 출발 정점의 조상도 후손도 아닌 간선입니다.

Directed DFS

Directed BFS

Rechability와 Strong connectivity

DFS, BFS 경로로 만들어진 트리에서 정점 u, v에 대해 u -> v로 갈 수 있는 경로가 있다면 v가 u에서 reachable 하다고 합니다. 이때 모든 정점에 대하여 서로 reachable 하다면 strongly connected 되었다고 합니다.

이러한 strong connectivity를 검증하기 위한 방법으로 DFS를 사용할 수 있습니다. 그렇다면 모든 정점에 대하여 rechable한지 확인해야 하니 모든 정점에 대하여 O(n+m) 시간이 걸리는 DFS를 시행하여 총 O(n*(n+m))시간에 검증을 해야 할까요? 실제로는 모든 정점에 대한 검증이 필요하지 않고, 단 2번의 DFS를 통하여 strong connectivity를 검증할 수 있습니다. 과정은 다음과 같습니다.

1. 그래프 G의 임의의 정점 v에서 DFS를 시행합니다. 이때 방문이 안된 정점이 있다면 strong connected 되지 않은것입니다.

2. 그래프 G의 모든 간선방향을 역전시킨 그래프 G'에 대하여 정점 v에서 DFS를 시행합니다. 이때 방문이 안된 정점이 있다면 strong connected 되지 않은 것입니다.

3. 모든 과정을 거쳤으면 그래프 G는 strongly connected 된 것입니다.

어째서 이렇게 2번의 DFS로 검증이 가능한 걸까요? 우선 1번 과정에서 v에서 출발했을 때 모든 정점을 방문할 수 있음을 보였습니다. 그리고 2번 과정에서 반전된 그래프를 검증하는 것은 그래프의 모든 정점에서 v로 가는 경로가 있다는 것을 보여줍니다. 그렇다면 어느 정점에서 출발해도 v로 갈 수 있고, v에서 어디로든 갈 수 있으니, 그래프의 모든 정점은 reachable 하다는 증명이 가능합니다.

DAG와 Topological ordering

Topological sorting(위상 정렬)

DFS로 위상 정렬 구현

728x90

'CS > 자료구조 (Data Structure)' 카테고리의 다른 글

[자료구조] 15. BFS  (0) 2023.08.11
[자료구조] 14. DFS  (0) 2023.08.08
[자료구조] 13. 그래프(Graph)  (0) 2023.08.02
[자료구조] 12. 해시 테이블(Hash table)  (0) 2023.07.31
[자료구조] 12. AVL 트리(AVL Tree)  (0) 2023.07.28
  • Directed graph에서 간선 정리
  • Directed DFS
  • Directed BFS
  • Rechability와 Strong connectivity
  • DAG와 Topological ordering
  • Topological sorting(위상 정렬)
Wibaek
생쥐 개발자
Wibaek
총 방문
오늘
어제
  • 전체보기 (109)
    • 서버(Server) (4)
      • 장고 (Django) (20)
      • 스프링 (Spring) (0)
    • 프론트엔드 (Frontend) (4)
    • 파이썬 (Python) (7)
    • 자바 (Java) (1)
    • 인프라 (Infra) (10)
    • 알고리즘 (Algorithm), PS (4)
      • Leetcode (0)
      • Baekjoon Online Judge (3)
    • CS (20)
      • 자료구조 (Data Structure) (19)
    • Troubleshooting (10)
    • 회고 & 기록 (10)
    • 기타 (Other) (12)
    • TIL (1)
    • 하나도 안 중요함 (6)

인기 글

250x250
hELLO · Designed By 정상우.
Wibaek
[자료구조] 16. 방향 그래프(Directed Graph = Digraph)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.