Gemini Tree (Ver.Jadeite)
시간 제한5초메모리 제한1024 MB
간선 길이가 바뀔 때마다, 인접한 정점끼리 돌을 교환해 한 색으로만 이루어진 두 덩어리 이하로 나누는 최소 비용을 구합니다.
문제
각 정점에 초록색 또는 파란색 돌이 하나씩 놓인 트리를 생각한다. 이 트리는 아래 연산 1과 연산 2를 수행한 뒤 조건 3을 만족할 수 있으면 "Gemini Tree"라고 부른다.
- 먼저 간선으로 직접 연결된 정점 쌍을 골라, 두 끝점에 놓인 돌을 서로 바꾼다. 이 연산을 0회 이상 원하는 만큼 반복한다.
- 다음으로 간선을 최대 1개 골라 삭제한다.
- 이때 트리는 최대 두 개의 연결 요소로 나뉘고, 각 연결 요소에는 한 종류의 돌만 있다.
각 간선에 길이가 주어진 Gemini Tree의 값을 다음과 같이 정의한다.
- 먼저 간선으로 직접 연결된 정점 쌍을 골라, 끝점에 놓인 돌을 서로 바꾼다. 이 연산을 0회 이상 반복한다. 한 번 바꿀 때마다 드는 비용은 그 간선의 길이와 같다.
- 다음으로 간선을 최대 1개 골라 삭제한다.
- 이때 트리는 최대 두 개의 연결 요소로 나뉘고, 각 연결 요소에는 한 종류의 돌만 있다.
- 조건 3을 만족하는 데 필요한 연산 1의 총비용의 최솟값이 이 트리의 값이다.
값을 계산할 때 돌은 실제로 이동하지 않는다.
정점이 개인 Gemini Tree가 주어진다. 은 홀수이다. 번째 간선은 정점 와 를 잇고, 길이는 이다. 정점에 놓인 돌의 색은 문자열 으로 주어지며, 는 정점 의 돌 색이다.
이 트리에 대해 번의 연산을 순서대로 수행한다. 번째 연산은 두 정수 , 로 주어지며, 번째 간선의 길이를 만큼 늘린다. 이 변경은 이후 연산에도 그대로 유지된다. 각 연산 후 트리의 값을 출력한다.
입력
출력
개의 줄을 출력한다. 번째 줄에는 번째 연산을 수행한 후 트리의 값을 출력한다. 각 줄의 끝에는 줄바꿈을 넣는다.
제한
- 모든 입력은 정수이다.
- 은 홀수이다.
- 는 "G" 또는 "B"이며, 정점 의 돌 색을 나타낸다. "G"는 초록색, "B"는 파란색이다.
- 주어진 그래프는 Gemini Tree이다.
힌트
첫 번째 샘플에는 초록색 돌이 하나뿐이다. 따라서 이 문제는 그 돌을 최소 비용으로 잎 정점 중 하나로 옮기는 문제이다.