基本的な考え方:
後でノートに感じ、木のピットにまたがるいくつかの最小があります。
1.ループバックの問題。
2.二つの間のノードは、複数のパスを持っています。
キーポイント:
自己ループの問題に関係なく、プリムの基本的なバージョン。
#include <iostreamの> する#include <STDLIB.H> の#include <ベクトル> の#include <ストリング> 名前空間STDを使用して、 const int型MAXN = 28; const int型INF = 100000000; int型ミリアンペア[MAXN] [MAXN]。 BOOL VIS [MAXN]。 int型のDIS [MAXN]。 int型NUM、N。 INTプリム(){ DIS [0] = 0; int型ANS = 0; (; U <N; int型、U = 0 U ++)用{ int型のインデックス= -1。 ミン= INF int型。 用(INTがI = 0、I <N; I ++){ (!VIS [I] && DIS [I] <最小)であれば{ インデックス= I。 分= DIS [i]は、 } } もし(インデックス== -1) リターン-1。 VIS [インデックス] =はtrue。 ANS + = DIS [インデックス]。 {(; I <N I ++ INTがI = 0)するため IF(VIS [I] && MA [インデックス] [I] = INF && DIS [I]> MA [インデックス] [I]!){ DIS [I] = MA [インデックス] [I]; } } } ANSを返します。 } ボイドのinit(){ フィル(MA [0]、MA [0] + MAXN * MAXN、INF)。 塗りつぶし(VIS、VIS + MAXN、偽); フィル(DIS、DIS +のMAXN、INF)。 } int型のmain(){ 一方(CIN >> NUM){ (NUM == 0)の場合は 0を返します。 初期化(); チャーA、B。 INT、M、D。 文字最も= 'A'; 以下のために(INT I 0 =; I <NUM-1; I ++){ CIN >> M。 (>ほとんどの)場合は 、最も=; J <M;(INT J = 0のための CIN >> B >> D。 (ほとんどの場合< IF(MA [ - 'A'] [B - 'A']> D) MA [ - 'A'] [B - 'A'] = MA [B - 'A'] [ - 'A' ] = D。 } } N =最も- 'A' + 1。 INT ANS =プリム()。 coutの<< ANS <<てendl; } 0を返します。 }