東東在老家農村無聊,想種田。農田有 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 是農...