問題の意味: N牧場、牧草地の修理井戸があり、各コストのWi、接続牧場は、そのため、各牧草地、最小コストを頼むまたはウェルまたはウェルと牧草地がチャンネルを持っている必要があり、Pijのを費やしています。
アイデア:余分なノードOを追加し、Oは改修に接続され、改修費用側が権利です。そして、これは、ほとんどのMSTのためのN + 1つのポイントです。
劉の学生は解決策を考える:必須の最低以来、上記のように、同じ最低牧場の改修費を、検索、とても同じ目的。
#include <ビット/ STDC ++ H> の#define担当者(iは、、B)のための式(I ++ iは= int型;私は= Bを<) 使用して 名前空間STDを、 CONST INT MAXN = 310 。 const int型 MAXM = MAXN * MAXN。 INT FA [MAXN]、T [MAXN]、[MAXN] [MAXN]、TOT。 構造体 中の{ int型のlen、U、V。 } [MAXM]です。 ブール(CMP における W、でqは){ 戻り <w.len q.len。 } ボイド追加(int型 U、int型 V、INT LEN){ TOT++; S [TOT] .U = U。S [TOT] .V = V。 S [TOT] .LEN = LEN。 } INT(見つけるINT X){ 場合(!X = FA [X])を返す FAを[X] = (FA [X])を見つけます。 リターンのx; } int型のmain() { int型 N、M、ANS = 0 。 scanf関数(" %のD "、&N)。 担当者(I、1、N)のscanf(" %dの"、およびT [I])。 担当者(I、1、N)のrep(j、1 、N){ scanf関数("%のD 」、および[I] [J]); 場合([I] [J])を追加(I、J、[I] [J]); } 担当者(I、0、N)FA [I ] = I; 担当者(I、1、N)を追加(0 、I、T [i])と、 ソート(S + 1、S + TOT + 1 、CMP)、 担当者(I、1 、TOT){ int型 FU = (S [i]が.U)を見つける INT FV = (S [I] .V)を見つける 場合(FUは== FV)続ける; FA [FU] = FV; ANS + =のS [i]の.LEN; } のprintf (" %dは\ nを" 、ANS); 戻り 0 ; }