題目描述:
發展採礦業當然首先得有礦井,小 f 花了上次探險獲得的千分之一的財富請人在島上挖了 n 口礦井,但他似乎忘記了考慮礦井供電問題。
為了保證電力的**,小 f 想到了兩種辦法:
在礦井 i 上建立乙個發電站,費用為 vi(發電站的輸出功率可以供給任意多個礦井)。
將這口礦井 i 與另外的已經有電力**的礦井 j 之間建立電網,費用為 pi,j。
小 ff 希望你幫他想出乙個保證所有礦井電力**的最小花費方案。
輸入格式
第一行包含乙個整數 n,表示礦井總數。
接下來 n 行,每行乙個整數,第 i 個數 vi 表示在第 i 口礦井上建立發電站的費用。
接下來為乙個 n×n 的矩陣 p,其中 pi,j 表示在第 i 口礦井和第 j 口礦井之間建立電網的費用。
資料保證 pi,j=pj,i,且 pi,i=0。
輸出格式
輸出乙個整數,表示讓所有礦井獲得充足電能的最小花費。
資料範圍
1≤n≤300,
0≤vi,pi,j≤10^5
輸入樣例:
454
430 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
輸出樣例:
9
分析:
本題可以在圖上選若干個點作為發電站,然後將這些發電站與剩下的點連線起來,其實最後需要構建的網路就是一棵生成森林,每個發電站都是樹根,然後連線剩下的節點。
我們可以構建乙個虛擬的超級源點,從該源點到各發電站的距離就是建造發電站的代價,所以最後需要構造的就是這n+1個點構成的最小生成樹了,可以用prim演算法繼續去求解。本題的核心在於虛擬超級源點的構造,將生成森林轉化為一棵生成樹。總的**如下:
#include #include #include #include using namespace std;
const int n = 305;
int n,g[n][n],d[n];
bool st[n];
int prim()
st[t] = true;
res += d[t];
for(int j = 0;j <= n;j++)
}return res;
}int main()
for(int i = 1;i <= n;i++)
}printf("%d\n",prim());
return 0;
}
新的開始,行的開始
記下每天自己所作所為,去讀書,去工作,去思考,去行動 用知識去彌補無知,用追求去無視嘲笑,用行動去完成追求 可以時而放鬆,但學習要一直堅持 1.用科學的時間規劃方法去規劃時間,提高效率 讀時間規劃方面的書籍 如番茄工作法 多讀基本,總結歸類,對比找出相同不同之處,並對此著重分析 2.鍛鍊身體,保持健...
新的工作,新的開始。
陸陸續續度過了在力新的最後乙個月時間,昨天辦理了離職手續。今天又和部門的兄弟姐妹出去吃飯,這真的是最後一次和他們這樣相聚了。席間有看見許多新人,相信他們在之後也會做得很好。回首在力新兩年的時間,覺得對自己的影響蠻大。首先提高的就是英文的讀寫能力,現在見到成篇的英文文件不再頭疼,甚至有點自信的去對待。...
新的目標。新的開始!
又是一無聊的週末。陰沉的天氣加上綿綿的細雨,讓人有種陌生的寂寞,不知何時,我己找不到了前方的路到底處於何方,彷徨加無聊的我只有在網上尋找新的開始點,其實自己很想多學點跟自己專業有關的東西,可能是一直沒有確定的方向吧,像乙隻無頭的蒼蠅東看看西看看,到頭來好像還是乙個什麼都不懂的菜鳥。很幸運,今天偶進入...