反圈法最小支撑树 matlab,最小支撑树的prim算法(反圈法)c++实现

#include

#include

#include

#define INFINITY 1000

#define max_name 50

#define max_vertex_num 50

typedef char vertex[max_name];//顶点名字串

typedef int adjMatrix[max_vertex_num][max_vertex_num];//邻接距阵

typedef struct

{vertex adjvex; //邻接矩阵

int lowcost;//权值

}close[max_vertex_num];//定义一个结构以便在后面closedge使用

typedef struct//定义图

{

vertex vexs[max_vertex_num]; //顶点集

adjMatrix arcs; //边

int vexnum,arcnum;//点个数,边个数

}MGraph;

int LocateVex(MGraph G,vertex u)//若G中存在顶点u,则返回该点在图中位置;否则返回其他信息;

{

int i;

for(i=0;i

if(strcmp(u,G.vexs[i])==0)

return i;

return 1;

}

void CreateGraph(MGraph &G)

{

int i,j,k,w;

vertex v1,v2;

printf("输入无向图顶点数和边数:\n");

scanf("%d%d",&G.vexnum,&G.arcnum);

printf("输入各顶点的值:\n", G.vexnum);

for(i=0;i

scanf("%s",&G.vexs[i]);

for(i=0;i

for(j=0;j

G.arcs[i][j]=INFINITY;

printf("输入一条边依附的顶点及权值:\n",G.arcnum);//输入一条边依附的顶点及权值

for(k=0;k

{

scanf("%s%s%d",v1,v2,&w);

i=LocateVex(G,v1);//v1在图中位置

j=LocateVex(G,v2);//v2在图中位置

G.arcs[i][j]=G.arcs[j][i]=w; //置于对称弧

}

}

int minimum(close c,MGraph G)//求出下一个节点 第k个顶点

{

int i=0,j,k,min;

min=INFINITY;

//初始化

k=-1;

for(j=0;j<=G.vexnum;j++)//求最小

if(c[j].lowcost0)

{

min=c[j].lowcost;

k=j;

}

return k;

}

void PRIM(MGraph G,vertex u)

{

int i,j,k=0;

close closedge;//一个结构

bool isbreak=false;

k=LocateVex(G,u);//u在图中位置 返回G.vexs[i]中下标

for(j=0;j<=G.vexnum;++j) //辅助数组初始化closedge从O开始

{

if(j!=k)//没有自己到自己的

closedge[k].lowcost=0;

strcpy(closedge[j].adjvex,u);

closedge[j].lowcost=G.arcs[k][j];//列

}

int flag[1000];

flag[0]=0;

int count=1;

for(i=1;i

{

k=minimum(closedge,G);

if(k==-1)

{

isbreak=true;

break;

}

printf("%s-%s%d\n",closedge[k].adjvex,G.vexs[k],G.arcs[k][LocateVex(G,closedge[k].adjvex)]); //输出生成树的边

closedge[k].lowcost=0; //第k个顶点并入U集

flag[count]=k;

count++;

for(j=0;j

if(G.arcs[k][j]

{

strcpy(closedge[j].adjvex,G.vexs[k]);

closedge[j].lowcost=G.arcs[k][j];

}

}

if(isbreak)

{

printf("此图不连通,无最小支撑树 !\n访问过的点为:\n");

for(i=0;i

{

printf("%s",G.vexs[flag[i]]);

}

printf("\n");

}

}

void main()

{

MGraph G;

CreateGraph(G);

printf("最小生成树的各条边为: \n");

PRIM(G,G.vexs[0]);

}

此处給出1个赋权图,用prim算法找出赋权图上的最小树.

1111s1s3325465652441731图1.71

图1结果如下:

注释:图1中有7个点10条边,最后结果输出最小生成树为:

1111s1s3325466524131图1.71

图1最小权值W=5+1+2+3+4+1= 16

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值