Primアルゴリズム(プリムアルゴリズム)
3435 ワード
説明:
1つの連通図の生成ツリーは、図中のすべての頂点を含む極小連通サブマップを指すが、1つのツリーを構成するのに十分なn−1エッジしかない.連通網を構築する最小コスト生成ツリーを最小生成ツリーとする.Primアルゴリズムは最小生成ツリーを構築するアルゴリズムである.
定義:
N=(P,{E})は連通網であり,TEはN上の最小生成ツリーにおける辺の集合であると仮定する.アルゴリズムはU={U 0}から(U 0はVに属する).すべてのuがUに属し、vがV-Uに属するエッジ(u,v)がEに属する中で、最もコストの小さいエッジ(u 0,v 0)が集合TEに組み込まれ、同僚v 0がUに組み込まれ、U=Vを知るまで繰り返し実行します.このときTEには必ずn-1辺があり,T=(V,{TE})はNの最小生成木である.
機能:
もしあなたが電信の実施エンジニアであれば、1つの町の9つの村のために通信ネットワークを設置する必要があります.村はこの町に散らばっていて、村ごとに一定の距離があります.primアルゴリズムで接続方法を見つけることができます.このようにして、全体の経路が最も短いことを保証することができます.
時間複雑度:O(n 2)
コード:
1つの連通図の生成ツリーは、図中のすべての頂点を含む極小連通サブマップを指すが、1つのツリーを構成するのに十分なn−1エッジしかない.連通網を構築する最小コスト生成ツリーを最小生成ツリーとする.Primアルゴリズムは最小生成ツリーを構築するアルゴリズムである.
定義:
N=(P,{E})は連通網であり,TEはN上の最小生成ツリーにおける辺の集合であると仮定する.アルゴリズムはU={U 0}から(U 0はVに属する).すべてのuがUに属し、vがV-Uに属するエッジ(u,v)がEに属する中で、最もコストの小さいエッジ(u 0,v 0)が集合TEに組み込まれ、同僚v 0がUに組み込まれ、U=Vを知るまで繰り返し実行します.このときTEには必ずn-1辺があり,T=(V,{TE})はNの最小生成木である.
機能:
もしあなたが電信の実施エンジニアであれば、1つの町の9つの村のために通信ネットワークを設置する必要があります.村はこの町に散らばっていて、村ごとに一定の距離があります.primアルゴリズムで接続方法を見つけることができます.このようにして、全体の経路が最も短いことを保証することができます.
時間複雑度:O(n 2)
コード:
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEX 10
#define INF 65535
typedef char VertexType;
typedef int EdgeType;
typedef struct MGraph
{
VertexType data[MAXVERTEX];
EdgeType edge[MAXVERTEX][MAXVERTEX];
int numVertex;
int numEdge;
}MGraph;
//
void CreateMGraph(MGraph *G)
{
int i = 0,j = 0,k = 0,w = 0;
VertexType c;
printf(" : , :
");
scanf("%d,%d",&G->numVertex,&G->numEdge);
fflush(stdin);
printf(" , :
");
scanf("%c",&c);
while(i < G->numVertex)
{
if(c == '
')
break;
G->data[i] = c;
i++;
scanf("%c",&c);
}
for(i = 0;i < G->numVertex;i++)
{
for(j = 0;j < G->numVertex;j++)
{
if(i == j)
G->edge[i][j] = 0;
else
G->edge[i][j] = INF;
}
}
fflush(stdin);
for(k = 0;k < G->numEdge;k++)
{
printf(" vi-vj i j , w, , :
");
scanf("%d,%d,%d",&i,&j,&w);
G->edge[i][j] = w;
G->edge[j][i] = G->edge[i][j];
}
printf("
:
");
for(i = 0;i < G->numVertex;i++)
{
for(j = 0;j < G->numVertex;j++)
{
printf("%d ",G->edge[i][j]);
}
printf("
");
}
}
void Prim(MGraph *G)
{
int i = 0,j = 0,k = 0,min,m;
int adjvex[MAXVERTEX];
int lowcost[MAXVERTEX];
for(i = 0;i < G->numVertex;i++)
{
adjvex[i] = 0;
}
lowcost[0] = 0;
for(i = 1;i < G->numVertex;i++)
{
lowcost[i] = G->edge[0][i];
}
for(i = 1;i < G->numVertex;i++)
{
j = 1,k = 0;
min = INF;
while(j < G->numVertex)
{
if(lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
j++;
}
printf("(%d,%d) ",adjvex[k],k);
lowcost[k] = 0;
for(j = 1;j < G->numVertex;j++)
{
if(lowcost[j] != 0 && G->edge[k][j] < lowcost[j])
{
lowcost[j] = G->edge[k][j];
adjvex[j] = k;
}
}
}
}
int main()
{
MGraph G;
CreateMGraph(&G);
printf("
******************************
");
printf("
Prim :
");
Prim(&G);
printf("
******************************
");
return 0;
}