最優生成樹 挖井

2021-07-14 19:18:29 字數 1343 閱讀 6185

【問題描述】

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...