【問題描述】
fj決定給他分別用1到n編號的牧草澆水,他可以直接在一顆牧草旁邊直接挖一口井來獲得水,也可以用管子從任意有水的牧草那裡來獲得水。
在第i顆牧草旁邊挖一口井的代價為wi(),用管子連線第i與第j顆牧草的代價為pij( pij=pji; pii=0)。請求出fj澆灌這些牧草花費的最小代價。
【輸入格式】
第一行,乙個整數n。第二行到第n+1行,行i+1表示wi。
第n+2行到第2n+1行,行n+1+i包含n個用空格分隔開來的整數,每行第j個數字即是pij。
【輸出格式】
僅一行,fj澆灌這些牧草的最小代價。
【輸入樣例】
4 5
4 4
3 0 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
【輸出樣例】
【資料範圍】
1<=n<=300
1<=w_i<=100,000
1 <= pij <= 100,000
把點帶權轉化成邊帶權:在i點挖井的代價可以轉化成乙個不存在的n+1號牧草到i點通管子的代價,轉化完成後就可以進行常規的計算最小生成樹的邊權和。
#include
#include
#include
#include
#include
#define maxn 10005
using
namespace
std;
struct data
;int n,m,x,y;
int fa[maxn];
vector
g;bool cmp(data a,data b)
int find(int x)
void union(int x,int y)
bool check(int x,int y)
int main()
); }
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++));}
clear();
sort(g.begin(),g.end(),cmp);
int num=0,ans=0;
for(int i=0;iint p=g[i].a,q=g[i].b;
if(check(p,q)) continue;
if(num==n) break;
union(p,q);
ans+=g[i].l;
num++;
}printf("%d",ans);
return
0;}
最優生成樹 並查集和貪心的運用
問題描述 給出n個頂點 e條邊的連通無向簡單圖,請你完成下列任務 任務1 求邊權和最小的生成樹 最小生成樹 任務2 求邊權和最大的生成樹 最大生成樹 任務3 求最大邊最小的生成樹 瓶頸生成樹 任務4 求最小邊最大的生成樹 瓶頸生成樹 輸入格式 第一行 兩個整數n,e n 50000,e 100000...
最優比率生成樹 最優比例生成樹
2005年的acm地區賽賽場上,樓爺高速過了乙個求最優比率生成樹的問題,從而打亂了全場的陣腳,順利奪冠.有帶權圖g,對於圖中每條邊e i 都有benifit i 收入 和cost i 花費 我們要求的是一棵生成樹t,它使得 benifit i cost i i t 最大 或最小 這顯然是乙個具有現實...
最優比率生成樹 最優比例生成樹
有帶權圖g,對於圖中每條邊e i 都有benifit i 收入 和cost i 花費 我們要求的是一棵生成樹t,它使得 benifit i cost i i t最大 或最小 這顯然是乙個具有現實意義的問題.設x i 等於1或0,表示邊e i 是否屬於生成樹.則我們所求的比率r benifit i x...