#include <stdio.h>
#define max 100
#define mc 10000000
#define false -1
typedef struct{ //定义图
char vex[max];
int arc[max][max];
int vexnum,arcnum;
}AmGraph;
int locatedv(AmGraph G,char a) //输入的顶点找到位置
{
int i=0;
for(i=1;i<=G.vexnum;i++)
{
if(a==G.vex[i])
return i;
}
return false;
}
void creatG(AmGraph &G) //创建图
{ int i,num,x,y,j;
char a,b;
printf("请输入顶点数和边数:");
scanf("%d%d",&G.vexnum ,&G.arcnum);
getchar();
for(i=0;i<=G.vexnum;i++) //对矩阵进行初始化
for(j=0;j<=G.vexnum;j++)
G.arc[i][j]=mc;
printf("请输入顶点:");
for(i=1;i<=G.vexnum;i++)
{scanf("%c",&G.vex[i]);
getchar();
}
printf("请输入边以及权重:");
for(i=1;i<=G.arcnum;i++)
{ scanf("%c",&a);
getchar();
scanf("%c%d",&b,&num);
getchar();
x=locatedv(G,a);
y=locatedv(G,b);
G.arc[x][y]=num; //无向图
G.arc[y][x]=num;
}
return ;
}
void MainTree_prim(AmGraph G) //最小生成树--prim
{
int min,i,j,k;
int lowcost[max],mst[max]; //lowcost用来记录权重,mst记录边的两个顶点
lowcost[1]=0;//从第一个点出发,已经被选中标为0
mst[1]=0; //自身被选中权重为零
for(i=2;i<=G.vexnum;i++) //在选中第一个点的前提下,找到其他点到该点的权重
{
lowcost[i]=G.arc[1][i];//如果两点有权重则赋值,没有则给mc
mst[i]=1;//与第一个点有关
}
for(i=1;i<G.vexnum;i++)
{
min=mc; //最小值
j=2;//已经从第一个开始了,下面的就从第二个开始
while(j<=G.vexnum) //找到与最小生成树相关的最小的权重
{
if(lowcost[j]!=0&&lowcost[j]<min)//为0则表示已经加入最小生成树
{
min=lowcost[j]; //更新最小值
k=j; //保存最小值的位置,下一个就找关于k的边
}
j++;
}
lowcost[k]=0;
printf("%c %c %d\n",G.vex[mst[k]],G.vex[k],min); //输出边
for(j=2;j<=G.vexnum;j++) //更新关于k点的lowcost以及mst
{
if(lowcost[j]>G.arc[k][j]&&lowcost[j]!=0)
{
lowcost[j]=G.arc[k][j];
mst[j]=k;
}
}
}
return ;
}
int main()
{
AmGraph G;
creatG(G);
printf("最小生成树的各边为:");
MainTree_prim(G);
return 0;
}
最小生成树——c语言
最新推荐文章于 2022-11-14 16:11:39 发布