1488:新的開始
時間限制: 1000 ms 記憶體限制: 65536 kb
提交數: 773 通過數: 401
【題目描述】
發展採礦業當然首先得有礦井,小 ff 花了上次探險獲得的千分之一的財富請人在島上挖了 n 口礦井,但他似乎忘記考慮的礦井供電問題……
為了保證電力的**,小 ff 想到了兩種辦法:
在這一口礦井上建立乙個發電站,費用為 v(發電站的輸出功率可以供給任意多個礦井)。
將這口礦井與另外的已經有電力**的礦井之間建立電網,費用為 p。
小 ff 希望身為「newbe_one」計畫首席工程師的你幫他想出乙個保證所有礦井電力**的最小花費。
【輸入】
第一行乙個整數 n,表示礦井總數。
第 2∼n+1 行,每行乙個整數,第 i 個數 vi 表示在第 i 口礦井上建立發電站的費用。
接下來為乙個 n×n 的矩陣 p,其中 pi,j 表示在第 i 口礦井和第 j 口礦井之間建立電網的費用(資料保證有pi,j=pj,i ,且 pi,i=0。
【輸出】
輸出僅乙個整數,表示讓所有礦井獲得充足電能的最小花費。
【輸入樣例】45
4430 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
【輸出樣例】
9【提示】
樣例解釋
小 ff 可以選擇在 4 號礦井建立發電站然後把所有礦井都不其建立電網,總花費是 3+2+2+2=9。
資料範圍:
對於 30% 的資料:1≤n≤50;
對於 100% 的資料:1≤n≤300,0≤vi,pi,j≤105 。
思路:當邊權特別大,不取這條邊,分別修兩個電站才是最優的。
正確的解法是在原圖的基礎上虛擬乙個點,原圖的每乙個節點都與這 個虛擬點有一條邊,邊權為在該點上修建電站的花費。
再對新圖做最小生成樹。
#include
#define inf 1<<30
#define ll long long
using
namespace std;
int n,x,fa[
305]
,num=0;
struct edge
}a[305
*305];
intfind
(int x)
intmain()
fa[n+1]
=n+1
;for
(int i=
1;i<=n;i++)}
sort
(a,a+num)
;int cnt=0;
ll s=0;
for(
int i=
0;i) cout << s << endl;
return0;
}
1488 新的開始
題目描述 發展採礦業當然首先得有礦井,小 ff 花了上次探險獲得的千分之一的財富請人在島上挖了 n 口礦井,但他似乎忘記考慮的礦井供電問題 為了保證電力的 小 ff 想到了兩種辦法 在這一口礦井上建立乙個發電站,費用為 v 發電站的輸出功率可以供給任意多個礦井 將這口礦井與另外的已經有電力 的礦井之...
ybt 1488 新的開始
不難看出這是一道最小生成樹 but,我 蒟蒻 一開始以為是取最小的 v i v i v i 然後構建最小生成樹 這樣會有乙個問題,建造電網有時候不一定會比建造電站更優 so 我們可以把所有建電站的邊連到乙個虛點上,這樣直接進行最小生成樹就不會有問題了 include using namespace ...
新的開始,行的開始
記下每天自己所作所為,去讀書,去工作,去思考,去行動 用知識去彌補無知,用追求去無視嘲笑,用行動去完成追求 可以時而放鬆,但學習要一直堅持 1.用科學的時間規劃方法去規劃時間,提高效率 讀時間規劃方面的書籍 如番茄工作法 多讀基本,總結歸類,對比找出相同不同之處,並對此著重分析 2.鍛鍊身體,保持健...