문제 링크
- https://icpc.me/19614
문제 출처
- 2020 CCO Day2 1번
사용 알고리즘
- 연결 리스트
시간복잡도
- $O(N^2)$
풀이
정점을 하나씩 추가해서 경로를 만드는 방식으로 진행합니다.
지금까지 만든 경로를 $(v_1, v_2, \cdots, v_k)$, RR...RBB...B
형태라고 합시다.
새로운 정점 $x$를 추가할 때 만약 $(x, v_1)$ 간선이 R
이면 앞에 추가하고 $(v_k, x)$ 간선이 B
이면 뒤에 추가하면 됩니다. 두 가지 경우에 모두 해당하지 않는다면 $(x, v_1)$이 B
, $(v_k, x)$가 R
인 상태입니다.
만약 $(v_1,v_k)$가 R
이면 $v_k$를 $v_1$ 앞에 붙인 다음, $(x,v_k)$가 R
이니까 $x$를 앞에 붙이면 됩니다. 그렇지 않다면 $(v1,v_k)$가 B
일 텐데, 이때는 $v_k$ 뒤에 $v_1$을 붙인 다음 $x$를 뒤에 붙이면 됩니다.
남은 부분은 원하는 정점을 시작 정점으로 만드는 것입니다. 시작 정점을 가장 마지막에 추가한 다음, 만약 시작 정점이 맨 뒤로 갔다면 경로를 뒤집어서 시작 정점이 되도록 보장할 수 있습니다.
연결 리스트를 사용하면 시작점마다 $O(N)$ 시간이 걸려서 총 $O(N^2)$ 시간에 문제를 해결할 수 있습니다.
전체 코드
1 |
|