【Prim最小生成树算法】

Prim最小生成树算法

对于带权连通无向图,它有许多生成树,但最有意义的是使得边权值最小的生成树,即最小生成树MST

Prim算法,类似于最短路径的Dijkstra算法。
初始时从图中任取一顶点加入树T,此时树中只含有一个顶点,之后选择一个与当前T中顶点集合距离最近的顶点,并将该顶点和相应的边加入T,每次操作后T中的顶点数和边数都增1。以此类推,直至图中所有的顶点都并入T。

void Prim(G, T){
    T=NULL;	// 初始化空树		注意T=(U,E),就是说U其实是T中的
    U={w};	// 添加任一顶点w
    while((V-U)!=NULL){	// 若树中不含全部顶点(u,v)是使u∈U与v∈(V-U),且权值最小的边;
        T=T∪{(u,v)};	// 边归并入树中
        U=U∪{v};		// 顶点归入树中
    }
}
bool visited[MaxVertexNum];	// 访问标记数组
void Prim(MGraph G, int v) {   // Prim 最小生成树算法  v为起点
	int min_weight = 0; // 最小代价
	int distance[MaxVertexNum];	// 记录当前集合中的点与不在集合中点的最小距离
	VertexType to_Print[MaxVertexNum];	// 顺序记录加入集合中的点
	int w=v, i; //选中的顶点
	to_Print[0] = G.Vex[w];
	for (i = 0; i < G.vexnum; i++) {  // 初始化
		visited[i] = false;
		distance[i] = G.Edge[w][i] != INITIAL_VALUE ? G.Edge[w][i] : INT_MAX;
	}	
	visited[w] = true; // 不再访问
	int count = 0;	// 执行n-1次,获取n-1条边
	while ( (count++) < G.vexnum - 1) {
		int min = INT_MAX;
		for (i = 0; i < G.vexnum; i++) {	// 选出最小边
			if (!visited[i] && distance[i] < min) {
				min = distance[i];
				w = i;
			}
		}
		visited[w] = true;	// 不再访问
		to_Print[count] = G.Vex[w];
		min_weight += min;
		for (i = 0; i < G.vexnum; i++) {	// 更新distance数组
			if (!visited[i] && G.Edge[w][i] < distance[i])
				distance[i] = G.Edge[w][i];
		}
		
	}
	cout << min_weight << endl;
	for (i = 0; i < count; i++) {
		printf("%c \t", to_Print[i]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值