[pre, post]는 해당 정점이 스택에 들어오고 나간 시간, 즉 머문 시간이고, 스택은 First In Last Out (선입후출) 구조이다. 때문에 두 간격 [ pre (u), post (u)]와 [ pre (v), post (v)]는 서로 독립되어 있거나, 하나가 다른 하나를 포함한다.
3.3. 유향그래프의 DFS
특별하게 사용되는 용어들을 정리한다.
root: 트리의 시작 지점
desendent: 어떤 노드로부터 뻗어나온 노드들
ancestor: 해당 노드가 기원한 노드들
parent: 해당 노드의 바로 직전 노드 (내가 기원한 노드)
child: 해당 노드의 바로 직후 노드 (나로부터 뻗어나간 노드)
Tree edge: DFS forest의 일부
Forward edge: 자식이 아닌 자손에게 이어짐
Back edge: 부모가 아닌 조상에게 이어짐
Cross edge: 자손도 조상도 아닌 노드에게 이어짐
Directed Acyclic Graph
유향 그래프는 DFS가 back edge가 있을 때만 순환(cycle)을 갖는다.
유향 비순환 그래프(Directed Acyclic Graph, DAG)는
한 번의 DFS로 선형 시간에 acyclicity를 조사할 수 있다.
선형화(linearize)(또는 위상정렬(topologically sort, 순서대로 배열))이 가능하다.
post 숫자가 감소하도록 정렬하면 된다.
가장 높은 post(‘source’)에서 가장 낮은 post(‘sink’) 순으로.
즉 모든 간선은 가장 낮은 post의 노드로 이어진다.
3.4. Strongly Connected Components
유향 그래프의 연결성(Connectivity)
유향 그래프의 경우, 양 방향으로 path가 있어야 두 노드가 연결되었다(connected)고 한다.
Strongly Connected Components(강한 연결 성분)는 meta node로 줄일 수 있다. Meta graph는 DAG이다.
따라서 모든 유향 그래프는 유향 그래프의 강한 성분들의 DAG이다.
그래서 유향 그래프의 연결구조를 두 계층으로 나눌 수 있다. 최상위 DAG가 하나 있고, DAG의 노드 하나하나는 완전한(full fledged) 강한 연결성분이다.
유향 그래프를 강한 연결 성분으로 분해하기
DFS를 이용해 선형시간에 유향 그래프를 강한 연결 성분으로 분해할 수 있다.
explore의 서브루틴이 $u$에서 시작할 때, $u$에서 갈 수 있는 모든 노드를 방문하면 서브루틴이 종료된다.
e.g., 메타 그래프의 끝점(=강한 연결 성분의 끝점) 내 노드에서 호출하면 meta node를 순회하고 종료한다.
DFS에서 가장 높은 post의 노드는 메타 그래프의 끝점(=강한 연결 성분의 끝점)의 source이다.
$C$, $C’$ 이 메타 그래프의 끝점(=강한 연결 성분의 끝점)이고, $C$ 내의 노드에서 $C’$ 내의 노드로 간선이 있다면, $C$ 내 가장 높은 post > $C’$ 내 가장 높은 post
메타 그래프의 끝점(=강한 연결 성분의 끝점)의 가장 높은 post를 감소시키는 순서로 배열하면, 강한 연결 성분을 선형화시킬 수 있다.