最小全域木問題----- P3366テンプレート[テンプレート]最小スパニングツリー

タイトル説明

この図が接続されていない場合には、無向グラフが与えられると、最小スパニングツリーは、出力ORZが得られた場合

入力形式

最初の行は、N、M、Nは総図ノードとM無向エッジを表す2つの整数を含んでいます。(N <= 5000、M <= 200000)

次のMラインが三つの整数Xiの、李、紫が含まれ、紫いいえ西、李のノードに接続されたエッジの長さを表現しました

出力フォーマット

出力の数、すなわち、最小スパニングツリーと各辺の長さを含む、出力が接続されてORZ図れていない場合。

サンプル入力と出力

入力#1
4 5 
1 2 2 
1 3 2 
1 4 3 
2 3 4 
3 4 3
出力#1
7

説明/ヒント

時間の制約:1000ミリ秒、128M

データスケール:

N <= 5、M <= 20:データの20%を

N <= 50、M <= 2500:データの40%を

N <= 500、M <= 10000:データの70%を

N <= 5000、M <= 200000:データの100%に

サンプルは説明しました:

2 + 2 + 3 = 7の総辺の重みのため、最小スパニングツリー

  • アイデア:入力側(左点、右端点b、長W)はすべて、ベクトル内に収まるし、次いで小から大までの長さによって、ベクターを横断した後に、互いに素なセットABは、エンドポイントが接続されているか否かを判断する使用に関連しています接続(A、B、W)を使用するそれ以外の場合は、スキップ。
  • 最後に、エッジは、既に図通信である場合、エッジが小さく、選挙に選択され、従って最小の長さであるN-1に接続されています。
  • エッジはN-1にエッジを選択していない場合、通信は確かに、図ではありません。

 

ACコードとテンプレート

#include <ビット/ STDC H ++>
 使用して 名前空間STD;
 のconst  int型 NN = 1E4 + 10 ;
 INT N、M;
 int型FA [NN];
 構造体ノード{
     int型A、B、W、
    友人BOOLの 演算子 <(ノードN1、ノードN2){ // 照合ノード構造、書き込み機能の後、CMPを定義したくない
        リターン n1.w < n2.w; 
    } 
}; 
ベクター <ノード> VE; // 貯蔵容器側

INTの検索(INT X ){ // 祖先を探す
    のIF(X-!= FA [X-])
        FA [X-] =検索(FA [X])。
    戻りFAを[X]。
} 

ボイドは、(参加INT X、int型の Y){ // 合并
    INT FX =(X)、FY =見つける検索(y)を、
    もし(!FX = FY)
        FA [FX] = FY; 
} 


int型のmain(){ 
    CIN >> N >> M。
    以下のためにint型 I = 1、N = iは<; iは++)FA [I] = I。
    int型、B、W;
    一方、(M-- ){ 
        scanf関数(" %D%D%D "、&​​、&B&W)。
        ve.push_back({A、B、W}); 
    } 
    ソート(ve.begin()、ve.end()); // ソート
    ロング ロング SUM = 0 ; // すべてパターニング縁全長
    int型のエッジ= 0 ; // 辺の選択された数
    のための:(オートVは、VE){
         IF {(!検索(VA)=探す(VB))// 点はユニコムB点でない場合、このエッジはマージ選択した
            参加(VA、VB ); 
            SUM + = VW; 
            エッジ ++ ; 
        } 
    } 
    IF(エッジ> = N- 1。)SUM COUT << << ENDL;
     他の COUT <<" ORZ " << てendl; 
    
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/bigbrox/p/11311887.html