Prim算法实现最小生成树问题(C++语言)

Prim算法实现最小生成树问题(C++语言)_第1张图片

塔坪村A

上白庙B

如意村C

上云村D

双塘村E

碑子岩F

杨柳村G

中白庙H

胡家庙I

山麻柳J

 

求以上图的最小生成树:(采用Prim算法)

输入输出采用读取文件的方式:

Prim算法实现最小生成树问题(C++语言)_第2张图片

 

说明: (1)第一行表示有多少个节点

  1. 第二行表示各个节点的名字信息
  2. 接下来是一个10 x 10的矩阵,采用邻接矩阵的方式存储节点间的关系

 

#include
#include
#include
#include 
#include
#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;ivertexs;i++){
		cin>>graph->vertex[i];
		getchar();
	}
	//初始化矩阵
	for(i=0;ivertexs;i++){
		for(j=0;jvertexs;j++){
			graph->arcs[i][j] = MAX_VALUE;
		}
	}
	graph->brim = 0;
	//更新为邻接矩阵
	for(i=0;ivertexs;i++){
		for(j=0;jvertexs;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;ivertexs;i++){
		prim_tree->vertex[i] = graph->vertex[i];
	}
	for(i=0;ivertexs;i++){
		for(j=0;jvertexs;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;ivertexs;i++)
		visited[i] = false;
	init_prim(graph, prim_tree);
	
	visited[0] = true;
	for(i=0;ivertexs;i++){
		power = MAX_VALUE;
		for(j=0;jvertexs;j++){
			if(visited[j]){
				for(k=0;kvertexs;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;ivertexs;i++){
		for(j=0;jvertexs;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;
}

 

输入程序运行得到的结果是:

Prim算法实现最小生成树问题(C++语言)_第3张图片

解决问题得到的结果为:

Prim算法实现最小生成树问题(C++语言)_第4张图片

你可能感兴趣的:(CS,人工智能,论文)