最小生成树(普利姆算法)

源代码:
#include<stdio.h>
#include<stdlib.h>
#define MVNum 100 //最大顶点数
#define INFINITY 32767 //表示权值很大,意味着两个顶点之间没有连接
typedef char VerTexType; //定义数据类型
typedef int ArcType;
typedef struct
{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum];//邻接矩阵
int vexnum,arcnum; //网的点数和边数
}AMGraph;
int LocateVex(AMGraph G,char v)//确定V在G中的位置
{
int i;
for(i = 0; i < G.vexnum; i++)
{
if(G.vexs[i] == v) //如果找到,返回其序号
break;
}
return i;
}
int CreateUDN(AMGraph &G)
{
int v1,v2,w,i,j;
printf(“请输入总顶点数和总边数:”);
scanf("%d %d",&G.vexnum,&G.arcnum);
printf(“请输入点的信息:\n”);
getchar();
for(i = 0; i < G.vexnum; i++)
scanf(" %c",&G.vexs[i]);
for(i = 0; i < G.vexnum; i++) //初始化邻接矩阵
for(j = 0; j < G.vexnum; j++)
G.arcs[i][j] = INFINITY;
for(int k = 0; k < G.arcnum; k++)//构造邻接矩阵
{
printf(“请输入一条边(第%d条边)连接的两个顶点以及权值:”,k+1);
scanf(" %c %c %d",&v1,&v2,&w);//输入一条边依附的顶点及权值
i = LocateVex(G,v1);
j = LocateVex(G,v2);
G.arcs[i][j] = w; //设置权值
G.arcs[j][i] = G.arcs[i][j];//根据对称构造另一半
}
return 0;
}
void prime(AMGraph G) {
int k,i,j,min;
int mst[MVNum];
int lowcost[MVNum];
lowcost[0] = 0; //当lowcost[i]=0说明以i为终点的边的最小权值为0
mst[0] = 0;
for (i = 1; i < G.vexnum; i++)
{
lowcost[i] = G.arcs[0][i]; //初始化lowcost为邻接矩阵第一行的权值
mst[i] = 0; //mst全部存放下标为0的顶点
}
for (i = 1; i < G.vexnum; i++)
{
min = INFINITY; //最小值先初始化为32767,代表无连接
k = 0; //k为权值最小的边的终点
for(j = 1;j < G.vexnum;j++) //找到第i行权值最小的边,记录终点的下标
{
if (lowcost[j]!=0 && lowcost[j]<min)
{
min = lowcost[j];
k = j;
}
}
lowcost[k] = 0;
printf("( %c, %c)", G.vexs[mst[k]],G.vexs[k]); //打印当前顶点中权值最小的边
for ( j = 1; j < G.vexnum; j++) //遍历第k行的所有权值
{
if (lowcost[j] != 0 && G.arcs[k][j] < lowcost[j])
{
lowcost[j] = G.arcs[k][j];
mst[j] = k;
}
}
}
}
int main()
{
AMGraph G;
CreateUDN(G);
prime(G);
return 0;
}
运行例图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值