Week6 作業C 掌握魔法 東東 I

2021-10-04 12:43:55 字數 1432 閱讀 7978

東東在老家農村無聊,想種田。農田有 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
將每塊農田想象成乙個點,而兩點之間引水造成的mp消耗可看作兩點之間的加權邊,這樣農田便成為乙個加權圖。接下來的問題是如何處理天上引水這一消耗,我們將天看作乙個超級原點,它也有到農田各點的加權邊,即引水的mp消耗。要使得可以灌溉所有農田而且消耗最少,該問題可轉化為乙個在加權圖中尋找最小生成樹的問題,因此接下來的問題便是如何在我們建立的圖中找到它的最小生成樹。

這裡採用kruskal演算法,根據權值對所有的邊進行排序,按權值公升序來考察各邊,若邊的端點不在同乙個集合中,便合併這兩點所在集合(可採用並查集),同時選中該邊,直到選中n條邊(有n+1個點),這些選中的邊便可組成該圖的最小生成樹,其權值相加便為最小的mp消耗。

#include

#include

using

namespace std;

const

int size=

1e5;

struct edge

}edge[size]

;int par[size]

;void

ini(

int n)

intfind

(int n)

bool

unite

(int a,

int b)

intmain

(int argc,

char

** ar**)

; number++;}

for(

int i=

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

number++;}

}sort

(edge,edge+number)

;int wp=

0,pickedge=0;

for(

int i=

0;iprintf

("%d\n"

,wp)

;return0;

}

Week6 作業 C 掌握魔法 東東 I

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

Week 6 掌握魔法 東東 I

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

week6實驗A 掌握魔法 東東 II

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