棟棟居住在乙個繁華的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 51 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.當這條路所需花費是負數,即能賺錢的時候,即使構成迴路,也要加到最小生成樹的花費裡。
2…第一次執行不加碼頭的克魯斯卡爾演算法,第二次執行加了碼頭的克魯斯卡爾演算法,然後比較兩次的花費,選出最小的那個。
為什麼要執行兩次呢,因為如果只執行加了碼頭的演算法時候,可能得出的花費比只修路不建碼頭的花費還要高,即不需要建碼頭就可以得出最小花費,不必非得建碼頭。
下面看**:
#include
#include
using
namespace std;
#define maxvex 10000
//最大頂點數
#define maxedg 100000
//最大邊數
typedef
struct
edg;
//建立邊表
int pre[maxvex+1]
,dock[maxvex+1]
;//找上級陣列 碼頭陣列
edg edgnum[maxvex+maxedg]
;//邊表陣列
int shortcost1=
0,shortcost2=0;
intcmp
(edg x,edg y)
intfind
(int n)
//並查集演算法 (找掌門)
return n;
//最終返回的都是掌門的值
//else
// return pre[n]=find(pre[n]); //並查集壓縮優化演算法
}int
createmitree
(int n,
int m)}if
(num//如果沒有最小生成樹
sum=-1
;return sum;
//返回最小花費
}int
main()
}//為什麼要查詢兩次 如果只查詢一次碼頭加路徑的話 算出來的值可能會比只建道路的多 (不一定非得建碼頭)
shortcost2=
createmitree
(n,m)
;//第二次碼頭加路徑
if(shortcost1==-1
)//如果道路間沒有最小生成樹 即為不連通圖 只考慮加碼頭的情況
cout
cout<<
min(shortcost1,shortcost2)
}
藍橋杯 歷屆試題 城市建設
最小生成樹 參考 關鍵點 加乙個狀態0,與可建碼頭的地區相連 思路 1 只有道路便是連通圖 考慮加碼頭與不加碼頭兩種情況 2 道路之間是不連通的,只有加上碼頭才能連通,只考慮加上碼頭的情況 include include include using namespace std define maxn...
藍橋杯 歷屆試題 城市建設
時間限制 1sec 記憶體限制 128mb 提交 58 解決 4 題目描述 棟棟居住在乙個繁華的c市中,然而,這個城市的道路大都年久失修。市長準備重新修一些路以方便市民,於是找到了棟棟,希望棟棟能幫助他。c市中有n個比較重要的地點,市長希望這些地點重點被考慮。現在可以修一些道路來連線其中的一些地點,...
藍橋杯歷屆試題 城市建設 (最小生成樹)
歷屆試題 城市建設 時間限制 1.0s 記憶體限制 256.0mb 問題描述 棟棟居住在乙個繁華的c市中,然而,這個城市的道路大都年久失修。市長準備重新修一些路以方便市民,於是找到了棟棟,希望棟棟能幫助他。c市中有n個比較重要的地點,市長希望這些地點重點被考慮。現在可以修一些道路來連線其中的一些地點...