農夫約翰決定給他的n(1<=n<=300)個牧場澆水,這些牧場被自然的命名為1..n。他可以給乙個牧場引入水通過在這個牧場挖一口井或者修一條管道使這個牧場和乙個已經有水的牧場連線。
在牧場i挖一口井的花費是w_i(1<=w_i<=100000)。修建一條水管連線牧場i和牧場j的花費是p_ij(1<=p_ij<=100000;p_ij=p_ji;p_ii=0)。
請確定農夫約翰為了完成澆灌所有的牧場所需的最小的總花費。
題目名稱:water
輸入格式:
第1行:乙個單獨的整數n。
第2..n+1行:第i+1行包含乙個單獨的整數w_i。
第n+2..2n+1行:第n+1+i行包含n個用空可分開的整數;其中第j個數是p_ij。
輸入樣例(file water.in):
4 5
4 4
3 0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
輸入說明:
這裡有4個牧場,修井和修管道的代價如圖。
輸出格式:
第1行:乙個單獨的整數,表示花費。
輸出樣例(file water.out):
9 輸出說明:
農夫約翰可以在第4個牧場修井,並且將每個牧場和第乙個連線起來,這樣,花費是3+2+2+2=9。
分析:生成樹的裸題,到要用到乙個小技巧:將挖水井的費用做成一條從i到n+1的邊,再用克魯斯卡爾演算法即可。
#include
#include
#include
#include
using
namespace
std;
struct edgee[100000];
long
long f[1000],ans=0,k=0,n,m,w[1000],jl[1000];
int find(int x)
void uinon(int x,int y)
} int cmp(const edge &x,const edge &y)
for (int i=1;i<=n+1;++i)
f[i]=i;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
}for (int i=1;i<=n;++i)
sort(e+1,e+m+1,cmp);
int k=0;
for (int j=1;j<=m;++j)
if (k==n)
}cout
0;}
USACO Oct08 搭建籬笆解題報告
據說這道題可以用動態規劃來寫但是我不會2333 首先,我們可以考慮用f i 來表示當前用了長度為i時的方案數。但是根本行不通qwq。所以因該運用補集的思想來轉化一下。當總長度為k的時候,很明顯總方案數是c n 1,3 就是在n 1個點中選出3個點來切 然後考慮不合法的情況即當最長邊長度大於總長度的一...
186 USACO Oct08 牧場旅行
輸入檔案 pwalk.in輸出檔案 pwalk.out簡單對比 時間限制 1 s 記憶體限制 128 mb n個被自然地編號為1.n奶牛 1 n 1000 正在同樣被方便的編號為1.n的n個牧場中吃草。更加自然而方便的是,第i個奶牛就在第i個牧場中吃草。其中的一些對牧場被總共的n 1條雙向通道的一條...
186 USACO Oct08 牧場旅行
輸入檔案 pwalk.in輸出檔案 pwalk.out簡單對比 時間限制 1 s 記憶體限制 128 mb n個被自然地編號為1.n奶牛 1 n 1000 正在同樣被方便的編號為1.n的n個牧場中吃草。更加自然而方便的是,第i個奶牛就在第i個牧場中吃草。其中的一些對牧場被總共的n 1條雙向通道的一條...