最小生成树 prim算法实现(利用图的邻接矩阵来存放图)

定义:最小生成树并不像数据结构中的树一样,而是从图演化而来,生成树有DFS生成树,BFS生成树,最小生成树等。

所谓最小生成树,就是在有N个节点的连通图中,找出N-1条边使N个点仍然连通,并且个边权值和最小。

代码如下:

/**********计算出图的最小生成树的代价,不能直达的点之间的权值设为100,假设所有点之间的
权值不超过99,代码暂时显示出生成树的路径貌似有bug*********/
#include<stdio.h>
#define M 6
void INIT_MAP(int map[][M]){
	for(int i=0;i<M;i++){
		for(int j=0;j<M;j++){
			scanf("%d",&map[i][j]);
		}
	} 
}

void SHOW_MAP(const int map[][M]){
	for(int i=0;i<M;i++){
		for(int j=0;j<M;j++){
			printf("%d ",map[i][j]);
		}printf("\n");
	}
}

int procs(const int map[][M],int visit[][M-1]){
	int res=0;
	int ever[M]={0};
	int low[M]={0};
	int pos=0;
	ever[0]=1;
	for(int i=1;i<M;i++){
		low[i]=map[pos][i];
	}								//随即从第一个节点开始访问 
	for(int i=1;i<M;i++){
		//printf("%d----
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Prim算法是一种用于求解最小生成树的算法,以下分别介绍邻接矩阵邻接表两种实现方式。 1. 邻接矩阵实现 Prim算法的基本思想是从一个初始顶点开始,逐步向外扩展最小生成树。首先将初始顶点加入最小生成树中,然后将与该顶点相邻的所有边加入到候选边集中,从中选取最小的边加入到最小生成树中,同时把与该边相邻的顶点加入到最小生成树的顶点集合中。接着,从候选边集中删除已选的边,再将新加入的顶点的所有未访问过的边加入到候选边集中,重复上述步骤,直到最小生成树中包含n-1条边。 邻接矩阵实现Prim算法需要使用一个一维数组记录各个顶点的状态,另一个一维数组记录候选边集中与各个顶点相连的最小边的权值。具体实现过程如下: (1)初始化 将初始顶点v加入最小生成树中,将数组visited[v]标记为已访问,将所有与v相邻的边加入候选边集中,对于每个顶点i,设置dist[i]为邻接矩阵中v到i的距离。 (2)循环 重复以下步骤n-1次,直到成完整的最小生成树: 1. 从候选边集中选取权值最小的边e,将其加入最小生成树中。 2. 将与e相连的顶点u加入最小生成树的顶点集合中,将visited[u]标记为已访问。 3. 更新候选边集,将与u相邻的未访问顶点i的dist值更新为邻接矩阵中u到i的距离,如果dist[i]值小于候选边集中与i相邻的最小边的权值,则更新该边的权值。 实现代码如下: ```python def prim(adj_matrix): n = len(adj_matrix) visited = [False] * n dist = [float('inf')] * n dist[0] = 0 for i in range(n): min_dist = float('inf') u = -1 for j in range(n): if not visited[j] and dist[j] < min_dist: min_dist = dist[j] u = j visited[u] = True for v in range(n): if not visited[v] and adj_matrix[u][v] < dist[v]: dist[v] = adj_matrix[u][v] return sum(dist) ``` 2. 邻接表实现 邻接表实现Prim算法需要使用一个堆(优先队列)来维护候选边集的顶点,具体实现过程如下: (1)初始化 将初始顶点v加入最小生成树中,将数组visited[v]标记为已访问,将与v相邻的所有边加入堆中,对于每个顶点i,设置dist[i]为与v相邻的最小边的权值。 (2)循环 重复以下步骤n-1次,直到成完整的最小生成树: 1. 从堆中选取权值最小的边e,将其加入最小生成树中。 2. 如果该边连接的另一个顶点u未被访问,则将u加入最小生成树的顶点集合中,将visited[u]标记为已访问。 3. 更新堆,将与u相邻的未访问顶点i的dist值更新为与u相邻的最小边的权值,如果dist[i]值发了变化,则将i加入堆中。 实现代码如下: ```python import heapq def prim(adj_list): n = len(adj_list) visited = [False] * n dist = [float('inf')] * n dist[0] = 0 heap = [(0, 0)] while heap: min_dist, u = heapq.heappop(heap) if visited[u]: continue visited[u] = True for v, w in adj_list[u]: if not visited[v] and w < dist[v]: dist[v] = w heapq.heappush(heap, (w, v)) return sum(dist) ``` 以上就是Prim算法邻接矩阵邻接表实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值