最小生成树的问题分析:
n个城市间,最多可设置n(n-1)/2条线路
n个城市间建立通信网,只需n-1条线路
问题转化为:如何在可能的线路中选择n-1条,能把
所有城市(顶点)均连起来,且总耗费
(各边权值之和)最小
prim算法:
算法思想:设N=(V,{E})是连通网,TE是N上最小生成树中边的集合
初始令U={u0},(u0V), TE=
在所有uU,vV-U的边(u,v)E中,找一条代价最小的边(u0,v0)
将(u0,v0)并入集合TE,同时v0并入U
重复上述操作直至U=V为止,则T=(V,{TE})为N的最小生成树
算法实现:图用邻接矩阵表示
算法描述
算法评价:T(n)=O(n²)
算法实现:
struct Edge
{
int pointer;
int lowcost;
int flag;
};
Edge edge[MAX_Edge];
int prim( int n )
{
int i , j , k = 1,flag ;
int min,sum2=0 ;
j = 1 ;
for( i = 1 ; i <= n ; i ++ )//初始化
{
if (i != j )
{
edge[i].pointer = i ;
edge[i].lowcost = arr_list[j][i] ;
edge[i].flag=0;
}
}
edge[j].lowcost = 0 ; edge[j].flag=1;
for( i = 2 ; i <= n ; i++ )
{
k=1;
min =INF ;
flag=0;
for( j=2;j<=n; j++ )//寻找最短的路径
{
if ( edge[j].flag== 0 && edge[j].lowcost < min)
{
k = j ;
min = edge[j].lowcost ;
flag=1;
}
}
if (!flag) return -1;
sum2 += min ;
edge[k].flag=1;
for(j = 2 ; j <= n ; j++ )//更新edge[i]
{
if( edge[j].flag== 0&&arr_list[k][j] < edge[j].lowcost)
{
edge[j].pointer = k ;
edge[j].lowcost = arr_list[k][j] ;
}
}
}
return sum2;//sum2为最小生成树的权值之和
}