代码之家  ›  专栏  ›  技术社区  ›  Tryer

Boost图算法-理解编译错误,并为算法指定顶点/边/图的最小但完整的属性

  •  0
  • Tryer  · 技术社区  · 3 年前

    这个 following 代码(代码段1)编译良好:

    #include <boost/config.hpp>
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/boykov_kolmogorov_max_flow.hpp>
    #include <boost/graph/graph_utility.hpp>
    
    using namespace boost;
    
    typedef adjacency_list_traits<vecS, vecS, directedS> Traits_vvd;
    typedef adjacency_list_traits<vecS, vecS, undirectedS> Traits_vvu;
    
    typedef adjacency_list<
        vecS, vecS, directedS,
        property<
        vertex_index_t, int,
        property<vertex_color_t, boost::default_color_type,
        property<vertex_distance_t, double,
        property<vertex_predecessor_t, Traits_vvd::edge_descriptor>
        > > >,
        property<
        edge_index_t, int,
        property<edge_capacity_t, double,
        property<edge_weight_t, double,
        property<edge_residual_capacity_t, double,
        property<edge_reverse_t, Traits_vvd::edge_descriptor>
    > > > > >
    Graph_vvd;
    
    class MAXFLOW_ {
    public:
        double solve_max_flow(int s, int t){
            double retval = boykov_kolmogorov_max_flow(g, s, t);
            return retval;
        }
    private:
        Graph_vvd g;
    };
    
    int main(){
        return 0;
    }
    

    但是,在移除时 vertex_distance_t vertex_predecessor_t 从图表中,我们有 this 未能编译的代码(代码段2):

    #include <boost/config.hpp>
    #include <boost/graph/adjacency_list.hpp>
    #include <boost/graph/boykov_kolmogorov_max_flow.hpp>
    #include <boost/graph/graph_utility.hpp>
    
    using namespace boost;
    
    typedef adjacency_list_traits<vecS, vecS, directedS> Traits_vvd;
    typedef adjacency_list_traits<vecS, vecS, undirectedS> Traits_vvu;
    
    typedef adjacency_list<
        vecS, vecS, directedS,
        property<
        vertex_index_t, int,
        property<vertex_color_t, boost::default_color_type
        > >,
        property<
        edge_index_t, int,
        property<edge_capacity_t, double,
        property<edge_weight_t, double,
        property<edge_residual_capacity_t, double,
        property<edge_reverse_t, Traits_vvd::edge_descriptor>
    > > > > >
    Graph_vvd;
    
    class MAXFLOW_ {
    public:
        double solve_max_flow(int s, int t){
            double retval = boykov_kolmogorov_max_flow(g, s, t);
            return retval;
        }
    private:
        Graph_vvd g;
    };
    
    int main(){
        return 0;
    }
    

    代码段1和代码段2之间的唯一区别是,在第二个代码段中,没有与相关的顶点属性 顶点_距离_t 顶点_前置器_t .

    我的问题是:

    (1) 编译错误 here 是我无法理解的。有没有办法开始理解这些错误,然后找出一个遗漏了指定算法正确运行所需的属性,在这种情况下,使用boykov_kolmogorov方法找到最大流量的算法?

    (2) 通过boost文档中提供的此算法的代码示例 here ,实际上顶点具有所需的属性:

    property < vertex_name_t, std::string,
        property < vertex_index_t, long,
        property < vertex_color_t, boost::default_color_type,
        property < vertex_distance_t, long,
        property < vertex_predecessor_t, Traits::edge_descriptor > > > > >,
    

    但此代码也有一些不必要的属性,例如 vertex_name_t 没有它,Snippet 1编译得很好。有没有办法找出最基本的属性集来指定boost算法的正确运行?

    0 回复  |  直到 3 年前
        1
  •  1
  •   sehe    3 年前

    所需属性用算法记录: https://www.boost.org/doc/libs/1_76_0/libs/graph/doc/boykov_kolmogorov_max_flow.html

    您可以看到哪些参数是IN/OUT或UTIL,以及哪些参数具有默认值(除非默认表达式对您的图形类型无效,否则这些参数是非强制性的)。

    关于您之前的问题,我已经重复了一遍:

    简言之

    • 编译器的消息令人生畏。阅读它们需要一些图书馆的经验。遗憾的是,这是将C++03与高度通用的模板一起使用时不可避免的结果。如果你不需要这样一个通用库的原始功能,那么可能有更多用户友好的图算法库。

      我说C++03是因为更新的标准可以提供更好的诊断。具体来说,我会很高兴有一个概念启用版本的BGL。“不幸的是”(?)BGL仍然与C++03兼容。

    • 基本上,您所能做的是专注于文档,而不是编译器消息。如果您“搞砸”了特定于C++的东西,而不是特定于库的东西(或者遇到 a snag )

    • 如果您对最低要求感兴趣,请关注API参考资料,而不是示例。示例经常随着时间的推移而演变,或者重用来自其他示例的数据/模型,因此不能假设它们是最小的。(在某些时候,什么是最小的甚至可能取决于你的选择和偏好)。