[BOJ] 1733번: 등번호

https://www.acmicpc.net/problem/1733


이 문제의 풀이는 2가지가 있습니다.


1. bipartite matching


각 선수에 대해 가능한 두 등번호를 연결해두면 bipartite matching 문제로 변형할 수 있습니다. Hopcroft는 시간복잡도가 $O(V^{0.5}E)$이기 때문에 잘 구현되어있는 구현체를 사용하면 시간 제한 내에 충분히 들어올 수 있습니다. 


2. Graph Theory


등번호가 (3, 3) 이라던가, 혹은 (3, 3)이 있어서 3은 이미 쓸 수 없게 되었는데 다음에 등번호가 (3, 5)라던가 하는 이유로 등번호가 바로 고정되는 사람들을 미리 빼두고 생각합시다.


나머지들에 대해 등번호가 a, b인 사람이 있다고 할 때 노드 a와 b를 연결하는 간선을 생각해봅시다. 그러면 그렇게 만들어진 그래프에서 각 노드에 대해 양 쪽의 노드 중 하나를 매칭시켜줘야 하는 문제로 생각할 수 있습니다. 그리고 잘 생각해보면 Connected Component에서 E >= V-1인데 E > V가 되는 순간 무조건 불가능할거니 그래프의 각 Connected Component는 결국 E = V 혹은 E = V - 1의 꼴이 될 수 밖에 없습니다. 여기까지 이해하셨다면 구현 방향은 크게 어렵지 않게 잡힐 것 같습니다.


2번 방법의 시간복잡도는 $O(N + 1000000)$인게 분명한데 제 구현에 문제가 있었는지 수행 시간이 Hopcroft보다 2번이 더 오래걸리네요. 아무튼 재채점으로 인해 터져서 새로 풀었는데 굉장히 재밌었고 능지가 상승하는 기분이 들었습니다. 맞은 후에 다른 사람의 코드를 보니 재채점 이후에도 Hopcroft로 생존한 경우를 여럿 볼 수 있었습니다.


https://github.com/blisstoner/BOJ/blob/master/1733.cpp

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 1339번: 단어 수학  (0) 2018.07.19
[BOJ] 9577번: 토렌트  (0) 2018.07.18
[BOJ] 9576번: 책 나눠주기  (0) 2018.07.18
[BOJ] 1413번: 박스 안의 열쇠  (0) 2018.07.18
[BOJ] 3946번: Maximum Random Walk  (4) 2018.07.18
[BOJ] 2066번: Double Patience  (0) 2018.07.18
  Comments