详细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(“格式控制串”,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束
返值:正常,返回输入数据个数
例 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;
}