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

来源:互联网 发布:mac求生之路2附加战役 编辑:程序博客网 时间:2024/05/20 18:02

详细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 10000int 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;} 


阅读全文
0 0
原创粉丝点击