塔坪村A
上白廟B
如意村C
上雲村D
雙塘村E
碑子巖F
楊柳村G
中白廟H
胡家廟I
山麻柳J
求以上圖的最小生成樹:(採用Prim算法)
輸入輸出採用讀取文件的方式:
說明: (1)第一行表示有多少個節點
- 第二行表示各個節點的名字信息
- 接下來是一個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;
}
輸入程序運行得到的結果是:
解決問題得到的結果爲: