BOJ 28028 - Custodial Cleanup

image.png

그리디하게 가장 많은 키를 11번에서 시작해 모아보자.

이런 BFS 테크닉은 가끔 나오는데 방문할 수 있는 조건이 동적일 때, 현재 방문할 수 있는건 바로 방문하고 그렇지 않은것은 다른 pending queue에 넣어두었다가 특정 노드에서 어떤 조건이 만족되면 그 조건들에 pending 되어있는 노드들을 다시 큐에 삽입시켜주는 것이다.

11 번에서 방문될 수 있는 노드들의 집합 외 노드에서 sifis_i \neq f_i 인 경우가 있다면 불가능하다.

그렇지 않다면 다음과 같은 아이디어를 써서 검사한다.

해설 왈, 그리디 알고리즘은 동작하지 않는다고 증명되었다고 한다.

모든 키를 가졌다고 해도 cific_i \neq f_i 인 것들때문에 항상 모든 노드를 방문할 수 있는건 아니다.

그리고 11번에서 시작해서 모두 두고오는 로직을 짜는건 곤란하므로, 역으로 생각하여 첫 BFS에서 방문된 노드들에 모두 si=fis_i=f_i 로 설정하고 반대로 그것들을 모두 줏어올 수 있는지를 판별한다.

이것이 성립하는 이유는 키들을 모두 두는것과 키들을 모두 줏어오는게 반대로 행동하면 동치이기 때문이다.

다만 두 번째의 BFS에서는 조건을 조금 다르게 가려는 방에 cic_i 에 해당하는 키가 이미 있거나 ci=fic_i=f_i 인 경우에만 가도록 한다.

왜냐면 두 번째 BFS에서는 ii 에 진입하기 위해 cic_i 가 필요한게 아니라 ii 에서 나오기 위해 cic_i 가 필요하기 때문이다.

이걸 좀 더 설명하면, iji \to j 로 갈 때, cjc_j를 현재 키중에 갖고있거나 cj=fjc_j=f_j 인지 봐야한다는건 이제 jj 로 가면 현재 가진 키들과 fjf_j 의 키를 원래 과정에서 가지고 있었다는 뜻인데, 그럼 cjc_j 가 있었어야 하므로 jj 를 가기 직전인 ii 에서 (원래 과정에선 jj 이후에 ii) cjc_j 를 가지고 있어야 하거나 cj=fjc_j=f_j 라서 jj 에서 fjf_j 키를 쓴 다음 ii 로 온거거나 둘 중 하나여야 한다.

Tags:

Categories:

Updated:

Comments