Prim算法實現最小生成樹問題(C++語言)

塔坪村A

上白廟B

如意村C

上雲村D

雙塘村E

碑子巖F

楊柳村G

中白廟H

胡家廟I

山麻柳J

 

求以上圖的最小生成樹:(採用Prim算法)

輸入輸出採用讀取文件的方式:

 

說明: (1)第一行表示有多少個節點

  1. 第二行表示各個節點的名字信息
  2. 接下來是一個10 x 10的矩陣,採用鄰接矩陣的方式存儲節點間的關係

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath> 
#include<limits.h>
#define MAX_VALUE INFINITY
#define MAX_NUM 100
using namespace std;
/*
	計算機科學與技術 1班
	陳珂 
*/

typedef char node_type;
//定義一張圖 
typedef struct matrix{
	node_type vertex[MAX_NUM];   //節點信息
	int arcs[MAX_NUM][MAX_NUM];  //矩陣
	int vertexs, brim;           //節點數,邊數 
} Graph;
//定義Prim樹 
typedef struct matrix1{
	node_type vertex[MAX_NUM];   //節點信息
	int arcs[MAX_NUM][MAX_NUM];  //矩陣
	int vertexs, brim;           //節點數,邊數 
} Prim_tree;

//初始化一個圖
void createGraph(Graph * graph){
	int num;
	int i,j,k;
	char c;
	
	//從文件中進行讀取
	freopen("matrix.txt","r",stdin);
	//節點個數
	cin>>graph->vertexs; 
	
	//輸入節點信息
	for(i=0;i<graph->vertexs;i++){
		cin>>graph->vertex[i];
		getchar();
	}
	//初始化矩陣
	for(i=0;i<graph->vertexs;i++){
		for(j=0;j<graph->vertexs;j++){
			graph->arcs[i][j] = MAX_VALUE;
		}
	}
	graph->brim = 0;
	//更新爲鄰接矩陣
	for(i=0;i<graph->vertexs;i++){
		for(j=0;j<graph->vertexs;j++){
			cin>>num;
			if(num != 0)
				graph->arcs[i][j] = num;
		}
	}
}

//初始化Prim樹
void init_prim(Graph * graph, Graph * prim_tree){
	int i,j;
	
	prim_tree->vertexs = graph->vertexs;
	for(i=0;i<prim_tree->vertexs;i++){
		prim_tree->vertex[i] = graph->vertex[i];
	}
	for(i=0;i<prim_tree->vertexs;i++){
		for(j=0;j<prim_tree->vertexs;j++){
			prim_tree->arcs[i][j] = MAX_VALUE;
		}
	}
} 

//Prim算法
char Prim(Graph * graph, Graph * prim_tree){
	bool visited[graph->vertexs];
	int i,j,k,h;
	int power, power_j, power_k;
	
	for(i=0;i<graph->vertexs;i++)
		visited[i] = false;
	init_prim(graph, prim_tree);
	
	visited[0] = true;
	for(i=0;i<graph->vertexs;i++){
		power = MAX_VALUE;
		for(j=0;j<graph->vertexs;j++){
			if(visited[j]){
				for(k=0;k<graph->vertexs;k++){
					if(power > graph->arcs[j][k] && !visited[k]){
						power = graph->arcs[j][k];
						power_j = j;
						power_k = k;
					}
				}
			}
		}
		// min power
		if(!visited[power_k]){
			visited[power_k] = true;
			prim_tree->arcs[power_j][power_k] = power;
		}
	}
} 

//打印結果
void print(Graph * graph, Graph * prim_tree){
	int i,j;
	int power;
	
	power = MAX_VALUE;
	printf("==========================================================\n"); 
	printf("農村基站建設通過調用Prim算法之後,結果如下:");
	for(i=0;i<prim_tree->vertexs;i++){
		for(j=0;j<prim_tree->vertexs;j++){
			if(prim_tree->arcs[i][j] < power){
				printf("%c->%c\n", prim_tree->vertex[i], prim_tree->vertex[j]);
			}
		}
	}
	printf("==========================================================\n"); 
} 

//主函數 
int main(){
	
	Graph graph;
	Graph prim_tree;
	
	createGraph(&graph);
	Prim(&graph, &prim_tree);
	print(&graph, &prim_tree);
	
	return 0;
}

 

輸入程序運行得到的結果是:

解決問題得到的結果爲:

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