#include<iostream>
#include<string.h>
#include<string>
#include<malloc.h>
#include<iomanip>
typedef char ver[4];
typedef int vr;
#define INF 10000
#define max 50
using 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; //该点到该点的距离为0
cout<<"无向图的最小生成树的各条边分别是:"<<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 6
A D 7
A E 12
E B 9
E D 5
B C 8
E C 4
C D 6
*/
c++版本的prim算法最小生成树
最新推荐文章于 2024-08-23 18:39:12 发布