그래프에서의 DAG

Updated:

강의 사이트
  • http://www.kocw.net/home/search/kemView.do?kemId=1148815

DAG(Directed Acyclic Graph)

  • DFS, BFS라고 해서 꼭 무방향 그래프에서만 적용되는 것은 아님
  • 단지 원하는 노드에 도착하지 못할 수도 있다는 것 뿐

1. DAG(Directed Acyclic Graph)

  • DAG는 방향 사이클(directed cycle)이 없는 방향 그래프.
  • 예 : 작업들의 우선순위

2. 위상정렬 (topological ordering)

  • DAG에서 노드들의 순서화 v1, v2,…,vn, 단, 모든 에지 (vi,vj)에 대해서 i < j가 되도록.
  • 왼쪽에서 오른쪽으로 가야한다.
  • 역방향은 위상 정렬이 아니다.

  • degree (들어오거나 다가는 경로)
  • indegree(들어오는 경로), outdegree(나가는 경로)
  • 맨처음 indegree가 없는 노드를 출력. a를 출력
  • a의 outdegree를 삭제
  • 그 다음 indegree가 없는 노드를 출력. g를 출력
  • g의 outdegree를 삭제
  • 그 다음 indegree가 없는 노드를 출력. b를 출력
  • b의 outdegree를 삭제…
  • 반복.

2.1 알고리즘 1

topologicalSort1(G)
{
    for  1 to n {
       진입간선이 없는 임의의 정점 u를 선택한다;      
       A[i]  u;
       정점 u와 u의 진출간선을 모두 제거한다;  
    }
     배열 A[1n]에는 정점들을 위상정렬되어 있다
}
  • 수행시간 O(n+m)

2.2 알고리즘 2

topologicalSort2(G)
{
    for each vV
       visited[v]  NO;
 	make an empty linked list R;
    
    for each vV  정점의 순서는 상관없음
       if (visited[v] = NO) then
 			DFS-TS(v, R);  
} 

DFS-TS(v, R)
{
    visited[v]  YES;
    for each x adjacent to v do
       if (visited[x] = NO) then
 			DFS-TS(x, R) ;
    add v at the front of the linked list R;
} 
  • v 노드가 방문하지 않았다면 DFS-TS 호출
  • v 노드를 방문표시
  • v 노드 인접노드 x 들에 대해서 방문하지 않았다면 DFS-TS 재귀호출
  • 인접노드가 없다면 v를 리스트 R의 가장 앞에 insert.
  • 이렇게 재귀 방식으로 돌다가 최초 v로 돌아오면 다시 방문하지 않은 임의의 v 노드에 대해서 DFS-TS호출
  • 알고리즘이 끝나면 연결 리스트 R에는 정점들이 위상정렬된 순서로 매달려 있다.
  • 수행시간: Θ(n+m)