目次
Kruskal のアルゴリズムを使用して最小スパニング ツリーを見つける
出力
結論
ホームページ バックエンド開発 C++ Kruskal の最小スパニング ツリー アルゴリズム - C++ の貪欲なアルゴリズム

Kruskal の最小スパニング ツリー アルゴリズム - C++ の貪欲なアルゴリズム

Aug 28, 2023 pm 03:05 PM
C言語 kruskal 最小スパニングツリー 貪欲なアルゴリズム

スパニング ツリーは、すべての頂点を接続する有向無向グラフのサブグラフです。グラフ内には多数のスパニング ツリーが存在する場合があります。各グラフの最小スパニング ツリー (MST) の重みは、他のすべてのスパニング ツリーと同じかそれより小さくなります。重みはスパニング ツリーのエッジに割り当てられ、合計が各エッジに割り当てられた重みになります。 V はグラフ内の頂点の数であるため、V をエッジの数とすると、最小スパニング ツリーのエッジの数は (V - 1) になります。

Kruskal のアルゴリズムを使用して最小スパニング ツリーを見つける

  • すべてのエッジは重みによる非降順で並べ替える必要があります。

  • 最小のエッジを選択します。ループが形成されていない場合は、エッジが含まれます。

  • ステップ 2 は、スパニング ツリーに (V-1) 個のエッジができるまで実行する必要があります。

この場合、貪欲なアプローチを使用するように言われます。欲張りなオプションは、最小の重みを持つエッジを選択することです。例: このグラフの最小スパニング ツリーは (9-1)= 8 エッジです。

Kruskal の最小スパニング ツリー アルゴリズム - C++ の貪欲なアルゴリズム

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Cスイッチステートメントでデフォルトに起因するエラーを避けてください Cスイッチステートメントでデフォルトに起因するエラーを避けてください Apr 03, 2025 pm 03:45 PM

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

C言語での文字の意味は何ですか C言語での文字の意味は何ですか Apr 03, 2025 pm 03:42 PM

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

C言語のデフォルト:比類のない状況を処理するためのツール C言語のデフォルト:比類のない状況を処理するためのツール Apr 03, 2025 pm 03:54 PM

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

c言語ではスワップとはどういう意味ですか c言語ではスワップとはどういう意味ですか Apr 03, 2025 pm 06:27 PM

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

c言語は何を意味しますか c言語は何を意味しますか Apr 03, 2025 pm 06:51 PM

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

C言語のデフォルトのベストプラクティス C言語のデフォルトのベストプラクティス Apr 03, 2025 pm 03:48 PM

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

c言語での出口は何を意味しますか c言語での出口は何を意味しますか Apr 03, 2025 pm 06:39 PM

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

デフォルトとC Switchステートメントのブレーク デフォルトとC Switchステートメントのブレーク Apr 03, 2025 pm 03:51 PM

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

See all articles