1.问题
假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集,如果(u,v)是一条具有最小权值的边,其中u属于U,v属于V-U,则必定存在一颗包含边(u,v)的最小生成树,采用Prim算法构造最小生成树。
2.解析
在所有u∈U,v∈V-U的边(u,v)∈E中找到一条代价最小的边(u0,v0),并将其并入集合ET,u0并入U。重复上述操作,直至U=V。则此时的T=(V,{ET})为最小生成树。
3.设计
void prim()
{
//以1作为根节点
for (int i=1;i<=n;i++)
{
if(matrix[1][i]!=INF)
p[i]=1;
d[i]=matrix[1][i];
}
while (1)
{
int maxx=INF;
int u=-1;
//找到距离生成树最短距离的节点
for (int i=1;i<=n;i++)
{
if(!visited[i]&&d[i]<maxx)
{
maxx=d[i];
u=i;
}
}
if(u==-1)
break;
//将选出的节点纳入集合
visited[u]=1;
//更新该节点影响的节点
for (int i=1;i<=n;i++)
{
if(!visited[i]&&d[i]>matrix[u][i])
{
d[i]=matrix[u][i];
p[i]=u;
}
}
}
int sum=0;
for (int i=1;i<=n;i++)
if(p[i]==-1)
{
printf(“不存在最小生成树\n”);
return ;
}
else
sum+=d[i];
printf(“最短生成树的长度为%d\n”,sum);
return ;
}
4.分析
Prim算法的时间复杂度为O(n²)。
5.源码
https://github.com/Soulkey777/algorithm-analysis
1.问题
假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集,如果(u,v)是一条具有最小权值的边,其中u属于U,v属于V-U,则必定存在一颗包含边(u,v)的最小生成树,采用Kruskal算法构造最小生成树。
2.解析
克鲁斯卡尔算法的基本思想是以边为主导地位,始终选择当前可用的最小边权的边。每次选择边权最小的边链接两个端点是kruskal的规则
3.设计
4.分析
Kruskal算法的时间复杂度为O(ElogE)。
5.源码
https://github.com/Soulkey777/algorithm-analysis