(最小生成树计数)Minimum Spanning Tree

本文详细介绍了如何计算最小生成树的数量。首先对边进行排序,然后逐步连接未联通的点,通过维护联通块的祖先信息来避免重复计数。在使用Matrix-Tree定理时,考虑了联通块缩点后的新图邻接矩阵应表示边的数量。通过对每个新联通块计数并累乘,最终得到最小生成树的总数。在整个过程中,还需要不断更新联通块信息以确保正确性。
摘要由CSDN通过智能技术生成

http://acm.hdu.edu.cn/showproblem.php?pid=4408

将E中的所有边按照权值由小到大进行排序,然后按照从小到大的顺序去扫描每一条边,将未联通的点联通,权值累加,最后得到的图G’就是图G的最小生成树。将所有权值相同的边看成一个阶段整体处理,这一阶段生成树个数和下一阶段是独立的。
我们将求最小生成树所用的祖先存入father数组,将联通块的祖先存进U数组(相当于联通块缩成点)。用vis[i]=1标记联通块的祖先。用link[i][j]表示两个原本独立的联通块(祖先分别是i和j)的联通分量的度(连通的边数)。
在用Matrix-Tree时,邻接矩阵A[i][j]是vi和vj之间的边数,而不是1或0.
对于加入相同权值same后的新图可能会形成多个联通块,这时需要对每个联通块计数。找到每个联通块的祖先,将属于这个祖先的点计算。
• 确定祖先和该联通块的所有点
首先寻找的联通块应该含有新加进来的边,否则如果该联通块和未加边的联通块(上一阶段)完全一样,那就重复计数了。所以在加边时用vis数组记录father数组中的祖先是否被访问,如果被访问那么将属于这个联通块的所有点看作一个点,添加进新图的联通块,将新图的联通块的每个点都存入祖先的数组vec中。
• 确定联通块内的点与点是否直接联通和每个点的度数
枚举每个新图的联通块的祖先,在Matrix-Tree定理中,图G的邻接矩阵A[G]被定义为:当vi和vj直接相连时A[i][j]=1,否则A[i][j]&#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最小生成树(Minimum Spanning Tree, MST) 是一种用于寻找连通图中的最小权重生成树的算法。可以使用Matlab中的minspantree()函数来求解最小生成树。首先,需要定义一个边权矩阵,其中每一列表示一条边,从上到下分别为两个顶点以及它们边的权值。然后,使用sortrows函数对边权矩阵的第三列进行排序,得到排序后的边权矩阵。接下来,使用循环遍历每条边,判断当前边连接的两个顶点是否在同一个集合中,如果不在同一个集合中,则将该边加入最小生成树中,并更新顶点集合的标记。最终,得到最小生成树的边集合和总长度。以下是用Matlab代码实现最小生成树的示例: ```matlab % 边权矩阵,每一列都表示一条边,从上到下分别为两个顶点以及它们边的权值 b = [1 1 1 2 2 3 3 4; 2 4 5 3 5 4 5 5; 8 1 5 6 7 9 10 3]; % 对边权矩阵按权值进行排序 [B, i = sortrows(b', 3); B = B'; % 边的条数和点的个数 m = size(b, 2); n = 5; % t数组用来标记选中的边,k用来计数,T矩阵用来存储选中的边,c计算最小生成树的总长度 t = 1:n; k = 0; T = []; c = 0; for i = 1:m if t(B(1, i)) ~= t(B(2, i)) k = k + 1; T(k, 1:2) = B(1:2, i); c = c + B(3, i); tmin = min(t(B(1, i)), t(B(2, i))); tmax = max(t(B(1, i)), t(B(2, i))); for j = 1:n if t(j) == tmax t(j) = tmin; end end end if k == n - 1 break; end end T % 输出最小生成树的边集合 c % 输出最小生成树的总长度 ``` 这段代码将输出最小生成树的边集合和总长度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MATLAB 最小生成树](https://blog.csdn.net/qq_63585949/article/details/128908785)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [最小生成树matlab求解](https://blog.csdn.net/Planck_meteora/article/details/123342485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【MATLAB】最小生成树Kruskal算法](https://blog.csdn.net/weixin_46308081/article/details/119202910)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值