AcWing 1146 新的開始

2021-10-09 05:40:13 字數 1357 閱讀 3815

題目描述:

發展採礦業當然首先得有礦井,小 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.鍛鍊身體,保持健...

新的工作,新的開始。

陸陸續續度過了在力新的最後乙個月時間,昨天辦理了離職手續。今天又和部門的兄弟姐妹出去吃飯,這真的是最後一次和他們這樣相聚了。席間有看見許多新人,相信他們在之後也會做得很好。回首在力新兩年的時間,覺得對自己的影響蠻大。首先提高的就是英文的讀寫能力,現在見到成篇的英文文件不再頭疼,甚至有點自信的去對待。...

新的目標。新的開始!

又是一無聊的週末。陰沉的天氣加上綿綿的細雨,讓人有種陌生的寂寞,不知何時,我己找不到了前方的路到底處於何方,彷徨加無聊的我只有在網上尋找新的開始點,其實自己很想多學點跟自己專業有關的東西,可能是一直沒有確定的方向吧,像乙隻無頭的蒼蠅東看看西看看,到頭來好像還是乙個什麼都不懂的菜鳥。很幸運,今天偶進入...