提升图最大流算法——关于反向弧的作用的问题,如果它们已经存在于原始输入图中

如何解决提升图最大流算法——关于反向弧的作用的问题,如果它们已经存在于原始输入图中

考虑应用最大流算法的以下原始输入图:

enter image description here

The following code(感谢 user sehe)编译并运行良好并提供正确的输出。代码在下面复制以完成:

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/boykov_kolmogorov_max_flow.hpp>
#include <boost/range/adaptors.hpp>
#include <fmt/ostream.h>
#include <fmt/ranges.h>
using boost::adaptors::filtered;

using Traits = boost::adjacency_list_traits<boost::vecS,boost::vecS,boost::directedS>;
using V      = Traits::vertex_descriptor;
using E      = Traits::edge_descriptor;

using Capacity = double;
using Color    = boost::default_color_type;

struct VertexProps {
    // std::string name;
    Color    color;
    Capacity distance;
    E        preedcessor;
};

struct EdgeProps {
    int      id;
    Capacity weight,residual;
    E        reverse;
};

using Graph = boost::adjacency_list<
    boost::vecS,boost::directedS,VertexProps,// see https://stackoverflow.com/a/64744086/85371 :(
    boost::property<boost::edge_capacity_t,Capacity,EdgeProps>>;

struct MyGraph {
    MyGraph(size_t nnodes) : _g(nnodes) {}

    void runSimulation(std::vector<std::pair<V,V>> const& arcs,std::vector<Capacity> const&        capacities)
    {
        reconfigure(arcs,capacities);

        Capacity maxflow = solve_max_flow(0,3);

        auto cap       = get(boost::edge_capacity,_g);
        auto is_source = [this](V v) { return _g[v].color == Color::black_color; };

        fmt::print("Max flow {}\nNodes {} are in source subset\n",maxflow,vertices(_g) | filtered(is_source));

        for (E e : boost::make_iterator_range(edges(_g))) {
            bool st_cut =
                is_source(source(e,_g)) and
                not is_source(target(e,_g));

            fmt::print("Edge {} (id #{:2}),capacity {:3} {}\n",e,_g[e].id,cap[e],st_cut ? "(ST Cut)" : "");
        }
    }

  private:
    Graph _g;

    void reconfigure(auto const& arcs,auto const& capacities)
    {
        assert(arcs.size() == capacities.size());

        for (auto v : boost::make_iterator_range(vertices(_g))) {
            // boost::clear_out_edges(v,g);
            boost::clear_vertex(v,_g);
        }

        auto cap  = get(boost::edge_capacity,_g);
        auto eidx = get(&EdgeProps::id,_g);
        auto rev  = get(&EdgeProps::reverse,_g);

        auto  eindex = 0;

        for (auto [fr,to] : arcs) {
            auto edf  = add_edge(fr,to,_g).first;
            auto edr  = add_edge(to,fr,_g).first;
            eidx[edf] = 2 * eindex;
            eidx[edr] = eidx[edf] + 1;
            cap[edf]  = cap[edr] = capacities[eindex];

            rev[edf] = edr;
            rev[edr] = edf;

            ++eindex;
        }
    }

    Capacity solve_max_flow(V src,V sink)
    {
        return boykov_kolmogorov_max_flow(
            _g,src,sink,// named arguments
            boost::reverse_edge_map(get(&EdgeProps::reverse,_g))
                .residual_capacity_map(get(&EdgeProps::residual,_g))
                .vertex_color_map(get(&VertexProps::color,_g))
                .predecessor_map(get(&VertexProps::preedcessor,_g))
                .distance_map(get(&VertexProps::distance,_g))
            // end named arguments
        );
    }
};

int main() {
    MyGraph g{4};

    g.runSimulation({{0,1},{0,2},{1,{2,3},3}},{10,1,10,10});

}

我的问题特别涉及弧线 (1->2) 和 (2->1)。

(a) Boost documentation 用于最大流算法要求用户为原始输入图中的每个弧明确提供反向弧。因此,在上面的示例中,有向弧 (1 -> 2) 和 (2 -> 1) 在以下代码段中两次添加到图形对象中:

  auto edf  = add_edge(fr,_g).first; //Arc (1->2) added,Arc (2->1) added
  auto edr  = add_edge(to,_g).first; //Arc (2->1) added,Arc (1->2) added
  eidx[edf] = 2 * eindex;
  eidx[edr] = eidx[edf] + 1;
  cap[edf]  = cap[edr] = capacities[eindex];
  rev[edf] = edr;
  rev[edr] = edf;

虽然在此特定示例中可以看到解决方案的正确性,但是否在所有情况下都能保证?也就是说,将同一弧多次(一次作为正向弧,一次作为反向弧)重复添加到图形对象中是否会导致任何内部内容在针对此问题的 boost 算法中中断?

(b) boost documentation 声明如下:

备注:虽然 push-relabel 方法指出 E^T 中的每条边都有 容量为 0,该算法的反向边为 允许承载能力。如果已经有反向边缘 输入图 G,可以使用那些。这可以将边缘数量减半 并将显着提高性能。

这是否意味着在这种特殊情况下,当我添加正向弧 (1->2) 时,我需要 NOT 明确添加反向弧 (2->1),同样当我添加添加正向弧 (2->1),我需要 NOT 显式添加反向弧 (1->2),如上面代码片段中发生的那样?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res