문제 링크
- https://icpc.me/16183
사용 알고리즘
- 트리 디컴포지션
시간복잡도
- $O(N+M)$
풀이
주어진 그래프가 Series-Parallel Graph인지 판별하는 문제입니다. 그래프의 treewidth가 2 이하인지 판별하는 문제라고 볼 수도 있습니다.
그래프를 생성하는 과정을 거꾸로 생각하면, 아래 두 가지 연산을 적용해서 그래프를 간선 하나로 축소시킬 수 있는지 판별하는 문제가 됩니다.
- 평행한 두 간선을 하나의 간선으로 병합 (parallel 연결의 역연산)
- 차수가 2인 정점을 제거해서 두 간선을 하나로 병합 (series 연결의 역연산)
인접 리스트를 std::set
등으로 관리하면 첫 번째 연산을 효율적으로 수행할 수 있습니다.
두 번째 연산은 재귀적으로 수행할 수 있습니다. 차수가 2인 정점을 선택해서 간선을 병합한 뒤, 병합된 간선의 양 끝점 중 차수가 2인 간선이 있다면 재귀적으로 작업을 수행하면 됩니다.
두 가지 연산만 이용해 정점을 2개만 남기고 모두 없앨 수 있다면 주어진 그래프는 series-parallel graph입니다.
std::set
을 사용하면 $O(M \log N)$, std::unordered_set
을 사용하면 $O(N+M)$입니다.
전체 코드
1 |
|