掌握魔法 東東 I(最小生成樹kruskal)

2021-10-04 10:13:22 字數 1628 閱讀 4890

東東在老家農村無聊,想種田。農田有 n 塊,編號從 1~n。種田要灌氵

眾所周知東東是乙個魔法師,他可以消耗一定的 mp 在一塊田上施展魔法,使得黃河之水天上來。他也可以消耗一定的 mp 在兩塊田的渠上建立傳送門,使得這塊田引用那塊有水的田的水。 (1<=n<=3e2)

黃河之水天上來的消耗是 wi,i 是農田編號 (1<=wi<=1e5)

建立傳送門的消耗是 pij,i、j 是農田編號 (1<= pij <=1e5, pij = pji, pii =0)

東東為所有的田灌氵的最小消耗

第1行:乙個數n

第2行到第n+1行:數wi

第n+2行到第2n+1行:矩陣即pij矩陣

東東最小消耗的mp值

454

4302

2220

3323

0423

40

9
這個題如果不考慮黃河之水天上來這種情況,就是乙個裸的最小生成樹,加入了乙個灌水操作,將難度提公升(果然不要隨便灌水)。

我們可以這樣思考,增加乙個天結點0號,灌水消耗的mp就成了0到這些點的路徑(或者理解為消耗mp在天上到地上的結點建立傳送門,地上的結點就可以引用天上的水)。然後我們直接對著這個n+1個點到圖來跑最小生成樹就行了!

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

300+10;

struct node

;node a[maxn*maxn+maxn+10]

;int par[maxn]

,rnk[maxn]

,ans;

void

init

(int n)

}int

find

(int x)

bool

unite

(int x,

int y)

intgetint()

while

(ch>=

'0'&& ch<=

'9')

return x*s;

}bool

comp

(node a,node b)

intmain()

int cnt=n;

for(

int i=

1; i<=n; i++)}

sort

(a+1

,a+1

+cnt,comp)

;int tot=0;

init

(n);

for(

int i=

1; i<=cnt; i++)if

(tot==n)

break;}

printf

("%d\n"

,ans)

;return0;

}

魔法東東 最小生成樹

題意 東東在老家農村無聊,想種田。農田有 n 塊,編號從 1 n。種田要灌溉,眾所周知東東是乙個魔法師,他可以消耗一定的 mp 在一塊田上施展魔法,使得黃河之水天上來。他也可以消耗一定的 mp 在兩塊田的渠上建立傳送門,使得這塊田引用那塊有水的田的水。1 n 3e2 黃河之水天上來的消耗是 wi,i...

掌握魔法 東東 I

東東在老家農村無聊,想種田。農田有 n 塊,編號從 1 n。種田要灌氵 眾所周知東東是乙個魔法師,他可以消耗一定的 mp 在一塊田上施展魔法,使得黃河之水天上來。他也可以消耗一定的 mp 在兩塊田的渠上建立傳送門,使得這塊田引用那塊有水的田的水。1 n 3e2 黃河之水天上來的消耗是 wi,i 是農...

會魔法的東東 最小生成樹問題

東東在老家農村無聊,想種田。農田有 n 塊,編號從 1 n。種田要灌氵 眾所周知東東是乙個魔法師,他可以消耗一定的 mp 在一塊田上施展魔法,使得黃河之水天上來。他也可以消耗一定的 mp 在兩塊田的渠上建立傳送門,使得這塊田引用那塊有水的田的水。1 n 3e2 黃河之水天上來的消耗是 wi,i 是農...