알고리즘

[알고리즘] Dynamic Programming(동적 계획법)-DAG(Directed Acyclic Graph) shortest path(최단 경로)

alphabet 2023. 5. 26. 14:56

위의 그림은 DAG(Directed Acyclic Graph) 이다. DAG는 비순환 그래프를 의미하는데 단순히 말해서 cycle이 존재하지 않는다는 뜻이다. 다음에 그래프의 종류에 대해서는 따로 글을 써보도록 하겠다.

모모든 DAG 그래프는 아래와 같이 linearization 할 수 있다. 

dist(X)가 S로부터 어떤 점 X로 갈때의 최단 거리를 리턴하는 함수라고 생각해보자.

dist(X)를 계산하기 위해서는 dist(C)+3과 dist(B)+1 만 비교하면 된다. 왜냐하면 B와 C만 D의 predecessor 이기 때문이다. Predecessor는 뭐냐면 Q->W 일때 Q를 predecessor, W를 successor 라고 한다. 즉 D 직전에 오는 것이 B와 C밖에 없다는 의미이다.

따라서 임의의 점 X까지의 최단 거리 dist(X)를 구하기 위해서는 X의 predecessor를 반드시 지나야 하므로 dist(X_predecessor)+E(X_predecessor, X)끼리만 비교하면 된다는 것이다!

dist(D)=min{dist(B)+1, dist(C)+3} 이라는 것이다.

또한, DAG에서는 linearization이 항상 가능하므로(나중에 다룰 것이다 직관적으로도 이해하기는 어렵지 않을 것이다.)

맨 왼쪽 점부터 맨 오른쪽 점까지 순서대로 dist를 구하면, 그 값이 모두 최단 거리라는 것을 알 수 있다!

(X의 predecessor가 X의 왼쪽에만 존재하고, 오른쪽에는 존재하지 않기때문에 가능한것이다)

따라서 이 문제를 동적계획법을 이용해서 쉽게 풀 수 있다는 사실을 알 수 있다.

다음은 python을 이용해 시작점으로부터 각 점까지의 최단 거리를 구하는 함수를 Top-down 방식으로 구현한 것이다.