北京大学のコンピュータベースのテストでは、ジャングルの道は、最小スパニングツリーのバージョンをアップグレードした* 2つのブラシを取ります

基本的な考え方:

後でノートに感じ、木のピットにまたがるいくつかの最小があります。

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を返します。
}

  

おすすめ

転載: www.cnblogs.com/songlinxuan/p/12597910.html