算法介绍
最小生成树主要有两种方法:Prim算法和Kruskal算法。这两种算法若采用二叉堆那么很容易达到 O(ElgV) 的运行时间。这两种算法都采用了贪心算法,在算法的每一步中,都试图选取最佳的结果,也就是总是选取权值最小的边或顶点。
最小生成树
Prim算法
与Kruskal算法的找边不同,Prim算法是找点:即总是在找最小的顶点。该算法需要有个数组来保存权值,一个数组用来表示那些顶点已经被访问了,那些顶点还没被访问。
代码实现
#include <stdio.h>
#include <string.h>
#define maxn 21
#define inf 1000000
int n , m ;
int edge[maxn][maxn];
int lowcost[maxn];
int nearvex[maxn];
void prim( int u0)
{
int sumweight = 0;
int i , j ;
for( i = 1; i <= n; i++) //从顶点1开始
{
lowcost[i] = edge[u0][i];
nearvex[i] = u0;
}
lowcost[u0] = 0;
nearvex[u0] = -1; // -1 : 已加入到生成树中
for( i = 1; i < n; i++) //将n-1个顶点加入到顶点集合t2
{
int min = inf;
int v = -1;
for(j = 1; j <=n ; j++)
{
if(nearvex[j] != -1 && lowcost[j] < min)
{
min = lowcost[j];
v = j;
}
}
if( v != -1)
{
printf("%d %d %d \n",nearvex[v],v,lowcost[v]);
nearvex[v] = -1;
sumweight += lowcost[v];
for(j = 1; j <= n ; j++)
{
if( nearvex[j] != -1 && edge[v][j] < lowcost [j])
{
lowcost[j] = edge[v][j];
nearvex[j] = v;
}
}
}
}
printf("sumweight of the mst is %d\n",sumweight);
}
int main()
{
int i , j;
int u , v , w;
scanf("%d %d",&n,&m);
memset(edge,0,sizeof(edge));
for(i = 1; i <= m ; i++)
{
scanf("%d %d %d",&u, &v , &w);
edge[u][v] = edge[v][u] = w;
}
for(i = 1; i <= n ; i++)
for( j = 1; j <= n; j++)
{
if(i == j)
edge[i][j] = 0;
else if(edge[i][j] == 0)
edge[i][j] = inf;
}
prim(1);
return 0;
}
引用 http://www.cnblogs.com/bofengqiye/archive/2012/05/05/2484542.html
本文详细介绍了Prim算法用于求解最小生成树问题的过程,并提供了完整的C语言实现代码。通过Prim算法,可以有效地找到加权图中所有顶点组成的最小生成树。

3万+

被折叠的 条评论
为什么被折叠?



