歷屆試題 城市建設
時間限制:1.0s 記憶體限制:256.0mb
問題描述
棟棟居住在乙個繁華的c市中,然而,這個城市的道路大都年久失修。市長準備重新修一些路以方便市民,於是找到了棟棟,希望棟棟能幫助他。
c市中有n個比較重要的地點,市長希望這些地點重點被考慮。現在可以修一些道路來連線其中的一些地點,每條道路可以連線其中的兩個地點。另外由於c市有一條河從中穿過,也可以在其中的一些地點建設碼頭,所有建了碼頭的地點可以通過河道連線。
棟棟拿到了允許建設的道路的資訊,包括每條可以建設的道路的花費,以及哪些地點可以建設碼頭和建設碼頭的花費。
市長希望棟棟給出乙個方案,使得任意兩個地點能只通過新修的路或者河道互達,同時花費盡量小。
輸入格式
輸入的第一行包含兩個整數n, m,分別表示c市中重要地點的個數和可以建設的道路條數。所有地點從1到n依次編號。
接下來m行,每行三個整數a, b, c,表示可以建設一條從地點a到地點b的道路,花費為c。若c為正,表示建設是花錢的,如果c為負,則表示建設了道路後還可以賺錢(比如建設收費道路)。
接下來一行,包含n個整數w_1, w_2, …, w_n。如果w_i為正數,則表示在地點i建設碼頭的花費,如果w_i為-1,則表示地點i無法建設碼頭。
輸入保證至少存在乙個方法使得任意兩個地點能只通過新修的路或者河道互達。
輸出格式
輸出一行,包含乙個整數,表示使得所有地點通過新修道路或者碼頭連線的最小花費。如果滿足條件的情況下還能賺錢,那麼你應該輸出乙個負數。
樣例輸入
5 5
1 2 4
1 3 -1
2 3 3
2 4 5
4 5 10
-1 10 10 1 1
樣例輸出
9 樣例說明
建設第2、3、4條道路,在地點4、5建設碼頭,總的花費為9。
資料規模和約定
對於20%的資料,1< =n< =10,1< =m< =20,0< =c< =20,w_i< =20;
對於50%的資料,1< =n< =100,1< =m< =1000,-50< =c< =50,w_i< =50;
對於70%的資料,1< =n< =1000;
對於100%的資料,1 < = n < = 10000,1 < = m < = 100000,-1000< =c< =1000,-1< =w_i< =1000,w_i≠0。
解釋:1:我們可以通過kruskal演算法求出花費最少的路徑
2:怎麼處理架設碼頭的點呢?我們可以另外架設乙個結點0,將所有假設碼頭的點和0結點相連然後在處理;
3:因為架設碼頭會多出乙個點,所以我們要分開判斷,以防止結點數的判斷上出問題
4:最坑的是有的路徑可以盈利,為了使花費最小,這些路徑不管怎麼樣都要加上,不能像正常的kruskal演算法因為已經有了更小的連線就不加了;
#include #include #include #include #define maxv 100005
#define maxe 200005
using namespace std;
struct edgee[maxe];
int fa[maxv];
bool cmp(edge a,edge b)
{ return a.cost
nyoj 925 國王的煩惱(最小生成樹)
1 2 題意 n個城市中每兩個城市有多條路徑連線,可是因為路徑存在的天數是有限的!以為某條路經不存在了 3導致n個城市不能連通了,那麼村名們就會 問一共會有多少次 45 思路 最小生成樹.我們用最大邊來建立樹!只要有最大邊將節點連線並保證連通!那麼邊權小的值 6就可以忽略了!最後將生成樹中由 最大邊...
nyoj 925 國王的煩惱(最小生成樹)
題意 n個城市中每兩個城市有多條路徑連線,可是因為路徑存在的天數是有限的!以為某條路經不存在了 導致n個城市不能連通了,那麼村名們就會 問一共會有多少次 思路 最小生成樹.我們用最大邊來建立樹!只要有最大邊將節點連線並保證連通!那麼邊權小的值 就可以忽略了!最後將生成樹中由 最大邊組成的 去重 相同...
nyoj 925 國王的煩惱(最小生成樹)
題意 n個城市中每兩個城市有多條路徑連線,可是因為路徑存在的天數是有限的!以為某條路經不存在了 導致n個城市不能連通了,那麼村名們就會 問一共會有多少次 思路 最小生成樹.我們用最大邊來建立樹!只要有最大邊將節點連線並保證連通!那麼邊權小的值 就可以忽略了!最後將生成樹中由 最大邊組成的 去重 相同...