纯C语言:贪心Prim算法生成树问题源码分享
更新时间:2020年4月25日 17:43 点击:1549
复制代码 代码如下:
#include <iostream.h>
#define MAX 100
#define MAXCOST 100000
int graph[MAX][MAX];
int Prim(int graph[MAX][MAX], int n)
{
/* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */
int lowcost[MAX];
/* mst[i]记录对应lowcost[i]的起点 */
int mst[MAX];
int i, j, min, minid, sum = 0;
/* 默认选择0号节点加入生成树,从1号节点开始初始化 */
for (i = 1; i < n; i++)
{
/* 最短距离初始化为其他节点到0号节点的距离 */
lowcost[i] = graph[0][i];
/* 标记所有节点的起点皆为默认的0号节点 */
mst[i] = 0;
}
/* 标记0号节点加入生成树 */
lowcost[0] = 0;
/* n个节点至少需要n-1条边构成最小生成树 */
for (i = 1; i < n; i++)
{
min = MAXCOST;
minid = 0;
/* 找满足条件的最小权值边的节点minid */
for (j =1; j <n; j++)
{
/* 边权值较小且不在生成树中 */
if (lowcost[j] < min && lowcost[j] != 0)
{
min = lowcost[j];
minid = j;
}
}
/* 输出生成树边的信息:起点,终点,权值 */
cout<<"生成数边的起点、终点及权值分别为:"<< mst[minid]+1<<" "<<minid+1<<" "<<min<<endl;
/* 累加权值 */
sum += min;
/* 标记节点minid加入生成树 */
lowcost[minid] = 0;
/* 更新当前节点minid到其他节点的权值 */
for (j = 1; j < n; j++)
{
/* 发现更小的权值 */
if (graph[minid][j] < lowcost[j])
{
/* 更新权值信息 */
lowcost[j] = graph[minid][j];
/* 更新最小权值边的起点 */
mst[j] = minid;
}
}
}
/* 返回最小权值和 */
return sum;
}
void main()
{
int i, j, m,n;
int cost;
/* 读取节点的数目 */
cout<<"请输入该图结点个数:";
cin>>m;
/* 初始化图,所有节点间距离为无穷大 */
for (i = 0; i <m; i++)
{
for (j =i+1; j <m; j++)
{
cout<<"请输入结点"<<i+1<<"到结点"<<j+1<<"边的权值,若无边则输入MAXCOST(100000):";
cin>>n;
graph[i][j] = n;
graph[j][i] = n;
}
graph[i][i]=MAXCOST;
}
/* 求解最小生成树 */
cost = Prim(graph, m);
cout<<"最小生成树的权值为:"<<cost<<endl;
}
上一篇: 纯c语言实现面向对象分析与示例分享
下一篇: 纯C语言:递归最大数源码分享
相关文章
- 这篇文章主要为大家详细介绍了C语言实现最小生成树构造算法,利用Prim算法或kruskal算法求解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了详解次小生成树以及相关的C++求解方法,文中的练习示例采用了kruskal算法通过C++进行求解,需要的朋友可以参考下...2020-04-25
- Prim算法能够在带权的图中搜索出最小生成树,这也是各大ACM和面试及考研题目中的热点,下面我们就来详细看一下Prim(普里姆)算法求最小生成树的思想及C语言实例讲解...2020-04-25
- 这篇文章主要介绍了使用C语言实现最小生成树求解的简单方法,包括Prim算法和Kruskal算法的两种求解方式,需要的朋友可以参考下...2020-04-25
- 这篇文章主要讲解了普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树,需要的朋友可以参考下...2020-04-25
- 最小生成树Kruskal算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。本文将介绍它的原理,并用Python进行实现...2021-06-17
- 这篇文章主要介绍了贪心Prim算法生成树问题源码,有需要的朋友可以参考一下...2020-04-25
- 这篇文章主要介绍了C++使用Kruskal和Prim算法实现最小生成树,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25