c++版本的prim算法最小生成树

来源:互联网 发布:时标网络图 软件 编辑:程序博客网 时间:2024/06/11 18:34
#include<iostream>#include<string.h>#include<string>#include<malloc.h>#include<iomanip>typedef char ver[4];typedef int vr;#define INF 10000#define max 50using namespace std;typedef struct//{vr adj;}arcnode,adjmat[max][max];typedef struct{ver vex[max]; //存顶点数的数组adjmat arc;  //邻接矩阵int vexnum,arcnum;}mgraph;typedef struct{ver adjvex;vr lowcost;}closeedge[max];int locate(mgraph n,ver v){int i;for(i=0;i<n.vexnum;i++)if(strcmp(n.vex[i],v)==0)return i;return -1;}void creategraph(mgraph *n)  //用邻接矩阵的方法创建矩阵{int i,j,k,w,len;char s[max];ver v1,v2; //顶点cout<<"请输入无向图的n的顶点数 弧数:"<<endl;cin>>(*n).vexnum>>(*n).arcnum;cout<<"请输入n个顶点的值:"<<endl;for(i=0;i<n->vexnum;i++)cin>>n->vex[i];for(i=0;i<n->vexnum;i++)for(j=0;j<n->vexnum;j++)n->arc[i][j].adj=INF; //邻接表初始化为大值cout<<"请输入n条弧的弧尾 弧头 权值:"<<endl;for(k=0;k<n->arcnum;k++){cin>>v1>>v2>>w; //输入两个顶点 以及顶点之间的距离i=locate(*n,v1);j=locate(*n,v2);n->arc[i][j].adj=n->arc[i][j].adj=w;}}/*int mininum(mgraph g) //返回当前表中的最小lowcost的值的序号{closeedge edge;int i=0,j,k,min;while(!edge[i].lowcost)i++;min=edge[i].lowcost;k=i;for(j=i+1;j<g.vexnum;j++)if(edge[j].lowcost>0&&edge[j].lowcost<min){k=j;min=edge[j].lowcost;}return k;}*/void prim(mgraph g,ver u){int i,j,k;closeedge closedge;k=locate(g,u);  //找到该点对应的下标for(j=0;j<g.vexnum;j++){strcpy(closedge[j].adjvex,u);//将表的顶点域更新为当前序号的值closedge[j].lowcost=g.arc[k][j].adj;  //将该点到邻接表的每一个的距离都更新到这个表上}closedge[k].lowcost=0; //该点到该点的距离为0cout<<"无向图的最小生成树的各条边分别是:"<<endl;for(i=1;i<g.vexnum;i++){//k=mininum(g); //找到当前表中的最小lowcost 距离int X=0,Z,min;while(!closedge[X].lowcost)X++;min=closedge[X].lowcost;k=X;for(Z=X+1;Z<g.vexnum;Z++)if(closedge[Z].lowcost>0&&closedge[Z].lowcost<min){k=Z;min=closedge[Z].lowcost;}cout<<closedge[k].adjvex<<"->"<<g.vex[k]<<endl;closedge[k].lowcost=0;//该顶点放入集合中for(j=0;j<g.vexnum;j++)if(g.arc[k][j].adj<closedge[j].lowcost){strcpy(closedge[j].adjvex,g.vex[k]);//顶点域的跟新closedge[j].lowcost=g.arc[k][j].adj;//最小距离的更新}}}void displaygraph(mgraph n)//用邻接矩阵储存表示的图{int i,j;cout<<"无向网一共有n个顶点n条弧,顶点依次是:"<<endl;for(i=0;i<n.vexnum;i++)cout<<setw(8)<<n.vex[i];cout<<endl<<"序号i=";for(i=0;i<n.vexnum;i++)cout<<setw(8)<<i;cout<<endl;for(i=0;i<n.vexnum;i++){cout<<setw(8)<<i;for(j=0;j<n.vexnum;j++)cout<<setw(8)<<n.arc[i][j].adj;cout<<endl;}}int main(){mgraph n;cout<<"创建一个无向网:"<<endl;creategraph(&n);displaygraph(n);char a[4]="A";prim(n,a);}/*A B 6A D 7A E 12E B 9E D 5B C 8E C 4C D 6*/

原创粉丝点击