CHEER - Động viên đàn bò

Tags: kruskal, dsu, mst, graph

Problem

https://vn.spoj.com/problems/CHEER

https://oj.vnoi.info/problem/CHEER

Bác John dạo này lười đến nỗi không muốn bảo trì các con đường dẫn bác đến thăm N (5 <= N <= 10,000) cánh đồng (đánh số từ 1 đến N) nữa. Mỗi cánh đồng là nơi ở của một cô bò. Bác John có kế hoạch loại bỏ nhiều nhất P (N-1 <= P <= 100,000) con đường sao cho các cánh đồng vẫn liên thông.

Ban phải xác định N-1 con đường cần giữ lại.

Đường nối hai chiều j nối giữa cánh đồng Sj và Ej (1 <= Sj <= N; 1 <= Ej <= N; Sj # Ej) và cần Lj (0 <= Lj <= 1000) thời gian để di chuyển. Không có hai cánh đồng nào được nối trực tiếp bởi nhiều hơn một con đường.

Đàn bò buồn vì hệ thống giao thông của chúng sắp bị rút gọn. Bạn phải thăm mỗi cô bò ít nhất một lần trong ngày để động viên. Mỗi lần thăm cánh đồng i (dù chỉ đi ngang qua), bạn phải trò chuyện với cô bò trong thời gian Ci (1 <= Ci <= 1000).

Bạn sẽ nghỉ lại đêm trên cùng một cánh đồng (bạn sẽ được chọn) cho đến khi đàn bò đều đã hết bị suy sụp. Bạn sẽ trò chuyện với cô bò trong cánh đồng mà bạn nghỉ lại ít nhất 2 lần vào buổi sáng thức dậy và vào buổi tối khi trở về nghỉ.

Giả dụ bác John theo lời khuyên của bạn giữ lại một số con đường và bạn sẽ chọn cánh đồng tối ưu nhất để nghỉ lại, hãy xác định thời gian nhỏ nhất bạn cần để thăm tất cả đàn bò ít nhất một lần trong ngày.

Dữ liệu

  • Dòng 1: Hai số nguyên N và P cách nhau bởi khoảng trắng
  • Dòng 2..N+1: Dòng i+1 chứa một số nguyên duy nhất Ci
  • Dòng N+2..N+P+1: Dòng N+j+1 chứa ba số nguyên phân biệt: Sj, Ej và Lj

Kết quả

  • Dòng 1: Một số nguyên duy nhất, tổng thời gian cần để thăm tất cả đàn bò (bao gồm hai lần thăm cô bò ở nơi mà bạn nghỉ).

Ví dụ

Dữ liệu:
5 7
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6
4 5 12

Kết quả:
176

Tutorial

Bài toán cho N đỉnh có trọng số c[i]M cạnh có trọng số w[i], vô hướng. Cần tìm ra cây khung sao cho bắt đầu từ một đỉnh trong cây khung, đi qua tất cả các đỉnh và quay về đỉnh ban đầu với tổng trọng số nhỏ nhất. Trọng số được tính bằng tổng trọng số các đỉnh và các cạnh đã đi qua và đã chọn để bắt đầu.

Hình ảnh minh họa cho input của đề bài như sau

Minh họa input đề bài CHEER

Trong hình trên, các cạnh tô đậm là những cạnh được chọn trong cây khung và đỉnh số 4 được tô màu là đỉnh bắt đầu. Đường đi thực hiện như sau: 454212324.

Với ví dụ trên, nhận thấy rằng với mỗi cây khung được chọn, mỗi cạnh trong cây khung đều đi qua đúng hai lần và mỗi đỉnh đi qua đúng số cạnh kề với nó (chỉ tính những cạnh được chọn). Ví dụ trong hình trên cạnh 1-2 được chọn và giả sử bắt đầu bằng bất kì đỉnh nào thì cạnh này đi qua đúng hai lần, đi và về; đỉnh 1 sẽ thăm đúng một lần (không kể trường hợp bắt đầu bằng 1 thì phải thăm hai lần), đỉnh 2 thăm đúng 3 lần (có 3 cạnh kề tô màu tím, và đường nhiên không tính đỉnh bắt đầu là 2). Riêng đỉnh bắt đầu trong cây khung sẽ thăm thêm một lần là ban đầu đã thăm ở nó.

Từ nhận xét trên ta gán trọng số cạnh (u,v) từ w thành w * 2 + c[u] + c[v]. Khi đó khi ta chọn cạnh này ta đã tính luôn 2 lần đi qua nó và số lần thăm u, v. Lúc này chỉ cần tìm cây khung nhỏ nhất và sau đó chọn đỉnh bắt đầu nhỏ nhất.


Submission

CHEER.cpp