#include<stdio.h>
#define MaxInt 100 //表示极大值100
#define MVNum 100 //最大顶点数100
typedef struct
{
char vexs[MVNum]; //顶点表
int arcs[MVNum][MVNum]; //邻接矩阵
int vexnum,arcnum; //图的当前点数和边数
}AMGraph;
int LocateVex(AMGraph *G,char v) //定位节点位置函数
{
int i,w=-1;
for(i=0;ivexnum;i++)
if(v==G->vexs[i])
{
w=i;
break;
}
return w;
}
void CreateUDN(AMGraph *G) //构造无向图函数 参考p155页
{
int i,j,k,w;
char v1,v2;
G->vexnum=8,G->arcnum=14; //图的点数为8,边数为14
strcpy(G->vexs,"abcdefgh");
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
G->arcs[i][j]=MaxInt;
printf("输入一条边依附的顶点及权值\n");
for(k=0;karcnum;k++)
{
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];
}
}
struct{ //创造输出最小边上的权值函数
char adjvex;
int lowcost;
}closedge[MVNum];
int Min(int n)
{
int min,i;
for (i=0;i<n;i++)
{
if(closedge[i].lowcost!=0)
{
min=i;
break;
}
}
for(i=0;i<n;i++)
{
if(closedge[i]. lowcost!=0&&closedge[i].lowcost<closedge[min].lowcost)
min=i;
}
return min;
}
void MiniSpanTree Prim(AMGraph* G,char u)
{
int i,j,k,a,b;
char u0, v0;
k=LocateVex(G,u);
for(j=0; j<G->vexnum;j++){
if(j!=k)
{
closedge[j].adivex=u;
closedge[j].lowcost=G->arcs[k][j];
}
}
closedge[k].lowcost=0;
printf("最小生成树的各条边分别为:\n");
for(i=l,i<G->vexnum;i++) {
k=Min(G->vexnum);
u0=closedge[k],adivex;
v0=G->vexs[k];
a=LocateVex(G,u0);
b=LocateVex(G,v0);
printf("%d",G->arcs[a][b]);
closedge[k],lowcost=0;
for(j=0;j<G->vexnum;j++)
{
if(G->arcs[k][j]<closedge[j].lowcost)
{
closedge[j].adjvex=G->vexs[k];
closedge[j].lowcost=G->arcs[k][j];
}
}
}
printf("\n");
}
int main()
{
AMGraph G;
G=(AMGraph)malloc(sizeof(AMGraph));
GreateUDN(G);
MiniSpanTree Prim(G,'a');
return 0;
}
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。