破圈法求最小支撑树matlab_我们可用“破圈法”求解带权连通无向图的一棵最小代价生成树。所...

[

题目分析]连通图的生成树包括图中的全部n个顶点和足以使图连通的n-1条边,最小生成树是边上权值之和最小的生成树。故可按权值从大到小对边进行排序,然后从大到小将边删除。每删除一条当前权值最大的边后,就去测试图是否仍连通,若不再连通,则将该边恢复。若仍连通,继续向下删;直到剩n-1条边为止。

void

SpnTree (AdjList g)

//用“破圈法”求解带权连通无向图的一棵最小代价生成树。{typedef struct {int i,j,w}node; //设顶点信息就是顶点编号,权是整型数 node

edge[];

scanf( "%d%d",&e,&n) ;

//输入边数和顶点数。      for (i=1;i<=e;i++)     //输入e条边:顶点,权值。         scanf("%d%d%d" ,&edge[i].i

,&edge[i].j ,&edge[i].w);

for (i=2;i<=e;i++)    //按边上的权值大小,对边进行逆序排序。       {edge[0]=edge[i];

j=i-1;

while

(edge[j].w

edge[j+1]=edge[j--];edge[j+1]=edge[0]; }//for

k=1;

eg=e;

while (eg>=n)       //破圈,直到边数e=n-1.         {if (connect(k))  //删除第k条边若仍连通。            {edge[k].w=0;

eg--; }//测试下一条边edge[k],权值置0表示该边被删除k++;  //下条边         }//while

}//算法结束。

connect()是测试图是否连通的函数,可用图的遍历实现,若是连通图,一次进入dfs或bfs就可遍历完全部结点,否则,因为删除该边而使原连通图成为两个连通分量时,该边不应删除。前面第17,18题就是测连通分量个数的算法,请参考。“破圈”结束后,可输出edge中w不为0的n-1条边。限于篇幅,这些算法不再写出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值