일단 누가봐도 Tree 에서의 DP 문제이다. 하지만 Cycle Graph 에서는 DP 을 사용하기가 어렵다. 이미 방문한 Node 와 Cycle 간의 구분이 힘들기 때문이다. 그래서 SCC 를 사용해 DAG 로 만들 필요가 있다.
SCC 를 이용한 그래프 압축을 했다면 DP 를 수행할 수 있다. 이를 구현하는 법은 여러가지겠지만 DFS 를 이용한 아래의 방법은 두가지 포인트를 갖는다.
이제 Graph 의 각 Node 가 아니라 SCC 전체의 값을 사용해 값을 업데이트 해간다. DAG 의 특성 상 SCC 가 달라지는 지점에 한번만 SCC 의 값을 사용해도 충분하다.
계산된 값을 저장하는 단위는 Vertex 단위가 아니라 SCC 단위로 한다. 다시말해 아래 코드의 dp[] 에 사용되는 인덱스가 SCC 의 인덱스어야 한다는 것이다. 그렇지 않으면 같은 SCC 의 Node 라도 값이 다르게 되어 문제가 발생한다. 이 부분이 디버그해서 잡아내기가 힘드므로 주의하자.
여기에 추가로 시작지점과 종료후보지점을 처리해야한다.
시작지점은 문제를 간단하게 해준다. 시작지점에서 도달 불가능한 Node 는 탐색할 필요가 없기 때문이다. 일반적 SCC 가 모든 Node 에 대해서 한번씩 탐색을 해야한다면 여기서는 시작지점에서만 DFS 를 돌리면 된다.
종료후보지점은 DFS() 를 수행할 때 종료지점에 도달했는지를 기록해서 수행한다. 단순히 dp[] 에 정수를 저장해 음수 등으로 종료지점 도달여부를 수행하면 일이 복잡해진다. bool 값을 따로 쓰자.
댓글남기기