문제 링크: https://www.acmicpc.net/problem/17970
17970번: Islands
Your program is to read from standard input. The input starts with a line containing an integer n (5 ≤ n ≤ 100,000), where n is the number of villages in each island. The villages are numbered from 1 to n. In the following two lines, each line contains
www.acmicpc.net
1. 정점의 순서들이 가지는 성질에 대해서 알아보자.
- 하나의 섬에서 1번째 정점부터 i번째 정점까지 하나의 구간을 이룬다.
- i+1번째 정점은 1번째 정점부터 i번째 정점이 이루는 구간과 인접해 있다.
시작점을 고정하자. 새로운 정점을 방문할 때마다 두 섬 모두에서 방문한 정점이 이루는 구간과 인접한 정점을 선택하는 그리디한 알고리즘이 성립한다. 따라서 문제를 시간복잡도 O(N2)에 해결할 수 있다.
2. 정점 i와 섬 j에서 인접한 정점들의 집합을 Nj(i)로 정의하자. N1(i)=N2(i)를 만족하는 정점 i를 제거해도 모든 정점을 방문하는 경로의 존재 여부는 바뀌지 않는다.
p, q랑 인접한 정점 r이 있다고 가정하자. 시작점이 r인 경우에는 두 섬 모두에서 인접한 p, q를 방문하고 시작한다. 이는 r을 제거한 경우 p에서 시작해 q를 방문하는 경로와 동일하게 생각할 수 있다.

시작점이 r이 아닌 경우를 생각해보자. 편의상 p를 q보다 먼저 방문한다고 하자. p와 인접한 r, r과 인접한 q를 방문하게 된다. 이는 r을 제거한 경우 p에서 q를 방문하는 것과 동일하게 생각할 수 있다.

N1(i)=N2(i)를 만족하는 정점 i가 없을 때까지 계속해서 정점을 제거하자. 제거하다가 점의 개수가 3개가 된다면 아무 길이 3의 경로가 답이 될 수 있기 때문에 정점을 제거하기 전의 섬에서도 임의의 점에서 시작해서 답을 얻어낼 수 있다. 이제 모든 정점 i에 대해 N1(i)≠N2(i)인 경우에 대해 알아보자.
3. 정점 i에서 시작한 탐색이 구간 Pi에서 끝난다고 하자. Pi 밖의 정점 j에 대해 Pj≠{1,2,⋯,N}이라면 |Pi∩Pj|≤2이다.
Pi∩Pj가 구간을 이루지 않고 Pi의 양쪽 끝에 존재한다고 하자. 그렇다면 PCi⊂Pj이다. j에서 시작해서 탐색을 할 때 Pi 내부에 있는 정점의 우선순위를 가장 나중으로 한다면 방문한 정점들의 구간이 PCi가 되는 시점이 있다. PCi를 구성하는 경로와 Pi를 구성하는 경로의 끝점을 이어서 j에서 시작하는 길이 N의 경로를 완성할 수 있어서 모순이다.
따라서 Pi∩Pj은 구간을 이룬다. j에서 교집합 내부의 정점을 구간의 시작에서 끝 순으로 탐색하기 때문에 Pi∩Pj의 크기가 3 이상이라면 Pi∩Pj의 끝점이 아닌 점의 N1과 N2가 같아서 모순이다.
4. j∈Pi인 경우에 Pj⊂Pi이다. 위에서 설명한 그리디 알고리즘을 조금 더 보완하자. 시작점을 고정하고 그리디하게 탐색을 한 뒤에, 만약 길이 N의 경로를 만드는 데 실패했다면 탐색한 구간 내부에서 시작점을 잡지 않는 것이다. 이는 O(N)의 실행시간을 보인다.
Pi의 끝부분에 있는 점을 2개씩 제거한 집합을 Qi라고 하자. 위 알고리즘에서 시작점으로 잡은 정점은 Q가 겹치지 않는다. 따라서 길이 N의 경로가 나오기 전에 전체 탐색하는 정점의 개수는 5N개를 넘지 않는다.
'ps (문제)' 카테고리의 다른 글
SNUPC 2022 G번 수 만들기 (0) | 2024.04.04 |
---|---|
ICPC 2019 Seoul Regional E번 Network Vulnerability (0) | 2024.04.01 |
ICPC 2021 Seoul Regional I번 Postman (0) | 2024.03.29 |
CCO23 day1 (0) | 2023.07.24 |
백준 14421 The Kingdom of JOIOI (0) | 2023.01.20 |