C++ Prim算法
来源:互联网 发布:张大奕淘宝店叫啥 编辑:程序博客网 时间:2024/06/07 10:53
Prim算法用于在加权连通图中搜索最小生成树,即搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。中心思想就是用1个数组存放父节点的index,以记录表示整个树形态,另外个数组用于存放权值,先将起始点对每个顶点权值写入,无连接用infinite表示,选出权值最小的点,并且在数组中将这个点置为0,然后用这个最小点到各点的权值比较数组中存放的权值,如果更小(0排除在外),则覆盖写入,并且存放父节点index,重复这个过程即可
代码实现:
#include<iostream>#define MAX_VERTEX 100#define INFINITE 65535using namespace std;//array char vertex_infos[MAX_VERTEX];int matrix[MAX_VERTEX][MAX_VERTEX];//list struct Side{ int index; int weight; Side* next;}; struct Vertex{ char data; Side* first; }; typedef Vertex AdjList[MAX_VERTEX]; struct AdjGraph { AdjList adjlist; int num_vertex; int num_side; }; //commonint weight_array[MAX_VERTEX];int vertex_parent[MAX_VERTEX];int main(){ for(int i=0;i<MAX_VERTEX;i++){ vertex_parent[i]=0; weight_array[i]=INFINITE; }//array /*for(int i=0;i<MAX_VERTEX;i++){ vertex_infos[i]=0; for(int j=0;j<MAX_VERTEX;j++){ matrix[i][j]=INFINITE; matrix[i][j]=INFINITE; } } cout<<"input vertex and side nums:"; int num_vertex; int num_side; cin>>num_vertex>>num_side; cout<<"input vertex char data:"; for(int i=0;i<num_vertex;i++){ cin>>vertex_infos[i]; } for(int i=0;i<num_side;i++){ int v1; int v2; int weight; cout<<"input two vertex:"; cin>>v1>>v2; cout<<"input weight:"; cin>>weight; matrix[v1][v2]=weight; matrix[v2][v1]=weight; } //start from v0 for(int i=1;i<MAX_VERTEX;i++){ if(vertex_infos[i]==0){ break; } weight_array[i]=matrix[0][i]; } for(int i=1;i<MAX_VERTEX;i++){ if(vertex_infos[i]==0){ break; } int k=0;int min=INFINITE;for(int j=1;j<MAX_VERTEX;j++){if(weight_array[j]!=0&&weight_array[j]<min){min=weight_array[j];k=j;}}weight_array[k]=0;for(int j=1;j<MAX_VERTEX;j++){if(weight_array[j]!=0&&matrix[k][j]<weight_array[j]){weight_array[j]=matrix[k][j];vertex_parent[j]=k;}} } for(int i=0;i<MAX_VERTEX;i++){ if(vertex_infos[i]==0){ break; } cout<<vertex_parent[i]; } cout<<endl;*/ //list AdjGraph adjGraph; for(int i=0;i<MAX_VERTEX;i++){ adjGraph.adjlist[i].data=0; adjGraph.adjlist[i].first=0; } cout<<"input vertex and side nums:"; cin>>adjGraph.num_vertex>>adjGraph.num_side; cout<<"input vertex char data:"; for(int i=0;i<adjGraph.num_vertex;i++){ cin>>adjGraph.adjlist[i].data; } for(int i=0;i<adjGraph.num_side;i++){ int v1; int v2; int weight; cout<<"input two vertex:"; cin>>v1>>v2; cout<<"input weight:"; cin>>weight; Side* side1=new Side(); side1->index=v2; side1->weight=weight; Side* side2=new Side(); side2->index=v1; side2->weight=weight; if(adjGraph.adjlist[v1].first==0){ adjGraph.adjlist[v1].first=side1; } else{ Side* temp=adjGraph.adjlist[v1].first; adjGraph.adjlist[v1].first=side1; side1->next=temp; } if(adjGraph.adjlist[v2].first==0){ adjGraph.adjlist[v2].first=side2; } else{ Side* temp=adjGraph.adjlist[v2].first; adjGraph.adjlist[v2].first=side2; side2->next=temp; } } Side* p=adjGraph.adjlist[0].first;while(p!=0){if(p->weight<weight_array[p->index]){weight_array[p->index]=p->weight;}p=p->next;}weight_array[0]=0;for(int i=1;i<MAX_VERTEX;i++){if(adjGraph.adjlist[i].data==0){break;}int k=0;int min=INFINITE;for(int j=1;j<MAX_VERTEX;j++){if(weight_array[j]!=0&&weight_array[j]<min){min=weight_array[j];k=j;}}weight_array[k]=0;p=adjGraph.adjlist[k].first;while(p!=0){if(p->weight<weight_array[p->index]){weight_array[p->index]=p->weight;vertex_parent[p->index]=k;}p=p->next;}} for(int i=0;i<MAX_VERTEX;i++){ if(adjGraph.adjlist[i].data==0){break;} cout<<vertex_parent[i]; } cout<<endl;return 0;}
0 0
- Prim算法C语言实现
- 数据结构与算法(c++)--prim算法
- 最小生成树Prim算法C语言
- c语言之普利姆算法(prim)
- Prim算法(一)之 C语言详解
- [c]HDOJ 1102 prim算法的应用
- 邻接表实现PRIM算法(C++)
- Prim最小生成树算法(C++)
- Prim算法的C语言程序
- Prim算法的C语言程序
- prim 算法
- Prim算法
- Prim算法
- prim算法
- Prim算法
- Prim算法。
- Prim 算法
- Prim算法
- ORACLE复制表及数据
- 网络编程
- Azure IoT 技术研究系列2
- 500 G JAVA视频网盘分享(JEECG开源社区)
- 技术-Mac下ssh远程登录与scp文件传输
- C++ Prim算法
- 事务,索引,连接查询,权限设计(面试问题)
- QT5 读取中文文件&设置中文标题
- sqlserver2008压缩日志文件语句
- 【Redis笔记-3】Redis数据类型
- el表达式获取list数据报错:java.lang.NumberFormatException: For input string: "xxx"
- ffmpeg常用命令
- ElasticJob详解
- leetcode-491. Increasing Subsequences