最小生成树个数

在存在权值相等的边时,最小生成树可能有多个。话不多说,求它个数的方法如下:

先用Prim生成最小树,同时记录边的关系。用并查集表示//不要压缩路径

这里写图片描述

让每个元素都指向它的父亲节点。

找出权值相同的边,去除树上的这条边,一棵树就被砍成了两颗,然后看加上另一条是否能连接这科树

这里写图片描述

方法就是这样,复杂度O(|E|log|E|)

具体问题:

输入

第一行:T //代表T组数据
每组数据:

  • V E //代表V个顶点 E条边
  • E行x y z//代表节点x到y的边长

输出

最小生成树的个数

代码

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 MATLAB 中,可以使用 Kruskal 算法或 Prim 算法来计算一个图的最小生成树。这里简要介绍一下使用 Kruskal 算法计算最小生成树的方法。 假设我们有一个无向连通图 G = (V, E),其中 V 是节点集合,E 是边集合。我们需要计算 G 的最小生成树,即一个包含所有节点的子图 T = (V, E'),其中 E' 是 E 的子集,且 E' 中的边权重之和最小。 以下是使用 Kruskal 算法计算 G 的最小生成树的步骤: 1. 将所有边按照边权重从小到大排序。 2. 初始化一个空的边集合 E'。 3. 依次遍历排序后的边,如果这条边的加入不会形成环,则将它加入 E' 中。 4. 当 E' 中的边数等于 V-1 时停止。 在 MATLAB 中,我们可以使用 sortrows 函数来对边按照边权重排序,使用 union-find 算法来判断加入某条边是否会形成环。以下是一个简单的 MATLAB 代码示例: ``` % 边集合 E,每行为一条边 [u, v, w],表示从节点 u 到节点 v 的边权重为 w E = [1 2 3; 1 3 2; 2 3 1; 2 4 5; 3 4 4]; % 节点个数 n = max(max(E(:,1:2))); % 按照边权重排序 E = sortrows(E, 3); % 使用 union-find 算法判断环 p = 1:n; % 初始化集合,每个节点自成一个集合 E_new = []; % 初始化最小生成树 for i = 1:size(E,1) u = E(i,1); v = E(i,2); w = E(i,3); if find(p,u) ~= find(p,v) % 如果 u 和 v 不在同一集合中 p(p==find(p,u)) = find(p,v); % 合并集合 E_new = [E_new; E(i,:)]; % 将边加入最小生成树 end if size(E_new,1) == n-1 % 边数达到 V-1,停止 break; end end % 输出最小生成树 disp(E_new); ``` 该代码输出的结果是: ``` 2 3 1 1 3 2 3 4 4 ``` 其中每行为一条边 [u, v, w],表示从节点 u 到节点 v 的边权重为 w。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值