3 Copyright (c) Jeremy Siek 2000
5 Distributed under the Boost Software License, Version 1.0.
6 (See accompanying file LICENSE_1_0.txt or copy at
7 http://www.boost.org/LICENSE_1_0.txt)
10 <Title>Boost Graph Library: Isomorphism
</Title>
11 <BODY BGCOLOR=
"#ffffff" LINK=
"#0000ee" TEXT=
"#000000" VLINK=
"#551a8b"
13 <IMG SRC=
"../../../boost.png"
14 ALT=
"C++ Boost" width=
"277" height=
"86">
19 <img src=
"figs/python.gif" alt=
"(Python)"/>
25 <i>// named parameter version
</i>
26 template
<class Graph1, class Graph2, class P, class T, class R
>
27 bool isomorphism(const Graph1
& g1, const Graph2
& g2,
28 const bgl_named_params
<P,T,R
>& params =
<i>all defaults
</i>)
30 <i>// non-named parameter version
</i>
31 template
<typename Graph1, typename Graph2, typename IsoMap,
32 typename VertexInvariant1, typename VertexInvariant2,
33 typename V1Map, typename V2Map
>
34 bool isomorphism(const Graph1
& g1, const Graph2
& g2,
35 IsoMap f, VertexInvariant1 invariant2, VertexInvariant2 invariant2,
36 std::size_t max_invariant, VertexIndex1Map i1_map, VertexIndex2Map i2_map)
40 An
<b><i>isomorphism
</i></b> is a
1-to-
1 mapping of the vertices in
41 one graph to the vertices of another graph such that adjacency is
42 preserved. Another words, given graphs
<i>G
<sub>1</sub> =
43 (V
<sub>1</sub>,E
<sub>1</sub>)
</i> and
<i>G
<sub>2</sub> =
44 (V
<sub>2</sub>,E
<sub>2</sub>)
</i> an isomorphism is a function
45 <i>f
</i> such that for all pairs of vertices
<i>a,b
</i> in
46 <i>V
<sub>1</sub></i>, edge
<i>(a,b)
</i> is in
<i>E
<sub>1</sub></i> if
47 and only if edge
<i>(f(a),f(b))
</i> is in
<i>E
<sub>2</sub></i>.
51 This function returns
<tt>true
</tt> if there exists an isomorphism
52 between graph
1 and graph
2 and
<tt>false
</tt> otherwise. Also, if a
53 isomorphism map named parameter is provided then an isomorphism is
58 The current implementation is based on descriptions of a backtracking
60 href=
"./bibliography.html#fortin96:_graph_iso_prob">46</a>,
<a
61 href=
"./bibliography.html#reingold77:_combin_algo">48</a>]. The file
62 <a href=
"./isomorphism-impl.pdf">isomorphism-impl.pdf
</a> contains a (somewhat out-of-date)
63 "literate
" description of the implementation. The algorithm
64 used is simple but slow. A more efficient (and much more complex)
65 algorithm is described in [
<a
66 href=
"./bibliography.html#mckay81:_pract_graph_iso">47</a>]. When (and
67 if) a version of this algorithm is ported to the BGL interface it
68 should replace the current algorithm.
71 <H3>Where Defined
</H3>
73 <a href=
"../../../boost/graph/isomorphism.hpp"><TT>boost/graph/isomorphism.hpp
</TT></a>
77 IN:
<tt>const Graph1
& g1
</tt>
79 A directed or undirected graph. The graph type must model of
<a
80 href=
"./VertexListGraph.html">Vertex List Graph
</a> and
<a
81 href=
"./EdgeListGraph.html">Edge List Graph
</a>.
84 IN:
<tt>const Graph2
& g2
</tt>
86 A directed or undirected graph. The graph type must model
<a
87 href=
"./BidirectionalGraph.html">Bidirectional Graph
</a> and
<a
88 href=
"./VertexListGraph.html">Vertex List Graph
</a>.
91 <h3>Named Parameters
</h3>
93 OUT:
<tt>isomorphism_map(IsoMap f)
</tt>
95 The mapping from vertices in graph
1 to vertices in graph
2. This must
96 be a
<a href=
"../../property_map/doc/ReadWritePropertyMap.html">Read/Write
97 Property Map
</a>.
<br> <b>Default:
</b> an
<a
98 href=
"../../property_map/doc/iterator_property_map.html"><tt>iterator_property_map
</tt></a>
99 constructed from a
<tt>std::vector
</tt> of graph
2's vertex
100 descriptor type and the vertex index map for graph
1.
<br>
101 <b>Python
</b>: Must be a
<tt>vertex_vertex_map
</tt> for the first graph.
104 IN:
<tt>vertex_invariant1(VertexInvariant1 i1)
</tt>
105 IN:
<tt>vertex_invariant2(VertexInvariant2 i2)
</tt>
107 Mappings from vertices to integers which restrict which vertices may be
108 considered isomorphic. If a candidate isomorphism maps
<i>v1
</i> to
<i>v2
</i>
109 but
<i>i1
</i>(
<i>v1
</i>) !=
<i>i2
</i>(
<i>v2
</i>), that candidate is rejected.
110 This mapping can be used either to speed up the search (as is done by the
111 default value, which requires that the degrees of
<i>v1
</i> and
<i>v2
</i> are
112 equal) or to impose extra conditions on the result. The
113 <tt>VertexInvariant1
</tt> and
<tt>VertexInvariant2
</tt> types must model
<a
114 href=
"http://www.sgi.com/tech/stl/UnaryFunction.html">UnaryFunction
</a>, with
115 the argument type of
<tt>vertex_invariant1
</tt> being
<tt>Graph1
</tt>'s vertex
116 descriptor type, the argument type of
<tt>vertex_invariant2
</tt> being
117 <tt>Graph2
</tt>'s vertex descriptor type, and both functions having integral
118 result types. The values returned by these two functions must be in the range
119 [
0,
<tt>vertex_max_invariant
</tt>).
121 <b>Default:
</b> <tt>degree_vertex_invariant
</tt> for both arguments
<br>
122 <b>Python
</b>: Unsupported parameter.
125 IN:
<tt>vertex_max_invariant(std::size_t max_invariant)
</tt>
127 An upper bound on the possible values returned from either
128 vertex_invariant1 or vertex_invariant2.
130 <b>Default:
</b> <tt>vertex_invariant2.max()
</tt>. The default
131 <tt>vertex_invariant2
</tt> parameter, an instance of
132 <tt>degree_vertex_invariant
</tt>, defines this function to
133 return
<tt>num_vertices(g2) * (num_vertices(g2)+
1)
</tt>.
<br>
134 <b>Python
</b>: Unsupported parameter.
137 IN:
<tt>vertex_index1_map(VertexIndex1Map i1_map)
</tt>
139 This maps each vertex to an integer in the range
<tt>[
0,
140 num_vertices(g))
</tt>. This is necessary for efficient updates of the
141 heap data structure when an edge is relaxed. The type
142 <tt>VertexIndex1Map
</tt> must be a model of
<a
143 href=
"../../property_map/doc/ReadablePropertyMap.html">Readable Property
144 Map
</a>. The value type of the map must be an integer type. The vertex
145 descriptor type of graph
1 needs to be usable as the key type of the
147 <b>Default:
</b> <tt>get(vertex_index, g1)
</tt>
148 Note: if you use this default, make sure your graph has
149 an internal
<tt>vertex_index
</tt> property. For example,
150 <tt>adjacency_list
</tt> with
<tt>VertexList=listS
</tt> does
151 not have an internal
<tt>vertex_index
</tt> property.
153 <b>Python
</b>: Unsupported parameter.
156 IN:
<tt>vertex_index2_map(VertexIndex2Map i2_map)
</tt>
158 This maps each vertex to an integer in the range
<tt>[
0,
159 num_vertices(g))
</tt>. This is necessary for efficient updates of the
160 heap data structure when an edge is relaxed. The type
161 <tt>VertexIndex2Map
</tt> must be a model of
<a
162 href=
"../../property_map/doc/ReadablePropertyMap.html">Readable Property
163 Map
</a>. The value type of the map must be an integer type. The vertex
164 descriptor type of graph
2 needs to be usable as the key type of the
166 <b>Default:
</b> <tt>get(vertex_index, g2)
</tt>
167 Note: if you use this default, make sure your graph has
168 an internal
<tt>vertex_index
</tt> property. For example,
169 <tt>adjacency_list
</tt> with
<tt>VertexList=listS
</tt> does
170 not have an internal
<tt>vertex_index
</tt> property.
172 <b>Python
</b>: Unsupported parameter.
178 The worst-case time complexity is
<i>O(|V|!)
</i>.
182 See
<a href=
"../example/isomorphism.cpp"><tt>libs/graph/example/isomorphism.cpp
</tt></a>.
188 <TD nowrap
>Copyright
© 2000-
2001</TD><TD>
189 <A HREF=
"http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek
</A>, Indiana University (
<A HREF=
"mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu
</A>)