洛谷 P1150 打井

2021-08-07 05:28:46 字數 1081 閱讀 4420

題目背景

john的農場缺水了!!!

題目描述

農民john 決定將水引入到他的n(1<=n<=300)個牧場。他準備通過挖若干井,並在各塊田中修築水道來連通各塊田地以供水。在第i 號田中挖一口井需要花費w_i(1<=w_i<=100,000)元。連線i 號田與j 號田需要p_ij (1 <= p_ij <= 100,000 , p_ji=p_ij)元。

請求出農民john 需要為連通整個牧場的每一塊田地所需要的錢數。

輸入格式:

第1 行為乙個整數n。

第2 到n+1 行每行乙個整數,從上到下分別為w_1 到w_n。

第n+2 到2n+1 行為乙個矩陣,表示需要的經費(p_ij)。

輸出格式:

只有一行,為乙個整數,表示所需要的錢數。

嗯…usaco的題一般都很有想法…

這個題看起來是個最小生成樹…

可是還有打井的情況…怎麼考慮?

對於每一塊田地,只有兩種情況——打井或修渠。這兩個方法是等效的,取最小值就好了嘛。

所以要改進一下prim(因為kruskal是按邊處理,不方便)。其實只需要在一開始選定花費最小的井作為初始點,因為這個點是一定要打井的。然後看看每個點是打井好還是修渠好,然後就是裸的prim了…

#include

#include

using

namespace

std;

int ans=0,s,n;

bool v[301]=;

int g[301][301];

int l[301];

void prim()

}}int main()

題解區還說了一種很好的方法!

修渠和打井是等效的,都是把點連到…emmmm…地下水裡…

所以可以建乙個虛擬的點,到每個點的邊權是點打井的花費!

是不是很妙!

然後就是裸的最小生成樹了。

太強啦%%%

洛谷 P1174 打磚塊

題目鏈結 題解 一道dp好題。include include using namespace std int a 210 210 s1 210 210 s2 210 210 dp1 210 210 dp2 210 210 n,m,k bool vis 210 210 int main for int...

題解 洛谷P2484 打地鼠(模擬)

對於錘子的大小,我們可以列舉。然後模擬對要砸的部分進行操作,對該區域減去砸的地方左上角的數 也就是次數 如果小於零就return false。這樣會浪費許多時間。我們可以從大到小列舉錘子,並且只有所有地洞地鼠之和 錘子體積為0時才進行操作,另外,只有當地鼠和 錘子體積小於等於已得到答案的最小值時才砸...

洛谷 P5587 打字練習

題目描述 r 君在練習打字。有這樣乙個打字練習 給定乙個范文和輸入框,會根據你的輸入計算準確率和打字速度。可以輸入的字元有小寫字母 空格和 英文句號 輸入字元後,游標也會跟著移動。輸入的文字有多行,r 君可以通過換行鍵來換行,換行後游標移動到下一行的開頭。r 君也可以按退格鍵 為了方便,退格鍵用 表...