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

原创 2015年11月18日 09:32:59

定义:最小生成树并不像数据结构中的树一样,而是从图演化而来,生成树有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-----",pos+1);
		int max=100;
		for(int j=0;j<M;j++){
			if(ever[j]==0&&max>low[j]){
				pos=j;
				max=low[j];
			}
		}
		visit[0][i-1]=max;
		visit[1][i-1]=pos;
	//	printf("-----%d\n",pos+1);
		ever[pos]=1;
	//	printf("%d\n",max); 
		res+=max;
		for(int j=0;j<M;j++){
			if(ever[j]==0&&low[j]>map[pos][j]){
				low[j]=map[pos][j];
			}
		}
	}
	return res;
}

void SHOW_ROAD(const int map[][M],const int visit[][M-1]){
	for(int i=0;i<M-1;i++){
		for(int j=0;j<M;j++){
			if(map[visit[1][i]][j]==visit[0][i]){
				printf("%d",j+1);
			}
		}
		//printf("%d",);
		printf("-----%d\n",visit[1][i]+1); 
	} 
}
void main(){
	int map[M][M];
	int visit[2][M-1]={0};
	INIT_MAP(map);
	int result=procs(map,visit);
	//SHOW_MAP(map);
	SHOW_ROAD(map,visit);
	printf("最小生成树的权值是%d\n",result);
}


测试数据:

100 6 1 5 100 100
6 100 5 100 3 100
1 5 100 5 6 4
5 100 5 100 100 2
100 3 6 100 100 6
100 100 4 2 6 100





版权声明:本文为博主原创文章,未经博主允许不得转载。

图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)

这篇文章是对《算法导论》上Prim算法求无向连通图最小生成树的一个总结,其中有关于我的一点点小看法。   最小生成树的具体问题可以用下面的语言阐述:     输入:一个无向带权图G=(V,E)...
  • tham_
  • tham_
  • 2015年05月27日 16:47
  • 2953

最小生成树:Prim算法

  • 2014年08月05日 10:29
  • 4KB
  • 下载

Prime算法求最小生成树 (邻接矩阵)

实现了 Prime算法求最小生成树 (邻接矩阵)的普通算法和最小堆优化算法。
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2014年11月26日 14:03
  • 1565

最小生成树的邻接矩阵实现

求上面这个图的最小生成树
  • txl16211
  • txl16211
  • 2014年09月02日 17:50
  • 2231

Prim算法介绍与实现

普里姆(Prim)算法
  • u012904198
  • u012904198
  • 2014年04月15日 11:58
  • 1690

数据结构:最小生成树--Prim算法

最小生成树 给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost spanning ...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年08月05日 00:30
  • 10013

Prim算法的C语言实现(邻接矩阵)

#include #include #include #include #define MAX 100 // 矩阵最大容量 #define INF (...
  • tianyalangz
  • tianyalangz
  • 2015年12月24日 17:23
  • 770

邻接矩阵 Prim算法

  • 2012年12月16日 20:24
  • 907B
  • 下载

MIT算法导论-第12讲-最小生成树-Prim算法

问题定义输入:无向图G=(V,E),每条边有一个权重,另假设所有权值是不同的输出:一棵生成树,连接了所有顶点,权重总和最小。分析过程(http://www.cnblogs.com/numbersix/...
  • qing0706
  • qing0706
  • 2016年01月15日 22:02
  • 913

3.无向图顶点 度 边数的关系

3.(2分)我们使用一个6元组来表示6个节点的无向图的顶点数,请问以下哪些6元组是可能的组合()   A、   B、   C、   D、 答:BD 题中的顶点数估计...
  • bluetears1988
  • bluetears1988
  • 2013年10月09日 14:27
  • 7142
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最小生成树 prim算法实现(利用图的邻接矩阵来存放图)
举报原因:
原因补充:

(最多只允许输入30个字)