c语言版本的最小生成树(Prim算法)概述

1、Prim算法概述:图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。

 2、最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。

3、重点部分代码段实现 

//prim算法生成最小生成树
void MiniSpanTree_Prim(MGraph G){

	int min,i,j,k;
	int adjvex[MAXVEX]; //保存相关顶点下标
	int lowcost[MAXVEX];//保存相关顶点间的权值
	lowcost[0] = 0;     //v0作为最小生成树的根开始遍历,权值为0
	adjvex[0] = 0;		//V0第一个加入

	//初始化操作
	for(int i = 1;i<G.numVertexes;i++){

		lowcost[i] = G.arc[0][i]; //将领接矩阵的第0行所有权值先加入数组
		adjvex[i] = 0;            //将全部初始化为v0的下标
	}

	//真正构造最小生成树的过程
	for(int i = 1;i<G.numVertexes;i++){

		min = INFINITY;		//初始化最小权值为65535等不可能的数值
		j = 1;
		k = 0;


		//遍历全部顶点
		
		while(j < G.numVertexes){

			//找出lowcost数组已经存储的最小权值
			if(lowcost[j]!=0 && lowcost[j] < min){
				min = lowcost[j];
				k = j; //将发现的最小权值的下标存入k,以待使用
			} 
			j++;
		}
	}
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Prim算法是一种求解加权连通图的最小生成树的贪心算法C语言实现最小生成树Prim算法的步骤如下: 1. 定义图结构体,包括节点数、边数和邻接矩阵。 2. 初始化邻接矩阵,将非连通节点的边权重设为无穷大。 3. 定义一个数组存储每个节点到已选择节点集合的最小边权值。 4. 定义一个数组存储每个节点是否已经被选择。 5. 选择一个起始节点,将其加入已选择节点集合中,并更新其邻接节点的最小边权值。 6. 重复执行以下步骤,直到已选择节点集合包含所有节点: 1) 从未选择节点中选出到已选择节点集合的最小边权值最小的节点。 2) 将该节点加入已选择节点集合,并更新其邻接节点的最小边权值。 7. 最后得到的已选择节点集合和它们之间的边就是最小生成树。 以下是C语言实现Prim算法的伪代码: ``` // 定义图结构体 struct Graph { int n; // 节点数 int m; // 边数 int w[N][N]; // 邻接矩阵 }; // Prim算法求解最小生成树 void Prim(Graph g, int start) { int i, j, k, min, sum = 0; int lowcost[N], closest[N], vis[N]; // 初始化数据 for (i = 1; i <= g.n; i++) { lowcost[i] = g.w[start][i]; closest[i] = start; vis[i] = 0; } vis[start] = 1; // 执行n-1次循环,得到n-1条边 for (i = 1; i < g.n; i++) { min = INF; // 找出到已选择节点集合的最小边权值 for (j = 1; j <= g.n; j++) { if (!vis[j] && lowcost[j] < min) { min = lowcost[j]; k = j; } } vis[k] = 1; sum += min; // 更新未选择节点的最小边权值 for (j = 1; j <= g.n; j++) { if (!vis[j] && g.w[k][j] < lowcost[j]) { lowcost[j] = g.w[k][j]; closest[j] = k; } } } // 输出最小生成树 for (i = 1; i <= g.n; i++) { if (closest[i] != start) { printf("%d-%d\n", closest[i], i); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值