最小生成树 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
  • 1880

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

求上面这个图的最小生成树

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

#include #include #include #include #define MAX 100 // 矩阵最大容量 #define INF (...

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

最小生成树 给定一无向带权图,顶点数是n,要使图连通只需n-1条边,若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost spanning ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

使用C++邻接矩阵实现图的存储、Prim、Kruskal算法

1、创建Node.h 定义图的顶点 #ifndef NODE_H #define NODE_H class Node{ public: Node(char data=0); char...

图的最小生成树Prim算法朴素版(C++)

Prim算法从一个节点开始不断选择权值最小的边加入当前已有的树结构,最终遍历完所有的节点得到最小生成树。时间复杂度为O(V^2)。V为图中顶点个数。C++代码如下:#include #include...

最小生成树(prim算法与kruskal算法)(模板)

th写的总结,很不错,转载一下:点击打开链接   首先说一下什么是树:     1、只含一个根节点     2、任意两个节点之间只能有一条或者没有线相连     3、任意...

最小生成树之Prim算法

Prim算法: 假设N = (V,{E})是连通网,TE是N上最小生成树中边的集合。算法从U={u0}(u0属于V),TE={}开始,重复执行下述操作:在所有u属于U,v属于V-U的边(u,v)...

无向连通网的最小生成树算法[第1部分]

摘要:求解图的最小生成树在工程管理、最优化规划等领域有广泛的应用,因此对最小生成树算法的研究具有重要的意义。本文针对图的最小生成树算法,首先对几种经典的最小生成树算法进行了总结,最后针对无向连通网的最...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最小生成树 prim算法实现(利用图的邻接矩阵来存放图)
举报原因:
原因补充:

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