最小スパニングツリー - クラスカルのアルゴリズム
アルゴリズム
【図すべてのケーブルは、頂点を残して、除去します
2側の2つの頂点を接続する、図のアレイの側縁部から設定された最小量を探します
3. 2つのそのような選択された最小スパニングツリーエッジループが表示された場合、エッジが破棄され、次の最小値オプションエッジ間の頂点を結ぶ最小量エッジを探し続け
4頂点の全てが互いに接続されないループが存在しなくなるまで、最小スパニングツリーが生成されます。
クラスカルのアルゴリズムコード
通信ネットワーク内の最小スパニングツリーの//値
書式#include <stdio.hに>
書式#include <stdlib.h>に含ま
#define MAXEDGE 20
MAXVEX 20の#define
#define INFINITY 65535
構造体のtypedef
{
INTアーク[MAXVEX] [MAXVEX]。
int型numVertexes、numEdges; //頂点の数、辺の数
} Ngrf。
構造体のtypedef
{
int型始めます。
int型エンド。
int型の重量;
}エッジ、アレイエッジ構造のエッジの//定義
//隣接行列を作成します。
ボイドCreateMGraph(MGraph * G){
int型I、J。
G-> numEdges = 11。
G-> numVertexes = 7。
用(i = 0; I <G-> numVertexes; iは++){
{(J ++; J <G-> numVertexes J = 0)のための
もし(I == j)は
G->アーク[I] [J] = 0;
他
G->アーク[I] [J] = G->アーク[j] [i]は= INFINITY。
}
}
G->アーク[0] [1] = 7。
G->アーク[0] [3] = 5。
G->アーク[1] [2] 8 =。
G->アーク[1] [3] 9 =。
G->アーク[1]〜[4] 7 =。
G->アーク[2] [4] = 5。
G->アーク[3] [4] = 15。
G->アーク[3] [5] 6 =。
G->アーク[4] [5] 8 =。
G->アーク[4] [6] = 9。
G->アーク[5] [6] = 11。
用(i = 0; I <G-> numVertexes; iは++){
{(J ++; J <G-> numVertexes J = I)について
G->アーク[J] [I] = G->アーク[I] [J]。
}
}
}
//条件のクイックソート
int型のCMP(定数無効*、constのボイド* b)は{
リターン(*(エッジ*)A).weight - (*(エッジ*)b)の.weight。
}
//ルートを見つけます
INT {(int型*親、int型のF)を検索
一方、(親[F]> 0){
F =親[F]。
}
Fを返します。
}
//最小スパニングツリーを生成
ボイドMiniSpanTree_Kruskal(MGraph G){
I、J、N、M int型。
INTのK = 0。
int型の親[MAXVEX]; //配列のルートノードを見つけるための
エッジエッジ[MAXEDGE]; //配列のエッジを定義する、エッジ構造始めると、端、重量は、整数であります
//配列とエッジの順序付けられたセット(アレイにセット隣接行列の右側の対角部分)を構築するために使用
用(i = 0; iは<G.numVertexes-1; iは++){
{(; J <G.numVertexes J ++ J = I + 1)のために
IF(G.arc [I] [J] <INFINITY){
エッジ[K] .begin = I;頭小さいノードの数//
エッジ[K] .END = J; //ノードの数が大きい尾あります
エッジ[K] .weight = G.arc [I] [J]。
K ++;
}
}
}
//配列をソートするエッジエッジの集合であります
qsort(エッジ、G.numEdges、はsizeof(EDGE)、CMP)。
用(i = 0; iはG.numVertexesを<; iは++)
親[I] = 0;
printf( "印刷最小スパニングツリー:\ nを");
用(i = 0; iはG.numEdgesを<; iは++){
N =検索(親、エッジ[I] .begin); //ここで、ツリーエッジの側は[I]で「最初のノード」根を探します
M =検索(親、エッジ[I] .END); //検索ツリーエッジの側面[I]「テイルノード」ルート
2つの頂点の範囲//もしnおよびmは、ツリーに記載されていないので、これは側縁のセットが選択された発生回路に追加された生じません
IF(N!= m)の{
親[N] = M。
printf( "(%d個、%d)が%D \ n" は、エッジ[I] .begin、エッジ[I] .END、エッジ[I] .weight)。
}
}
}
int型メイン(無効)
{
MGraph G。
CreateMGraph(&G)。
MiniSpanTree_Kruskal(G)。
0を返します。
}
オリジナルリンクします。https://blog.csdn.net/junya_zhang/article/details/83584592
オリジナルリンク:https://blog.csdn.net/hhu1506010220/article/details/51971717