ACM图论—最小环问题 ( 仔细分析+理解+代码 )(HDU 1599 ) (POJ 1743)

说明:如果发现错误或者有任何问题,任何不理解的地方请评论提出,或私信me,^ _ ^

ACM—图论 最小环问题(Floyd算法应用)


最小环问题是Floyd算法的应用,并不难,和Floyd算法一样难度。但是如果要输出最小环路径就要稍微麻烦一点,也不难。

1.计算最小环值(HDU 1599)
  1. 有向图最小环:

    有向图最小环最少要有2个点组成环,这个的写法就是用Floyd()求最短距离,最后所有点中的最短距离的最小值就是答案。

  2. 无向图最小环

    肯定和有向环做法有区别,无向图构成环最少要有3个点,所以求最小环可以枚举最大环中的连接点,更新答案。(这里的最大环指的是环中的节点尽可能的多,同时在枚举增加环中点的同时也要使环上边权值最小) ,这里如果不懂可能是我描述问题,实际上不难,请继续看下面的部分会明白的。

    (1)和Floyd()关系:

    的你肯定好奇这和Floyd()有什么关系?其实仔细想想Folyd()中要遍历所有点作为k点,而我们给最小环中加点是也是遍历所有点去考虑要不要添加这个点,同时我们更新ans时要用到两点间的最短距离dis[i] [j](这个下面会说),所以我们完全可以将更新ans的步骤放在Folyd()的经典的3次循环中。

    (2) 如何更新ans:

    这里直接从开始讲不太容易说明,所以我们先假设已经处理到第k个点了,这意味着1 ~ k-1 的点它们之间的最小值在只有k-1个点的情况下已经确定。这时我们枚举前k-1个点中的两个点 i , j 组合,这里我们可以先认为只有前k-1个点时的最小环已经得出了,就是i , j 与一些点所连的环。

    所以很容易想到我们现在的任务是求有前k个点时的最小环值,也就是在前k-1个点中的最小环中添加k,看满不满足加入k点后环上权值和减小,求出这里面的最小值更新ans(未更新前ans是前k-1个点最小环值),由于不保存环,所以每次要枚举前k-1个点中的i,j组合作为插入k的位置。(这里提前说一下:要想将k加入到i,j所在的环里面,k点一定与i,j都相连,注意前面的条件我们就是要从i,j这里加入k,所以一定相连)如何判断环上权值和减少呢?就是ans>dis[i] [j]+e[i] [k]+e[k] [j] (如果k与i,j任意一个不相连这里右边都是INF,不会更新答案)。这也就是前面说要用到dis[] []的原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值