
당신은 공룡이 살아 숨쉬는, 개의 섬으로 이루어진 섬나라를 여행하게 되었다. 각 섬은 번부터 번까지 번호가 매겨져 있으며, 당신은 이 모든 섬을 빠짐없이 방문하려고 한다.
섬들 중 어떤 개의 쌍에는 선후 관계가 존재한다. 섬 에서 섬 로 선후 관계가 존재한다면 반드시 번 섬을 먼저 방문한 뒤에 섬 를 방문해야 한다.
각 섬에는 , 로 표시되는 두 종류 중 하나의 자외선 위험이 있다. 자외선으로부터 몸을 보호하기 위해 당신은 방호복을 입어야 한다. 같은 종류의 자외선 위험이 있는 섬을 연속으로 방문하는 경우에는 방호복을 갈아 입을 필요가 없지만, 한 종류의 자외선 위험이 있는 섬을 방문한 직후에 다른 종류의 자외선 위험이 있는 섬을 방문하려면 방호복을 갈아 입어야 한다.
처음 방호복을 입을 때에는 비용이 들지 않지만, 갈아입을 때마다 의 비용이 든다.
모든 섬을 방문하는 데 드는 최소 비용을 계산하는 프로그램을 작성하라.
입력 형식
첫 줄에 섬의 개수를 나타내는 정수 과 선후 관계의 개수를 나타내는 정수 이 공백으로 구분되어 주어진다. ( )
그다음 줄에 각 섬의 자외선 위험 종류가 섬 번호 순서대로 공백으로 구분되어 주어진다. 자외선 위험 종류는 또는 로 표현된다.
그다음 개의 줄에 섬들의 선후 관계들이 섬 번호의 쌍으로 주어진다. 각 줄에는 두 정수 , 가 공백으로 구분되어 주어지며, 이는 번 섬을 먼저 방문한 다음 번 섬으로 갈 수 있음을 뜻한다. ( )
같은 선후 관계는 두 번 이상 주어지지 않으며, 항상 주어진 선후 관계를 모두 만족하면서 모든 섬을 여행하는 것이 가능한 입력만 주어진다.
출력 형식
첫 줄에 모든 섬을 여행하기 위한 최소 비용을 출력한다.
예제 1
입력
5 4 0 0 1 1 0 3 2 2 4 2 5 4 1
출력
3
예제 2
입력
4 0 1 1 1 1
출력
0
예제 설명
섬 번호로 표현했을 때 , , , , 의 순서로 방문하면 방호복을 세 번 갈아입게 되며, 이 경우가 최선이다.
채점 방식
입력 케이스들은 다음과 같은 종류로 구별되며, 한 종류의 케이스를 다 맞혀야 그 종류에 배정된 점수를 받을 수 있다.
종류 1: 5점
종류 2: 24점
종류 3: 10점
번째 선후 관계는 로 주어진다.
종류 4: 23점
종류 5: 38점
모든 입력 케이스가 주어짐.
해설
이 문제는 두 가지 방호복 패턴( 또는 ) 중 하나를 선택해 가능한 섬들을 차례로 방문하며 최소 갈아입기 횟수를 찾는 방식으로 풀 수 있습니다.
주어진 선후 관계로 각 섬의 진입 차수를 계산한 뒤, 위상 정렬과 비슷하게 동작하는 큐 두 개를 준비합니다. 하나는 자외선 위험이 인 섬, 다른 하나는 인 섬을 저장하며, 시작할 때 진입 차수가 인 섬들을 각각 해당 큐에 넣습니다.
이후 현재 방호복 색( 또는 )에 맞는 큐에서 가능한 모든 섬을 꺼내 방문하고, 섬을 방문할 때마다 연결된 다음 섬들의 진입 차수를 줄이며, 이 되면 해당 섬의 자외선 종류에 맞는 큐에 넣습니다. 현재 색 큐가 비었을 때만 색을 바꾸고, 다른 큐에서 이어서 진행합니다.
이 과정을 으로 시작하는 경우와 로 시작하는 경우 각각 실행해 나온 비용을 비교해 더 작은 값이 답이 되며, 시간 복잡도는 위상 정렬과 동일한 입니다.