破圈法求最小支撑树matlab_破圈法求最小生成树

该程序展示了如何用破圈法在MATLAB环境下创建一个最小生成树。通过创建邻接矩阵、初始化顶点度并逐步删除边来找出最小支撑树。程序以一个6节点图为例,详细地进行边的删除操作,并输出最终的删除边结果。
摘要由CSDN通过智能技术生成

#include&ltiostream&gt

using namespace std;

#define maxvertex 6

typedef char vertextype;

typedef int weighttype;

weighttype del[maxvertex][maxvertex]={{0}};

typedef struct

{

weighttype matrix[maxvertex][maxvertex];//存储图中各顶点间边的权重值的二维数组

vertextype vertype[maxvertex];//存储图中顶点信息的一维数组

int vertex; //图中的顶点数

}Adjmatrix;

void creategraph(Adjmatrix *G,vertextype v[],weighttype w[][maxvertex],int n)

{

int i,j;

G-&gtvertex=n;

for(i=0;i&ltn;i++)

{

G-&gtvertype[i]=v[i];

for(j=0;j&ltn;j++)

{

G-&gtmatrix[i][j]=w[i][j];

}

}

}

void tree(Adjmatrix * G)

{

int i=0,j=0;

Adjmatrix *R,u;

R=&u;

R-&gtvertex=G-&gtvertex;

for(i=0;i&ltR-&gtvertex;i++)

{

R-&gtvertype[i]=G-&gtvertype[i];

for(j=0;j&ltR-&gtvertex;j++)

{

R-&gtmatrix[i][j]=G-&gtmatrix[i][j];

}

}

//*******************************************************

int du[maxvertex];//存储图中顶点的度的一维数组

for(i=0;i&ltR-&gtvertex;i++)

{

du[i]=0;//初始化图中各顶点的度为0

}

for(i=0;i&ltR-&gtvertex;i++)

{

for(j=0;j&ltR-&gtvertex;j++)

{

if(R-&gtmatrix[i][j]!=0)

du[i]=du[i]+2;

}

}

//******************************************

int k=R-&gtvertex,f=1;

while(f==1)

{

f=0;

for(i=0;i&ltk;i++)

{

if(du[i]&lt4&&R-&gtvertype[i]!='#')

{

R-&gtvertype[i]='#';

for(j=0;j&ltk;j++)

{

if(R-&gtmatrix [i][j]!=0)

{

du[j]--;

R-&gtmatrix [i][j]=0;

}

if(R-&gtmatrix [j][i]!=0)

{

R-&gtmatrix [j][i]=0;

du[j]--;

}

}

}

}

//**********************************************

int max=0,t=0,y=0;

for(i=0;i&ltk;i++)

{

for(j=0;j&ltk;j++)

{

if(R-&gtmatrix [i][j]&gtmax)

{

max=R-&gtmatrix [i][j];

t=i; y=j;

}

}

}

del[t][y]=R-&gtmatrix[t][y];

R-&gtmatrix[t][y]=0; R-&gtmatrix[y][t]=0;

du[t]=du[t]-2; du[y]=du[y]-2;

for(i=0;i&ltk;i++)

{

if(R-&gtvertype [i]!='#')f=1;

}

}

}

int main()

{

Adjmatrix *G,p;

G=&p;

vertextype v[6]={'A','B','C','D','E','F'};

weighttype w[6][6]={{0,6,1,5,0,0 },{6,0,5,0,3,0},{1,5,0,5,6,4},{5,0,5,0,0,2},{0,3,6,0,0,6},{0,0,4,2,6,0}};

creategraph(G,v,w,6);

tree(G);

cout&lt&lt"删除的边是:"&lt&ltendl;

for(int i=0;i&ltG-&gtvertex ;i++)

{

for(int j=0;j&ltG-&gtvertex;j++)

{

if(del[i][j]!=0)

cout&lt&ltG-&gtvertype[i]&lt&lt'-'&lt&ltG-&gtvertype[j]&lt&lt' ';

}

cout&lt&ltendl;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值