問題描述
棟棟居住在乙個繁華的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
樣例輸出
樣例說明
建設第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。
ac的c++程式如下:
#include#include#include#include#includeusing namespace std;
const int maxn=10000+5;
int cost[maxn];//每個碼頭的費用
int father[maxn];
void init(int n)
}int find(int n)
void merge(int a,int b)
}struct edge
edge(int u1,int v1,int len1)
bool operator<(const edge &s) const };
int n,m;
int main()
for(int i=1;i<=n;i++)
int sum1=0,sum2=0;//分別儲存無碼頭和有碼頭的總花費
while(!q1.empty())
} int root=find(1),flag=1;
for(int i=1;i<=n;i++)
}init(n);
while(!q2.empty())
} if(flag==0) cout
城市建設 藍橋杯
問題描述 棟棟居住在乙個繁華的c市中,然而,這個城市的道路大都年久失修。市長準備重新修一些路以方便市民,於是找到了棟棟,希望棟棟能幫助他。c市中有n個比較重要的地點,市長希望這些地點重點被考慮。現在可以修一些道路來連線其中的一些地點,每條道路可以連線其中的兩個地點。另外由於c市有一條河從中穿過,也可...
藍橋杯 歷屆試題 城市建設
最小生成樹 參考 關鍵點 加乙個狀態0,與可建碼頭的地區相連 思路 1 只有道路便是連通圖 考慮加碼頭與不加碼頭兩種情況 2 道路之間是不連通的,只有加上碼頭才能連通,只考慮加上碼頭的情況 include include include using namespace std define maxn...
藍橋杯 歷屆試題 城市建設
時間限制 1sec 記憶體限制 128mb 提交 58 解決 4 題目描述 棟棟居住在乙個繁華的c市中,然而,這個城市的道路大都年久失修。市長準備重新修一些路以方便市民,於是找到了棟棟,希望棟棟能幫助他。c市中有n個比較重要的地點,市長希望這些地點重點被考慮。現在可以修一些道路來連線其中的一些地點,...