문제 링크
- http://icpc.me/12918
사용 알고리즘
- MCMF
풀이
y축 위에 물건을 놓아도 선대칭입니다.
각 물건에 대해 두 가지 중 한 가지 선택을 해야 합니다.
- 다른 물건 하나와 매칭해서 선대칭이 되도록 이동
- y축 위로 이동
1번의 경우 한 물건의 위치는 고정시키고 다른 물건 하나만 이동시켜도 최적해를 찾을 수 있다는 것은 직관적으로 알 수 있습니다. 그러므로 두 물건의 위치가 각각 $(x_i, y_i), (x_j, y_j)$라고 하면 $(x_j, y_j)$를 $(-x_i, y_i)$으로 이동시키면 됩니다. 이때의 이동 거리는 $\sqrt{(x_i+x_j)^2+(y_i-y_j)^2}$이 됩니다. 두 점이 각각 $\frac{1}{2}\sqrt{(x_i+x_j)^2+(y_i-y_j)^2}$ 만큼의 비용을 나눠서 부담한다고 생각해도 됩니다.
2번의 경우 $\vert x_i \vert$만큼 이동해야 합니다. $\frac{1}{2}\sqrt{(x_i+x_i)^2+(y_i-y_i)^2}$으로 표현할 수도 있습니다.
각 물건을 y축에 선대칭시켜서 새로운 물건을 하나씩 만들어준 뒤, x좌표가 음수인 물건을 $L_i$, x좌표가 양수인 물건을 $R_i$라고 합시다.
$L_i$와 $R_j$를 간선으로 이어주고 가중치를 (두 점 사이의 거리 / 2)로 설정한 이분 그래프를 만든 뒤, MCMF를 돌려주면 답을 구할 수 있습니다.
전체 코드
1 |
|