0.はじめに
それはあまりにもキンマAだったので
私は今でも、予選のNOIPは怖がっていると私も最小スパニングツリーは学んでいないことはできません
ブログには、最も詳細なQAQ母である必要がありますように
よくお読みくださいは省略がある場合、私にメッセージの感謝を修正してください!
Thanks♪(・ω・)ノ
1.最小スパニングツリーの概念
最後の最小スパニングツリーそれは何ですか?困惑した顔
最小スパニングツリーのn個の頂点に接続されたグラフを部分グラフ原画像を接続され、元のグラフ内の全てのn個のノードを含み、図の通信を保持する側の最小値を持っています
- Baiduの百科事典から
所与の非=(V、E)における(u、v)はuがこれに代わって、図G、およびW(U、V)をV(すなわち)を頂点に連結するエッジの頂点を表し、中側存在する場合、右重量E Tは、サブセット(すなわち、)と、そのような非環式グラフであります
W(T)が最小、G.この最小スパニングツリーT
最小スパニングツリーは、実際に短いため、スパニングツリーを最小重量です。
その後、我々は理解します
いわゆる最小スパニングツリーはそれほど難しいことではありません
いいえ最小スパニングツリーは、エッジ重みの図とサブツリーの最小で選択されていない、すべてのノードが含まれています!
だから我々は理解の定義を完了した(^∇^ *)♪とても幸せです!
漫画は撃退します!(* ^▽^ *)
2.kruskalアルゴリズムとテンプレートを説明
次に我々はそれ以上の最小スパニングツリーを達成する方法を説明します
ここでは、私たちのクラスカルを引き出す必要があります
クラスカルのアルゴリズムの核となるアイデアがある:エッジが最小スパニングツリーを取得するための条件を満たすためならば常に重み付き連結グラフのエッジのセットで最小のエッジを見つけ、それが構築され、最終的には最小を得るまでスパニングツリー。
クラスカルのアルゴリズムのステップ:
ステップ1:図と通信する権利、値が右側にソートされ、
第二段階:このエッジを選択するかどうかを決定する(この場合はエッジによってグラフでは、小さな重みを有します大規模なソートします)。いずれも、次に通信を行うことを選択しない場合、次の通信が継続した場合、頂点は、二つの通信サイドを有するかどうかを決意に基づきます。
第三工程:第二工程サイクル、図面の全ては、最小スパニングツリーを取得するために、即ち、連結成分内の同じ頂点になるまで。
これは非常に単純な問題を探します
テンプレートは以下のよう(私のハード仕上げ)
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; 構造体のエッジ{ INT U、V、W;}エッジ[ 200005 ]; int型 FA【5005 ;]、N-、M、ANS、EU、EV、CNT インラインBOOL CMPを(エッジA、エッジB){ 戻り <AW BW;} // 高速行単位の インラインINT検索(INT X){ ながら(!FA X = [X])= FA X [X] = FA [FA [X ]; 戻り、Xを } // 互いに素なセット、テンプレートながら高速再帰バージョンよりループ インラインボイドクラスカル(){ ソート(エッジ、エッジ + M、CMP); //エッジ値の重みがソートされる ため(INT I = 0 ; I <M Iは++ ){ EUは、(エッジ[I]が.U)、EVは=探す=(エッジ[I] .V); IF(EU == EV )続行 ; // リングが発生した場合、続行 ANS =エッジ+ [I] .W; // 更新回答 FA [EV] = EU; CNT ++ ; IF(CNT N- == 1)BREAK ; // ループ終了条件 } } int型のmain(){ scanfの(" %のDの%のD "、およびN-、&M) のための(INT I = 1; iが<= N; iは++)FA [I] = I。// 初始化并查集 のための(int型 I = 0 ;私がm <; Iは++ ) のscanf(" %D%D%D "、およびエッジ[I] .U、&エッジ[I] .V、&エッジ[I]。 W) クラスカル(); printf(" %dの" 、ANS)。 リターン 0 ; }
3.あとがき
それを読んだ後何か質問はありますか?
実際には、ちょうどそれについて考え、その後、情報を組み合わせたコードを見て、回路図が理解しやすいです
チャンを見て、それから行くことのポイントです - おかげで、わずかに感謝♪(・ω・)テクノ