c++ 最小生成树之prim算法

来源:互联网 发布:治疗法术升级数据 编辑:程序博客网 时间:2024/06/03 17:53
//最小生成树#include <iostream>#include <stdio.h>#include <queue>using namespace std;#define MAX_LINE 7char tree[MAX_LINE][MAX_LINE]={{-1, 7, -1, 5, -1, -1, -1},{7, -1,  8, 9,  7, -1, -1},{-1, 8, -1, -1, 5, -1, -1},{5,  9, -1, -1, 15, 6, -1},{-1, 7,  5, 15, -1, 8, 9},{-1,-1, -1,  6,  8,-1, 11},{-1,-1, -1, -1,  9,11, -1}};typedef struct {char row;char col;} Line;Line lines[MAX_LINE*MAX_LINE];void prim();char visit[MAX_LINE];//存储访问过的节点char unvisited[MAX_LINE];//存储未被访问过的节点char visitIndex,unvisitedIndex,linesIndex;void init(){//do something initvisitIndex=0;unvisitedIndex=0;linesIndex = 0;char i;//初始化未被访问节点for(i = 0;i<MAX_LINE;i++){visit[i] = i;unvisited[i] = i;}}int main(){init();cout<<"prim算法最小生成树"<<endl;prim();getchar();return 0;}//prim最小生成树void prim(){visit[visitIndex++] = 0;//将0节点放入访问数组unvisited[0] = -1;char i = 0,j,min;char row,col,sum = 0;Line tmpLine;while(visitIndex<MAX_LINE){min = 20;for(i = 0;i<visitIndex;i++){row = visit[i];//选出x//寻找最小yfor(j = 0;j<MAX_LINE;j++){if(unvisited[j] == -1)continue;col = unvisited[j];if(tree[row][col] == -1)continue;if(tree[row][col] < min){min = tree[row][col];tmpLine.row = row;tmpLine.col = col;}}}//找到最小minlines[linesIndex++] = tmpLine;visit[visitIndex++] = tmpLine.col;unvisited[tmpLine.col] = -1;sum+=min;}//打印path和sumfor(i = 0;i<linesIndex;i++)printf("<%d,%d>\n",lines[i].row,lines[i].col);printf("total num is %d\n",sum);}

0 0
原创粉丝点击