MST中求任意两点条路径上的最长边…

这篇博客探讨了如何使用Kruskal算法找到最小生成树(MST)中任意两点间的最长边和最短边。通过调整Kruskal算法,当合并两棵树时,可以计算路径上的最大和最小边。对于最长边,当边不在MST中时,加入的边即为最长边;对于最短边,若边不在同一树上,则最短边是两棵树上路径的最小值。
摘要由CSDN通过智能技术生成
1、MST任意两点路径上的最长边
    这其实是在求次小生成树 , 因为我们可以知道 , 次小生成树和最小生成树之间只有一条边不一样 , 因此我们只需要枚举不在最小生成树中边 , 同时我也要求出该两点在最小生成树中之间的路径中的最长边的值。

解法:我们用kruskal算法来求出最小生成树 , 对于kruskal算法 , 当我们要加入一条边时 , 实际上是在把两颗“树”合并 , 那么从这两颗树上各去除一个点 , 则这两点路径之间的最大边 , 就是当前加入的这条边,因此我们只需要记录每颗树就行了 , 对于每颗树我们可以用邻接表(数组模拟)来存 。

代码:
int kruskal()
{
      sort(edge , edge+m , cmp); //对边进行排序

      int i , x , y , g , h , k = 0;
      int sum = 0;

      for(i = 0; i < n; i++) //先把每个点都看成是一颗树
      {
            link[i].x = i+1;
            link[i].next = head[i+1];
            end[i+1] = i;
            head[i+1] = i;
      }

      for(i = 0; ; i++)
      {
            if(k == n-1)  break;
            x = find(edge[i].x); // 判断这两个点是不是在同一颗树上
            y = find(edge[i].y);

            if(x != y)
            {
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值