Codeforce上的流程有缺陷

时间:2019-03-31 06:31:33

标签: algorithm flow max-flow

我陷入了问题Flawed flow

在以下方法中,我不了解F [u] = 0如何保证无环图 我在社论中发现了一条评论,但这不是很清楚

注释->如果没有顶点f等于f [v] = 0,则我们在图中有一个循环,因为图中的每个顶点都至少有一个传入边。 (考虑剩余图形中最长的简单路径,我们知道路径中的头顶点有一个进入的边,而该边的头也在路径中。)

请有人解释上述声明的正确原因是什么?

解决任务的关键要素是以下观察:如果我们知道顶点的所有进入边缘,那么所有其余边缘都必须是向外的。源没有传入的边缘,因此我们已经知道其所有边缘都是传出的。对于除汇点以外的所有其他顶点,流入和流出的流量相同,并且等于沿其入射边缘的流量总和的一半。然后,该算法将重复引导所有来自已知所有传入边的顶点的流。这可以通过一个BFS来完成:

for all v from 2 to n-1
    f[v] := sum(flow(v,u))/2;
put source in queue
while queue is not empty
    v := pop(queue)
    for all edges (v, u)
        if (v, u) is not directed yet
            direct v -> u
            f[u] = f[u] - flow(v,u)
            if u not sink and f[u] = 0
                push(queue, u)

由于流不包含循环,因此我们可以对顶点进行拓扑排序。然后

我们可以确定,直到所有边缘方向都知道,我们才能至少将具有未知边缘的第一个顶点放入队列中,因为它的所有传入边缘都来自具有较低索引的顶点,但我们采用了第一个边缘未知的顶点。

时间:O(n + m)

内存:O(n + m)

实施:c++

0 个答案:

没有答案