掌握魔法 東東 I

2022-06-22 08:45:07 字數 1358 閱讀 5347

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

example

input

454

430 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0

output

9

如果忽略天上水,則為最小生成樹為題,那麼,我們怎麼解決這添上水呢?

事實上,如果把它當成乙個超級原點(連線所有其他點)的話,問題就轉化成了我們熟悉的最小生成樹問題!

最小生成樹我採用kruskal的方法,每次從中選取(合法的)最小邊。

判斷成環與否我們用並查集思想:兩端點如果不屬於乙個集合,那麼證明新增後不會成環。

1 #include2 #include3

using

namespace

std;

4int par[310], rnk[310],nums=0

;5 typedef struct

node

10}edge;

1112 edge edges[100000

];13

14int find(int

x) 15

1617

bool unite(int x,int

y) 24

25int

main()

31int

w;32

for(int i=0;i)

38for(int i=0;i)47}

48}

49 sort(edges,edges+nums);

50int sum=0,cnt=0;51

for(int i=0;i)

56if(cnt==n) break

; 57}

58 cout59return0;

60 }

C 掌握魔法 東東 I

有n塊田需要灌水,有兩種方式,一是取水灌田,二是打通兩塊田建立傳送門,每種方式都有一定的消耗,兩種方式結合,求一種最小消耗的方法。將各個田看作是乙個點,每兩個點之間有乙個建立傳送門的耗費值,再加乙個超級原點,與每個點相連,表示取水灌田的耗費值,構成乙個圖,利用kruskal方法求最小生成樹即可。in...

掌握魔法 東東 II

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

掌握魔法 東東 II

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