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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章