【NOIP2017提高組正式賽】寶藏

Description

   參與考古挖掘的小明得到了一份藏寶圖,藏寶圖上標出了 n 個深埋在地下的寶藏屋,也給出了這 n 個寶藏屋之間可供開發的 m 條道路和它們的長度。
   小明決心親自前往挖掘所有寶藏屋中的寶藏。但是,每個寶藏屋距離地面都很遠,也就是說,從地面打通一條到某個寶藏屋的道路是很困難的,而開發寶藏屋之間的道路則相對容易很多。
   小明的決心感動了考古挖掘的贊助商,贊助商決定免費贊助他打通一條從地面到某個寶藏屋的通道,通往哪個寶藏屋則由小明來決定。
   在此基礎上,小明還需要考慮如何開鑿寶藏屋之間的道路。已經開鑿出的道路可以任意通行不消耗代價。每開鑿出一條新道路,小明就會與考古隊一起挖掘出由該條道路所能到達的寶藏屋的寶藏。另外,小明不想開發無用道路,即兩個已經被挖掘過的寶藏屋之間的道路無需再開發。
   新開發一條道路的代價是:
   這條道路的長度 × 從贊助商幫你打通的寶藏屋到這條道路起點的寶藏屋所經過的寶藏屋的數量(包括贊助商幫你打通的寶藏屋和這條道路起點的寶藏屋)。
   請你編寫程序爲小明選定由贊助商打通的寶藏屋和之後開鑿的道路,使得工程總代價最小,並輸出這個最小值。

Input

第一行兩個用空格分離的正整數 n 和 m,代表寶藏屋的個數和道路數。
接下來 m 行,每行三個用空格分離的正整數,分別是由一條道路連接的兩個寶藏屋的編號(編號爲 1~n),和這條道路的長度 v。

Output

輸出共一行,一個正整數,表示最小的總代價。

Sample Input

【輸入樣例 1】
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 1

【樣例輸入 2】
4 5
1 2 1
1 3 3
1 4 1
2 3 4
3 4 2

Sample Output

【輸出樣例 1】
4

【輸入輸出樣例 1 說明】

小明選定讓贊助商打通了 1 號寶藏屋。小明開發了道路 1->2,挖掘了 2 號寶藏。開發了道路 1->4,挖掘了 4 號寶藏。還開發了道路 4->3,挖掘了 3 號寶藏。工程總代價爲:1 × 1 + 1 × 1 + 1 × 2 = 4
(1->2) (1->4) (4->3)

【樣例輸出 2】
5

【輸入輸出樣例 2 說明】

小明選定讓贊助商打通了 1 號寶藏屋。小明開發了道路 1->2,挖掘了 2 號寶藏。開發了道路 1->3,挖掘了 3 號寶藏。還開發了道路 1->4,挖掘了 4 號寶藏。工程總代價爲:1 × 1 + 3 × 1 + 1 × 1 = 5
(1->2) (1->3) (1->4)

Data Constraint

對於 20%的數據:
保證輸入是一棵樹,1≤n≤8,v≤5000 且所有的 v 都相等。
對於 40%的數據:
1≤n≤8,0≤m≤1000,v≤5000 且所有的 v 都相等。
對於 70%的數據:
1≤n≤8,0≤m≤1000,v≤ 5000
對於 100%的數據:
1≤n≤12,0≤m≤1000,v≤ 500000
想法:
設f[i][j]表示一棵樹構造到第i層,狀態爲j(選和沒選)的最小代價
然後構造第i+1層的狀態s,然後與每個選了的邊取一個最小值,推到f[i+1][s]
爲什麼是正確的呢(即一定會與第i層狀態連邊),如果和其他點連邊,這種狀態是會被記錄到的,所以不會wa

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章