Kruskal の最小スパニング ツリー アルゴリズム - C++ の貪欲なアルゴリズム
スパニング ツリーは、すべての頂点を接続する有向無向グラフのサブグラフです。グラフ内には多数のスパニング ツリーが存在する場合があります。各グラフの最小スパニング ツリー (MST) の重みは、他のすべてのスパニング ツリーと同じかそれより小さくなります。重みはスパニング ツリーのエッジに割り当てられ、合計が各エッジに割り当てられた重みになります。 V はグラフ内の頂点の数であるため、V をエッジの数とすると、最小スパニング ツリーのエッジの数は (V - 1) になります。
Kruskal のアルゴリズムを使用して最小スパニング ツリーを見つける
すべてのエッジは重みによる非降順で並べ替える必要があります。
最小のエッジを選択します。ループが形成されていない場合は、エッジが含まれます。
ステップ 2 は、スパニング ツリーに (V-1) 個のエッジができるまで実行する必要があります。
この場合、貪欲なアプローチを使用するように言われます。欲張りなオプションは、最小の重みを持つエッジを選択することです。例: このグラフの最小スパニング ツリーは (9-1)= 8 エッジです。
After sorting: Weight Src Dest 21 27 26 22 28 22 22 26 25 24 20 21 24 22 25 26 28 26 27 22 23 27 27 28 28 20 27 28 21 22 29 23 24 30 25 24 31 21 27 34 23 25
次に、並べ替えに基づいてすべてのエッジを選択する必要があります。
ループが形成されないため、エッジ 26-27-> が含まれます。
ループが形成されないため、エッジ 28-22-> が含まれます。
エッジ 26 が含まれます。 - 25->、ループが形成されないため。
エッジ 20-21-> は、ループが形成されないため含まれます。
エッジ 22-25-> は、ループが形成されないため含まれます。
エッジ 28-26-> ループ形成のため破棄
エッジ 22-23-> > ループが形成されなかったため含まれる
エッジ 27-28- > ループ形成のため破棄ループ形成へ
エッジ 20-27-> ループが形成されなかったため含まれます
エッジ 21-22-> ループ形成のため破棄されました
エッジ 23-24->サイクルが形成されないため含まれます。
エッジの数は (V-1) であるため、アルゴリズムはここで終了します。
例
#include <stdio.h> #include <stdlib.h> #include <string.h> struct Edge { int src, dest, weight; }; struct Graph { int V, E; struct Edge* edge; }; struct Graph* createGraph(int V, int E){ struct Graph* graph = (struct Graph*)(malloc(sizeof(struct Graph))); graph->V = V; graph->E = E; graph->edge = (struct Edge*)malloc(sizeof( struct Edge)*E); return graph; } struct subset { int parent; int rank; }; int find(struct subset subsets[], int i){ if (subsets[i].parent != i) subsets[i].parent = find(subsets, subsets[i].parent); return subsets[i].parent; } void Union(struct subset subsets[], int x, int y){ int xroot = find(subsets, x); int yroot = find(subsets, y); if (subsets[xroot].rank < subsets[yroot].rank) subsets[xroot].parent = yroot; else if (subsets[xroot].rank > subsets[yroot].rank) subsets[yroot].parent = xroot; else{ subsets[yroot].parent = xroot; subsets[xroot].rank++; } } int myComp(const void* a, const void* b){ struct Edge* a1 = (struct Edge*)a; struct Edge* b1 = (struct Edge*)b; return a1->weight > b1->weight; } void KruskalMST(struct Graph* graph){ int V = graph->V; struct Edge result[V]; int e = 0; int i = 0; qsort(graph->edge, graph->E, sizeof(graph->edge[0]), myComp); struct subset* subsets = (struct subset*)malloc(V * sizeof(struct subset)); for (int v = 0; v < V; ++v) { subsets[v].parent = v; subsets[v].rank = 0; } while (e < V - 1 && i < graph->E) { struct Edge next_edge = graph->edge[i++]; int x = find(subsets, next_edge.src); int y = find(subsets, next_edge.dest); if (x != y) { result[e++] = next_edge; Union(subsets, x, y); } } printf("Following are the edges in the constructed MST\n"); int minimumCost = 0; for (i = 0; i < e; ++i){ printf("%d -- %d == %d\n", result[i].src, result[i].dest, result[i].weight); minimumCost += result[i].weight; } printf("Minimum Cost Spanning tree : %d",minimumCost); return; } int main(){ /* Let us create the following weighted graph 30 0--------1 | \ | 26| 25\ |15 | \ | 22--------23 24 */ int V = 24; int E = 25; struct Graph* graph = createGraph(V, E); graph->edge[0].src = 20; graph->edge[0].dest = 21; graph->edge[0].weight = 30; graph->edge[1].src = 20; graph->edge[1].dest = 22; graph->edge[1].weight = 26; graph->edge[2].src = 20; graph->edge[2].dest = 23; graph->edge[2].weight = 25; graph->edge[3].src = 21; graph->edge[3].dest = 23; graph->edge[3].weight = 35; graph->edge[4].src = 22; graph->edge[4].dest = 23; graph->edge[4].weight = 24; KruskalMST(graph); return 0; }
出力
Following are the edges in the constructed MST 22 -- 23 == 24 20 -- 23 == 25 20 -- 21 == 30 Minimum Cost Spanning tree : 79
結論
このチュートリアルでは、Kruskal の最小スパニング ツリー アルゴリズム - Greedy メソッドと C コードを使用してこの質問を解決する方法を示します。 。このコードは Java、Python、その他の言語でも記述できます。クラスカルのコンセプトをモデルにしています。このプログラムは、指定されたグラフ内で最短のスパニング ツリーを見つけます。このチュートリアルがお役に立てば幸いです。
以上がKruskal の最小スパニング ツリー アルゴリズム - C++ の貪欲なアルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Cスイッチステートメントでデフォルトに起因するエラーを回避するための戦略:定数の代わりに列挙を使用し、ケースステートメントの値を列挙の有効なメンバーに制限します。最後のケースステートメントでフォールスルーを使用して、プログラムが以下のコードを引き続き実行できるようにします。フォールスルーなしのスイッチステートメントの場合、エラー処理のためのデフォルトステートメントを常に追加するか、デフォルトの動作を提供します。

Charは、C言語で単一の文字を保存するタイプで、ASCIIコードを表す1バイトを占めます。文字、数字、シンボルを含むASCIIコード0-255の範囲に値を保存できます。 「%C」形式の仕様を使用してCHAR変数を印刷しますが、切り捨てと暗黙の変換の影響には注意してください。

C言語のデフォルトは、Switchステートメントのオプションの部分であり、比類のない状況を処理するために使用され、ボトムライン処理を提供し、コードを簡素化します。構文:switch(expression){case constant1:Statement1;壊す;ケース定数2:ステートメント2;壊す;デフォルト:default_statement;壊す; }関数:(1)式の値が一定のケースと一致しない場合、デフォルトの部分を実行します。 (2)sw

C言語では、スワップ命令を使用して、2つの変数の値を交換します。スワップ(x、y):スワップ(x、y):xとyの値をスワップして、一時変数またはビット操作を使用して達成できます。

オペレーターは、構造または組合のメンバーを指しており、メンバーの値へのアクセスまたは割り当てに使用されるexpr.memberとして使用されます。

C言語でのデフォルトのベストプラクティス:比類のない値のデフォルト処理として、スイッチステートメントの最後に配置します。プログラムの堅牢性を改善するために、未知の値または無効な値を処理するために使用されます。簡潔さを維持するために、ケースブランチとの複製を避けてください。読みやすさを改善するためのデフォルトのブランチの目的について明確にコメントします。明確さを維持するために、あるケースで複数のデフォルトを使用しないでください。デフォルトのブランチを簡潔に保ち、複雑な操作を避けます。列挙値をケース条件として使用して、保守性を向上させることを検討してください。大規模なスイッチステートメントでは、複数のデフォルトブランチを使用してさまざまな状況を処理します。

C言語では、exit()関数を使用して、プログラムの実行権をすぐに終了し、コントロール権を呼び出しプロセスに返し、プログラムを終了するパラメーターを受け入れて、プログラムを終了するステータスコードを示します。 exit()が呼び出された後、プログラムはコードを実行しなくなり、割り当てられたすべてのメモリは自動的にリリースされません。

C Language Switchステートメント:デフォルトのブランチは、通常は最後に配置されているすべての比類のないケースを処理します。ブレークステートメントはスイッチステートメントを終了し、後続のコードで継続します。各ブランチはブレークで終了するはずです。
