pstopia Notes for Problem Solving Contest

[Medium] GogoXMarisaKirisima

Topcoder SRM 530 Div1

Problem

0번에서 도달할 수 없는 정점들을 모두 제거하고 n-1번으로 도달할 수 없는 정점들을 모두 제거하고 나면 (연결된 간선도 모두 제거) 답은 m - (n - 2) 다. 증명해보자. 1) 답의 상한은 m - (n - 2) 이다. 먼저 간단하게 생각해볼 수 있는건, 답은 무조건 m 이하라는 것이다. 매번 새로운 간선을 선택해야하기 때문에 간선 개수를 넘어서는 경로를 만들 수 없다. 현재 경로를 적당히 찾아놓은 상태라고 하자. 새로운 경로를 하나 찾을 것이다. 아직 방문하지 않은 점을 아무거나 하나 골라 u라고 하자. 0번에서 u까지 가는 경로는 무조건 존재하고 u에서 n-1로 가는 경로도 무조건 존재한다. 이제 0에서 u를 거쳐 n-1까지 가는 경로를 다음과 같이 잡자. 0 ----> a ----> u ----> b ----> n-1 * 0~>a 경로, b~>n-1 경로의 간선들은 전부 한번 방문한 간선이다. * a~>b 경로의 간선들은 전부 새로 방문하는 간선이다. * a~>b 경로는 단순경로다. 이렇게 되는 a~>b 를 항상 찾을 수 있다. 이 경로에 있는 점들은 전부 새로 방문하게 되는 정점들이다. 경로에 있는 점의 개수를 K라고 하면, 지난 간선의 개수는 K+1 개 이다. 이렇게 경로를 하나 찾게 되면, 새 경로를 한개 찾았지만 답이 될 수 있었던 K+1개의 '가능성' 들이 사라져버리게 된다. 따라서 답의 상한이 K만큼 줄어들게 된다. 이렇게 새 경로를 찾는 과정을 처음에 n-2개의 방문하지 않은 점이 있던 상태에서 모든 점을 방문할 때 까지 계속 반복할 수 있다. 다 방문하고 나면 답의 상한은 m - (n - 2) 가 된다. 2) m - (n - 2) 인 답이 존재한다. 위의 과정을 p번 반복해서 모든 정점과 모든 간선을 방문했다고 해보자. k[i] 는 i번 경로에서 새로이 방문하게 되는 정점의 수라고 하자. 우선 자명하게 k[1]+k[2]+...+k[p] = n-2 일 것이다. '방문하지 않은 간선 수' 는 매 단계마다 k[i]+1 개씩 줄어들 것이므로 p번 반복하고 나면 m-p-k[1]-k[2]-...-k[p] = 0 이고, 결국 p = m - (n-2) 가 된다. 따라서 m - (n - 2) 번 경로를 찾을 수 있다.