所以到底讀「給予」的「給」,還是平時用的「給」。。。
fj決定給n(1<=n<=300)個草地給水,草地編號為1到n。他可以在該草地處建立一口井,也可以建立管道從別的草地引水進來,在第i塊草地處挖一口井需要花費w_i(1<=w_i<=100,000),連線井i和井j的管道需要花費p_ij(1<=p_ij<=100,000,p_ij=p_ji;p_ii=0)。
計算最少需要花費多少才能保證每個草地都有水。
input
第一行,乙個整數n
第2到n+1行,第i+1行輸入w_i
第n+2到2n+1行,每行n個空格隔開的整數,表示p_ij
output
輸出最少花費。
sample input45
4430 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
sample output
最小生成樹之前是學過的。然後看到這題第一感覺就是最小生成樹。但是使此節點生效的話需要乙個「啟動值」,然後就感覺有點麻煩。我試想過將路徑加上初始值,但是貌似不可行。直到評講時——
某大佬:我們可以加乙個0節點,使0號節點到其它節點…
然後我瞬間想到了——
某大佬:的距離為初始值。。。
然後這樣就方便多了嗯。
直接最小生成樹走起~但是依然不想優化。還有很多題等著。。。
#include
int n,f[
301]
[301
],k,ans;
bool b[
301]
;int
main()
b[d]=1
;//將這條最短路徑連上,答案加上它的值
ans+
=min;
}printf
("%d"
,ans)
;fclose
(stdin);
fclose
(stdout);
}
JZOJ 最小生成樹 給水
由n塊草地組成了乙個花園 現在要你給這個花園裡的所有草地供水 你可以在第i ii塊草地挖井,費用為a i a i a i 也可以從其他草地連線水管過來 但前提是那個草地要有水,費用為f i j f i j f i j 現在要你求給所有草地供水 最少需要多少大洋 第一行,乙個n nn第2 22 n 1...
最小生成樹 Prim
include stdio.h include stdlib.h include io.h include math.h include time.h define ok 1 define error 0 define true 1 define false 0 define maxedge 20 ...
最小生成樹 prim
演算法模型 由任意乙個頂點開始 將此頂點存入s集,剩餘頂點存入t集合 每次遍歷頂點,取一條能夠連線s與t最短邊e,直到所有頂點全部加入s include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init ...