문제 링크
- http://icpc.me/13361
문제 출처
- 2016 NCPC H번
사용 알고리즘
시간복잡도
풀이
여름학교에서 못 풀고, 집에서도 못 풀어서 구사과님의 풀이를 봤습니다ㅠㅠ
철판의 방향을 고정시킨 상황을 가정해봅시다.
이 상황에서는 철판의 넓이가 줄어들어야 한다는 사실은 필요 없습니다. 정렬을 하면 넓이가 감소하도록 조절할 수 있습니다.
그러므로 방향이 고정되었을 때, 넓이가 모두 다르다면 아무 상관 없습니다.
결국, 철판의 방향을 적절히 고정시켜서 모든 넓이를 다르게 하고 높이를 최대화/너비의 합을 최소화시키는 문제로 바뀌게 됩니다.
넓이와 높이를 나타내는 숫자를 정점으로 잡고, 한 철판의 높이와 넓이를 나타내는 두 정점을 서로 이어준 그래프를 생각해봅시다.
최대 2N개의 정점으로 이루어진 그래프가 나오게 됩니다. 우리는 아래 3가지 조건을 만족하는 상태를 찾으면 됩니다.
- 각 간선에 달려있는 정점 중 하나를 색칠하고
- 색칠한 정점이 겹치면 안 되고
- 색칠한 정점의 가중치의 합은 최소화해야한다.
입력 조건을 보면 항상 답이 존재한다고 나와있기 때문에, 모든 컴포넌트는 | E | <= | V | 를 만족합니다. 그러므로 각 컴포넌트는 두 가지 상태 중 하나입니다. |
-
트리 하나의 정점만 안 색칠하면 됩니다. 가중치를 최소화할 것이기 때문에 가중치가 가장 큰 정점을 색칠하지 않으면 됩니다.
해당 컴포넌트의 가중치의 합은 (전체 가중치의 합) - (최대 가중치)입니다. -
|V| = |E| 모든 정점을 색칠할 수 있습니다. 이 컴포넌트의 합은 전체 가중치의 합이 됩니다.
전체 코드
1 |
|