C語言——Prim演算法實現最小生成樹
阿新 • • 發佈:2018-12-30
詳細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; }