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

#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














*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值