詳細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;
}