Week 6 掌握魔法 東東 I

2021-10-04 16:40:49 字數 1464 閱讀 4776

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

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

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

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

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

input

第1行:乙個數n

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

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

output

東東最小消耗的mp值
樣例輸入

454

430 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0

樣例輸出

9
要求出最小消耗,就是要求出圖的最小生成樹,「黃河之水天上來」,可以理解每一塊田都與黃河這片田連線,既求n+1個點的最小生成樹

採用kruskal演算法,edge結構體陣列按照邊權公升序排序,每次取陣列中權值最小的邊加入到樹中,同時保證樹不會成環

在判斷加入一條邊是否會成環的操作中,使用到並查集,判斷兩個點是否在同乙個並查集中,如果是,那麼該邊加入就會導致成環,如果不在,就將這條邊加入到樹中

最小消耗就是最小生成樹中邊權的和

#include

#include

using

namespace std;

int n;

int w;

int size=0;

int leader[

310]

;int sum=0;

int num=0;

struct edge

edge[

100010];

bool

cmp(edge x,edge y)

void

initial()

intfind

(int x)

void

unite

(int x,

int y)

}int

main()

for(

int i=

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

}sort

(edge,edge+size,cmp)

;for

(int i=

0;i(num==n+1)

break;}

cout<}

Week6 作業C 掌握魔法 東東 I

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

Week6 作業 C 掌握魔法 東東 I

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

week6實驗A 掌握魔法 東東 II

題目 從瑞神家打牌回來後,東東痛定思痛,決定苦練牌技,終成賭神!東東有 a b 張撲克牌。每張撲克牌有乙個大小 整數,記為a,範圍區間是 0 到 a 1 和乙個花色 整數,記為b,範圍區間是 0 到 b 1 撲克牌是互異的,也就是獨一無二的,也就是說沒有兩張牌大小和花色都相同。一手牌 的意思是你手裡...