当前位置: 首页 > 知识库问答 >
问题:

理解Dinic的算法有问题吗?

曹铭晨
2023-03-14

我对Dinic的算法有一个小的不了解,关于它是如何使用残差网络的

所以据我所知的算法如下所示

1-在剩余网络上运行bfs,并根据与源的距离为节点分配级别

2-如果从未到达接收器节点,则终止算法

3运行dfs迭代,严格增加级别,以寻找增加路径,直到达到阻塞流,并求和增加路径的所有瓶颈值,以获得最大流,并根据每个路径的瓶颈更新剩余网络

4-重复1 2 3

现在我的问题是,在dfs迭代期间,这个算法是否使用过残差网络的后向边(从v到u而不是u到v的边来抵消网络的现有流)?

因为我通常是这样表示残边的:-

private static class ResidualEdge implements Comparable<ResidualEdge>{

        public int u, v;
        public long flow;
        public boolean reversed;
        public Edge originEdge;

        public ResidualEdge(int u, int v, long flow, boolean reversed, Edge originEdge) {

            this.u = u;
            this.v = v;
            this.flow = flow;
            this.reversed = reversed;
            this.originEdge = originEdge;
        }

        @Override
        public boolean equals(Object obj) {


            if(obj == null || !(obj instanceof ResidualEdge))
                return false;

            ResidualEdge  edge = (ResidualEdge)obj;

            return edge.u == u && edge.v == v && edge.flow == flow && this.originEdge == edge.originEdge && this.reversed == edge.reversed;
        }

        @Override
        public int hashCode() {


            return Integer.hashCode((int) (flow + u + v + Boolean.hashCode(reversed)));
        }


        @Override
        public int compareTo(ResidualEdge o) {

            if(flow > o.flow)
                return 1;

            else if (flow < o.flow)
                return -1;

            return 0;
        }
    }

原始边是对原始网络的原始边的引用,剩余边表示要取消的剩余容量或流量,以便更容易地更新原始网络

现在我问这个问题,因为如果Dinic的算法不使用反向边,那么我可以忽略表示反向边,算法会简单得多

共有1个答案

丁翰海
2023-03-14

是的,它使用反向边缘。

示例:

假设B->C边在B->D边之前被处理,在没有反向边的情况下,该算法将计算出最大流只有3,而实际上是4。

通常在竞争规划中,使用Dinic算法时,图不是以边的形式存储,而是以矩阵的形式存储NxN,首先存储边i->j的剩余容量,然后存储流过边i->j的流。这些矩阵占用了O(n*n)内存,但Dinic的算法无论如何都是以O(n*n*m)运行的,所以当Dinic的算法运行得足够快时,节点的数量就足够小,这样就可以存储矩阵了。

 类似资料:
  • 我阅读了一些用C++创建的项目的技术文档。我发现有一行代码包含我不懂的语法: 我看到关键字,这意味着我们处理别名,但这行是做什么的?我怎么能理解呢?我认为这会创建命名别名并将表达式的结果分配给它。但是这个表达是什么呢?

  • 1、 给定一个字符串,逐个翻转字符串中的每个单词 2、 判断数组中所有的数字是否只出现一次 3、 无重复字符的最长子串 4、反转链表 5、给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标 6、二叉树的最近公共父亲节点 7、写一个函数,找出一个整数数组中,第二大的数 算法题基本在面试时都会遇到,因为他是对我们代码能力的直观体现,可

  • 我已经提出了几个解决方案,但我认为它们的效率不高,而且我很难计算它们的复杂性。 计划A)对于我随机选择的[1,N]范围内的每一个整数,我检查它是否被占用。如果是,我重新滚动直到我得到一个未被占用的整数。这对于N的高阶数来说变得低效,因为碰撞非常高。 计划B)每次迭代时,我遍历数组的所有值,那些我没有占用的我会写在一个列表中。之后,我洗牌列表(例如通过Fisher-Yates shuffle?)并任

  • 我阅读了一些用C++创建的项目的技术文档。我发现了一行包含我不懂的语法的代码: 我在这里看到关键字。这意味着我们要处理一个别名,但这行是做什么的?我怎么能理解呢?我认为这会创建一个命名别名并将右边表达式的结果分配给它。但是这个表达是什么呢?

  • 我理解反向传播算法有困难。我读了很多书,搜索了很多东西,但我不明白为什么我的神经网络不能工作。我想确认我做的每一部分都是正确的。 下面是我的神经网络,当它初始化时,当第一行输入[1,1]和输出[0]被设置时(如你所见,我正在尝试做异或神经网络): 我有3层:输入,隐藏和输出。第一层(输入层)和隐藏层包含2个神经元,每个神经元有2个突触。最后一层(输出)包含一个有2个突触的神经元。 一个突触包含一个

  • 本文向大家介绍算法题:名人问题,给出最优解法相关面试题,主要包含被问及算法题:名人问题,给出最优解法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 问题描述: 有n个人他们之间认识与否用邻接矩阵表示(1表示认识,0表示不认识),并A认识B并不意味着B认识A,也就意味着是个有向图。如果一个人是名人,他必须满足两个条件,一个是他不认识任何人,另一个是所有人必须都认识他。 解决问题: 用一个数组