C语言——Prim算法实现最小生成树

详细C++版本的Prim实现,

可以参考:https://www.61mon.com/index.php/archives/199/comment-page-2#comments

也可参考:http://blog.csdn.net/yeruby/article/details/38615045

今天刚接触Prim算法,参考网上大神们的代码,于是重温了c语言并进行了语言改写..,

printf("%d---%d\n",i,path[i]);  是printf("%d",i);printf("---");printf("%d\n",path[i]);的优化..许久不写c概念有点模糊了...

在此重温一下c语言的输入与输出:

常用的类型输出:

%d    整型

%f    实型

%e   实型(科学计数法)

%c   字符型

%u   无符号整型

------------------------------------

输入函数scanf:

格式: scanf(“格式控制串”,地址表)

功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束

返值:正常,返回输入数据个数

•地址表:变量的地址,常用取地址运算符&或指针

•格式字符:d,i,o,x,u,c,s,f,e

例  scanf(“%4d%2d%2d”,&yy,&mm,&dd);

  输入  19991015

  则1999->yy,10 ->mm,15 ->dd


例  scanf(“%2d%*3d%2d”,&a,&b);

      输入  1234567

      则12->a,  67->b

例  scanf(“%3c%2c”,&c1,&c2);

      输入  abcde ¿

       则‘a’Þc1,‘d’ Þc2




实现代码:

/*Prim算法实现无向图的最小二叉树的生成(邻接矩阵存储)*/ 
#include<stdio.h>
#include<stdlib.h>
#define  MAX 10000


int edge_num;          //总边数
int vertex_num;        //顶点总数
int sum;               //最小生成树的边权之和 
int s;                 //指定的最小生成树的起点
int matrix[100][100];  //定义邻接矩阵
bool visited[100];     //定义标记数组
int l_cost[100];       //定义边的权值
int path[100];         //记录最小生成树的路径


void Prim(int s){
	int min;           //权值最小
	int min_index;     //权值最小的下标
	sum=0;             //初始化权和为0 
	visited[s]=true;   //标记顶点 
	for(int i=0;i<vertex_num;i++){   
		l_cost[i]=matrix[s][i];      //遍历数据,初始化起点s的各邻接边权值 
		path[i]=s;                   //初始化相应从起点到i点的路径 
	} 
	for(int i=1;i<vertex_num;i++){
		min=MAX;
		for(int j=0;j<vertex_num;j++){   //找出权值最小 
			if(visited[j]==false && l_cost[j]<min){
				min=l_cost[j];         //min=最小边权值 
				min_index=j;           //记录相应的边终点j 
			}
		}
		visited[min_index]=true;  //标记找出的结点
		sum+=l_cost[min_index];   //更新生成树的权和,加上新找到的结点的边权 
		for(int j=0;j<vertex_num;j++){  //利用找到的最小下标更新l_cost数组 
			if(visited[j]==false && matrix[min_index][j]<l_cost[j]){
				l_cost[j]=matrix[min_index][j];
				path[j]=min_index;
			}
		} 
	}
} 


int main(){
	int u,v,w;
	printf("请输入图的顶点数目(不大于100):");
	scanf("%d",&vertex_num);
	printf("请输入边数:");
	scanf("%d",&edge_num);
	for(int i=0;i<vertex_num;i++){
		for(int j=0;j<vertex_num;j++){
			matrix[i][j]=MAX;    //初始化matrix数组(邻接矩阵存储) 
		}
	}
	printf("请输入边的信息(起点,终点,边长):\n");
 	for(int i=0;i<edge_num;i++){  //存入各边权信息进邻接矩阵 
 		scanf("%d%d%d",&u,&v,&w);
		 matrix[u][v]=w; 
		 matrix[v][u]=w;
	 }
	printf("请输入起点(<%d,&vertex_num):");
	scanf("%d",&s);
	Prim(s);
	printf("最小生成树的边权和为:%d\n",sum);
	printf("最小生成树的路径为:\n");
	for(int i=0;i<vertex_num;i++){
		if(i!=s){
			printf("%d---%d\n",i,path[i]);
		}
	}
	 return 0;
} 


  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值