最小生成ツリー-pramアルゴリズム
最小生成ツリー :一つのn個の結点がある連結図Gには、Gの一つの連結子図には原図中のn個の結点がすべて含まれ、辺の権の和が最小の場合には図の連結を維持する最小の辺が含まれる.この接続図は Gの最小生成ツリー.
注:最小生成樹は一意ではないが、辺の権利の和は唯一である.
最小の生成ツリーを求めて2つの一般的なアルゴリズムがあります. とprimアルゴリズム、このセクションprimアルゴリズムを説明します.
2つの配列Tが設けられ、Uのうち、Tは接続図のすべての点に保存され、Uは最小生成ツリーの点に保存され、最初のUには1つの点sしか含まれていない.まずT-UでUの中のs近傍接点のうちの1つの点aを探してUに加え、T-Uでsに加えて、aの隣接点距離aまたはsの一番近い点を探して、Uに加えて上記の動作を繰り返す. = Uまでです
文字の理解が難しいです.コードを見てください.
注:最小生成樹は一意ではないが、辺の権利の和は唯一である.
最小の生成ツリーを求めて2つの一般的なアルゴリズムがあります. とprimアルゴリズム、このセクションprimアルゴリズムを説明します.
2つの配列Tが設けられ、Uのうち、Tは接続図のすべての点に保存され、Uは最小生成ツリーの点に保存され、最初のUには1つの点sしか含まれていない.まずT-UでUの中のs近傍接点のうちの1つの点aを探してUに加え、T-Uでsに加えて、aの隣接点距離aまたはsの一番近い点を探して、Uに加えて上記の動作を繰り返す. = Uまでです
文字の理解が難しいです.コードを見てください.
#include
#include
#define INF 0x3f3f3f3f
#define MAXN 1000
int map[MAXN][MAXN];
int dis[MAXN];
int vis[MAXN];
void init(){ , map ,vis ( U )
memset(map,INF,sizeof(map));
memset(vis,-1,sizeof(vis));
}
int prim(int n,int start){ //n ,start
int i,j,sum = 0,cnt = 1;
for (i=1;i<=n;i++) // dis
dis[i] = map[start][i];
vis[start] = 1; //
dis[start] = 0; //
for (i=1;i map[k][j])
dis[j] = map[k][j];
}
}
}
return cnt == n ? sum : -1; // , -1
}
int main (){
int i, k, n, m, a, b, c;
scanf("%d%d",&n,&m);
init();
for (i=0;i
注:最小生成ツリーがあるかどうかを図によって判定することもできます.接続図ですか?