クラスカル最小スパニングツリー
コードのコメントは、おおよそのアイデアを分析しました。ルートノードのソリューションは、スパニングツリーの性質を満たすために、他のすべてのノードと通信しなければなりません。分析のコメントから、最適解は、最小スパニングツリーです。
クラスカルのアルゴリズムは、最終的なスパニングツリーエッジ重み最小和、実際貪欲アルゴリズム、小さい辺の重みは、スパニングツリーを構築するために選択されるたびにあります。エッジが発生しない場合は新たに追加された通信ポイントマップを増加させる、エッジが同一の連結成分に両端のエッジの頂点かどうかを決定するために必要である、廃棄されなければならない - 互いに素なセット実装によって。正確N-1は、スパニングツリーエッジに追加されるスパニングツリーの性質によれば、構造が完成します。(Nは、頂点の数です)
なぜ、転送時間は、パス上の最大時間はありますか?参照は、データを受信する後、すべてのデータ、すなわち、各ノードのトランシーバはノードに対して、非同期で、パイプライン化しない送信した後、受信されてもよいです。これは、書き込みポートデュアルポートバッファと同様である(データは受信端から送信された)と(送信側に送信)ポートを読み取り書き込みと異なる速度でデータを読み出します。
PS:私はまれな問題解決に遭遇しました:識別子がプログラムで定義されている場合はランク、CSPレポートコンパイルエラーを。Rank_1は、後に他の識別子によって変更します。
これは、システムに疑問を伴う宣告することができるコンパイル時に再定義エラーが生じ、この識別子のランクを占めます。
ACコード:
1 / * 2 *ランク1変数名は、後でrank_1によって変更コンパイラエラーパケットCSPを、定義されている場合。未知の理由! 3 * 4 * 2通信経路上のほぼ最大送信時間「ツリー構造の送信時刻」のタイトル。:目標は、総送信時間ツリー最小化しようとする 5 通信経路上*最大送信時間が最小である最小伝送時間の和を、(送信時間が負ではありません)。 6 *したがって、「最適構造」のアートワークの最小スパニングツリーをお願いします。 7 * 3被写体のサイズによって与えられたデータに基づいて、使用クラスカルのアルゴリズムが、互いに素なセット単純または複合パス圧縮最適化のランクに応じて扱います。 8 *唯一の条件は増加ランクことである2つの等しいサブツリーが設定されたランクに対応します。合併が設定されているので 9 小さな木大きな木をマージする*常にランクランクを、合計ランクは唯一の総合ランク1を高めるために、同じランクの2本の木がない限り、変更されません。 10 *は、単にシンプルな組み合わせ順位の最適化を使用することにより、実行時間が元の1/40で、本実施形態を発見しました! 11 * 4パス圧縮アルゴリズムはまた、すなわち、各父()検索、親ノードがそれらの直接ルートの点を通って検索されると考えることができます。 12 再帰*:ライン45。 13 *シンプルなパス圧縮最適化を使用して、本実施例が見つかり、実行時間は、元の1/40です! 14 * / 15 16の#include <iostreamの> 17の#include <アルゴリズム> 18である、 19。の#include <fstreamの> 20である 21である 構造体のエッジ{ 22は INT U、V; 23である INT T; 24 25 インラインBOOLの 演算子 <(constのエッジ&E)CONST { 26は、 戻り Tを< ;ら 27 } 28 インラインBOOLの 演算子 ==(CONSTエッジ&E)のconst { 29 リターン uはEUを== || V == EV。 30 } 31 }。 32 33 使って 名前空間STDを、 34 35 静的 int型 * 親。 36 静的 int型 * rank_1。 37 38 静的 INT父親(int型P){ 39 の#if 0 // 最適化されていない 40 ながら(!親[P] = P){ 41 、P = 親[P]を。 42 } 43 リターンP。 44 の#else 45 リターン(親[P] == P)?P:(親[P] = 父(親[P])); 46 #endifの 47 } 48 49 INTメイン(ボイド){ 50の IOS :: sync_with_stdio(偽)。 51 52 / * の#if 0 53 はifstreamフィン( "INPUT.TXT")。 54 cin.rdbuf(fin.rdbuf())。 55 #endifの* / 56 57 INT N、M、ルート。 58 CIN >> N >> M >>ルート; 59 60 エッジ*電子= 新しいエッジ[M]。 61 親= 新しい INT [N + 1 ]。 62 rank_1 = 新しい INT [N + 1 ]。 63 64 のために(int型 I = 0 ; I <M ++ {I) 65 CIN >> E [I] .V >> E [I] .U >> E [I] .T。 66 } 67 のための(int型 i = 1 ; iは= N <; ++ I){ 68 親[I] = I。 69 rank_1 [I] = 1 。 70 } 71 72 ソート(E、E + M)。 73 74 のint、K = 0 。 75 INT ANS = 0 。 76 77 父(E [ 0 ] .U)。 78 79 のために(int型 I = 0 ; iが<M ++ {i)は 80 int型 PV = 父(E [I] .V)。 81 INT PU = 父(E [I] .U)。 82 であれば(PV!= PU){ 83 もし(rank_1 [PV] < rank_1 [PU]){ 84 親[PV] = PU。// 組合PV - > PU 85 } 86 他{ 87 親[PU] = PV。// 組合PU - > PV 88 であれば(rank_1 [PU] == rank_1 [PV]){ 89 ++ rank_1 [PV]。 90 } 91 } 92 93 ++ 、K。 94 95 もし(E [I] .T> ANS){ 96の ANS = E [I] .T。 97 } 98 } 99 であれば(K == N- 1)ブレーク。 100 } 101の 102 COUT << ANS << ENDL。 103 104 リターン 0 。 105 }