C++ 为什么Boost VF2子图同构给出了错误的答案?

C++ 为什么Boost VF2子图同构给出了错误的答案?,c++,boost,graph,boost-graph,C++,Boost,Graph,Boost Graph,我试图使用Boost的vf2\u subgraph\u iso,在测试一对小图之间的子图同构时,我得到了错误的答案。代码如下: #include <iostream> #include <fstream> #include <string> #include <map> #include <sstream> #include <iterator> #include <boost/graph/adjacency_lis

我试图使用Boost的
vf2\u subgraph\u iso
,在测试一对小图之间的子图同构时,我得到了错误的答案。代码如下:

#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <sstream>
#include <iterator>

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/labeled_graph.hpp>
#include <boost/graph/vf2_sub_graph_iso.hpp>
#include <boost/property_map/property_map.hpp>

using namespace boost;


typedef property<edge_name_t, char> edge_prop;
typedef property<vertex_name_t, char, property<vertex_index_t, int> > vertex_prop;

typedef adjacency_list<vecS, vecS, bidirectionalS, vertex_prop, edge_prop> Graph;

typedef property_map<Graph, vertex_name_t>::type vertex_name_map_t;
typedef property_map_equivalent<vertex_name_map_t, vertex_name_map_t> vertex_comp_t;

typedef property_map<Graph, edge_name_t>::type edge_name_map_t;
typedef property_map_equivalent<edge_name_map_t, edge_name_map_t> edge_comp_t;

bool is_subgraph_isomorphic(Graph smallGraph, Graph bigGraph)
{
    vertex_comp_t vertex_comp =
        make_property_map_equivalent(get(vertex_name, smallGraph), get(vertex_name, bigGraph));
    edge_comp_t edge_comp =
        make_property_map_equivalent(get(edge_name, smallGraph), get(edge_name, bigGraph));
    vf2_print_callback<Graph, Graph> callback(smallGraph, bigGraph);
    bool res = vf2_subgraph_iso(smallGraph, bigGraph, callback, vertex_order_by_mult(smallGraph),
        edges_equivalent(edge_comp).vertices_equivalent(vertex_comp));
    return res;
}

int main()
{
    Graph gsmall,glarge;
    add_vertex(vertex_prop('a'),gsmall);
    add_vertex(vertex_prop('b'),gsmall);
    add_edge(0, 1, edge_prop('a'), gsmall);
    add_vertex(vertex_prop('a'),glarge);
    add_vertex(vertex_prop('b'),glarge);
    add_vertex(vertex_prop('a'),glarge);
    add_edge(0, 1, edge_prop('b'), glarge);
    add_edge(1, 2, edge_prop('a'), glarge);
    std::cout << "Is first pair subisomorphic ? : " << is_subgraph_isomorphic(gsmall,glarge) << std::endl;

    Graph graph1;

    add_vertex(vertex_prop('a'), graph1);
    add_vertex(vertex_prop('a'), graph1);
    add_vertex(vertex_prop('a'), graph1);

    add_edge(0, 1, edge_prop('b'), graph1); 
    add_edge(0, 1, edge_prop('b'), graph1); 
    add_edge(0, 1, edge_prop('d'), graph1); 

    add_edge(1, 2, edge_prop('s'), graph1); 

    add_edge(2, 2, edge_prop('l'), graph1); 
    add_edge(2, 2, edge_prop('l'), graph1); 

    // Build graph2
    Graph graph2;

    add_vertex(vertex_prop('a'), graph2);
    add_vertex(vertex_prop('a'), graph2);
    add_vertex(vertex_prop('a'), graph2);
    add_vertex(vertex_prop('a'), graph2);
    add_vertex(vertex_prop('a'), graph2);
    add_vertex(vertex_prop('a'), graph2);

    add_edge(0, 1, edge_prop('a'), graph2); 
    add_edge(0, 1, edge_prop('a'), graph2); 
    add_edge(0, 1, edge_prop('b'), graph2); 

    add_edge(1, 2, edge_prop('s'), graph2); 

    add_edge(2, 3, edge_prop('b'), graph2); 
    add_edge(2, 3, edge_prop('d'), graph2); 
    add_edge(2, 3, edge_prop('b'), graph2); 

    add_edge(3, 4, edge_prop('s'), graph2); 

    add_edge(4, 4, edge_prop('l'), graph2); 
    add_edge(4, 4, edge_prop('l'), graph2); 

    add_edge(4, 5, edge_prop('c'), graph2); 
    add_edge(4, 5, edge_prop('c'), graph2); 
    add_edge(4, 5, edge_prop('c'), graph2); 

    add_edge(5, 0, edge_prop('s'), graph2); 
    std::cout << "Is second pair subisomorphic ? : " << is_subgraph_isomorphic(graph1,graph2) << std::endl;
}
第一对显然是同构子图

我注意到的另一件奇怪的事情是当我改变

typedef adjacency_list<vecS, vecS, bidirectionalS, vertex_prop, edge_prop> Graph;
第一对正确,第二对错误

编译命令:

g++ "-std=c++11" code.cpp -lboost_graph -o exec
在Xubuntu 16.04上运行,据我所知是最新的。使用存储库中的Boost库


有人能告诉我我做错了什么吗?

我想你发现了一两个bug。您的示例显示
vf2\u子图\u iso
在使用
undirected
时无法处理自循环。如果您删除了它们,您的示例应该会起作用。 第二个是不一致。在文档中,如果图-子图同构存在,
vf2\u子图\u iso
返回true,否则返回false。但实际上,如果整个搜索空间被搜索,它返回true,否则返回false。
向你问好,

我想你发现了一两个bug。您的示例显示
vf2\u子图\u iso
在使用
undirected
时无法处理自循环。如果您删除了它们,您的示例应该会起作用。 第二个是不一致。在文档中,如果图-子图同构存在,
vf2\u子图\u iso
返回true,否则返回false。但实际上,如果整个搜索空间被搜索,它返回true,否则返回false。
向您问好,

您知道双向的含义吗?这意味着,
edge(1,2,g)
并不等同于
edge(2,1,g)
。然而,这意味着当我使用
无向
时,我应该使这两对子同构,对吗?因为当我使用
双向
时,当边有方向时,第二对是亚同构的,所以相同的映射应该在无方向的情况下工作。我也不明白为什么第二个示例在使用
无方向
时失败。这与boost文档中给出的示例完全相同,所以我不知道怎么会这样。我想我现在唯一能做的就是看看这种情况是否发生在不同发行版的不同版本上。你知道
bidirectionalS
是什么意思吗?这意味着,
edge(1,2,g)
并不等同于
edge(2,1,g)
。然而,这意味着当我使用
无向
时,我应该使这两对子同构,对吗?因为当我使用
双向
时,当边有方向时,第二对是亚同构的,所以相同的映射应该在无方向的情况下工作。我也不明白为什么第二个示例在使用
无方向
时失败。这与boost文档中给出的示例完全相同,所以我不知道怎么会这样。我想我现在唯一能做的就是看看这是否发生在不同发行版的不同版本上。它似乎无法处理自循环,甚至无法处理相同顶点之间的多条边。稍后我会为此做一些测试。我想澄清一下,“不一致性”是指搜索由于无法处理自循环和/或多条边而提前终止,因此这种终止并不等同于图-子图同构的不存在?对不起。返回值没有不一致的地方。我无意中看到了一个旧版本的代码。它似乎不能处理自循环,甚至不能处理相同顶点之间的多条边。稍后我会为此做一些测试。我想澄清一下,“不一致性”是指搜索由于无法处理自循环和/或多条边而提前终止,因此这种终止并不等同于图-子图同构的不存在?对不起。返回值没有不一致的地方。我无意中看到了旧版本的代码。
typedef adjacency_list<vecS, vecS, undirectedS, vertex_prop, edge_prop> Graph;
(0, 2) (1, 1) 
Is first pair subisomorphic ? : 1
Is second pair subisomorphic ? : 0
g++ "-std=c++11" code.cpp -lboost_graph -o exec