東東在老家農村無聊,想種田。農田有 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
454430 2 2 2
2 0 3 3
2 3 0 4
2 3 4 0
output
9
如果忽略天上水,則為最小生成樹為題,那麼,我們怎麼解決這添上水呢?
事實上,如果把它當成乙個超級原點(連線所有其他點)的話,問題就轉化成了我們熟悉的最小生成樹問題!
最小生成樹我採用kruskal的方法,每次從中選取(合法的)最小邊。
判斷成環與否我們用並查集思想:兩端點如果不屬於乙個集合,那麼證明新增後不會成環。
1 #include2 #include3using
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張...