0
2
0
... | ... |
@@ -134,22 +134,12 @@ |
134 | 134 |
|
135 | 135 |
template <typename Graph> |
136 | 136 |
struct ArcListNode { |
137 | 137 |
typename Graph::Arc prev, next; |
138 | 138 |
}; |
139 | 139 |
|
140 |
} |
|
141 |
|
|
142 |
/// \ingroup planar |
|
143 |
/// |
|
144 |
/// \brief Planarity checking of an undirected simple graph |
|
145 |
/// |
|
146 |
/// This class implements the Boyer-Myrvold algorithm for planarity |
|
147 |
/// checking of an undirected graph. This class is a simplified |
|
148 |
/// version of the PlanarEmbedding algorithm class because neither |
|
149 |
/// the embedding nor the kuratowski subdivisons are not computed. |
|
150 | 140 |
template <typename Graph> |
151 | 141 |
class PlanarityChecking { |
152 | 142 |
private: |
153 | 143 |
|
154 | 144 |
TEMPLATE_GRAPH_TYPEDEFS(Graph); |
155 | 145 |
|
... | ... |
@@ -176,22 +166,14 @@ |
176 | 166 |
typedef typename Graph::template NodeMap<std::list<int> > MergeRoots; |
177 | 167 |
|
178 | 168 |
typedef typename Graph::template NodeMap<bool> EmbedArc; |
179 | 169 |
|
180 | 170 |
public: |
181 | 171 |
|
182 |
/// \brief Constructor |
|
183 |
/// |
|
184 |
/// \note The graph should be simple, i.e. parallel and loop arc |
|
185 |
/// free. |
|
186 | 172 |
PlanarityChecking(const Graph& graph) : _graph(graph) {} |
187 | 173 |
|
188 |
/// \brief Runs the algorithm. |
|
189 |
/// |
|
190 |
/// Runs the algorithm. |
|
191 |
/// \return %True when the graph is planar. |
|
192 | 174 |
bool run() { |
193 | 175 |
typedef _planarity_bits::PlanarityVisitor<Graph> Visitor; |
194 | 176 |
|
195 | 177 |
PredMap pred_map(_graph, INVALID); |
196 | 178 |
TreeMap tree_map(_graph, false); |
197 | 179 |
|
... | ... |
@@ -236,13 +218,14 @@ |
236 | 218 |
walkUp(target, source, i, pred_map, low_map, |
237 | 219 |
order_map, order_list, node_data, merge_roots); |
238 | 220 |
} |
239 | 221 |
} |
240 | 222 |
|
241 | 223 |
for (typename MergeRoots::Value::iterator it = |
242 |
merge_roots[node].begin(); |
|
224 |
merge_roots[node].begin(); |
|
225 |
it != merge_roots[node].end(); ++it) { |
|
243 | 226 |
int rn = *it; |
244 | 227 |
walkDown(rn, i, node_data, order_list, child_lists, |
245 | 228 |
ancestor_map, low_map, embed_arc, merge_roots); |
246 | 229 |
} |
247 | 230 |
merge_roots[node].clear(); |
248 | 231 |
|
... | ... |
@@ -446,13 +429,14 @@ |
446 | 429 |
Node xnode = order_list[xn]; |
447 | 430 |
|
448 | 431 |
int yn = node_data[rn].prev; |
449 | 432 |
Node ynode = order_list[yn]; |
450 | 433 |
|
451 | 434 |
bool rd; |
452 |
if (!external(xnode, rorder, child_lists, |
|
435 |
if (!external(xnode, rorder, child_lists, |
|
436 |
ancestor_map, low_map)) { |
|
453 | 437 |
rd = true; |
454 | 438 |
} else if (!external(ynode, rorder, child_lists, |
455 | 439 |
ancestor_map, low_map)) { |
456 | 440 |
rd = false; |
457 | 441 |
} else if (pertinent(xnode, embed_arc, merge_roots)) { |
458 | 442 |
rd = true; |
... | ... |
@@ -524,12 +508,28 @@ |
524 | 508 |
const MergeRoots& merge_roots) { |
525 | 509 |
return !merge_roots[node].empty() || embed_arc[node]; |
526 | 510 |
} |
527 | 511 |
|
528 | 512 |
}; |
529 | 513 |
|
514 |
} |
|
515 |
|
|
516 |
/// \ingroup planar |
|
517 |
/// |
|
518 |
/// \brief Planarity checking of an undirected simple graph |
|
519 |
/// |
|
520 |
/// This function implements the Boyer-Myrvold algorithm for |
|
521 |
/// planarity checking of an undirected graph. It is a simplified |
|
522 |
/// version of the PlanarEmbedding algorithm class because neither |
|
523 |
/// the embedding nor the kuratowski subdivisons are not computed. |
|
524 |
template <typename GR> |
|
525 |
bool checkPlanarity(const GR& graph) { |
|
526 |
_planarity_bits::PlanarityChecking<GR> pc(graph); |
|
527 |
return pc.run(); |
|
528 |
} |
|
529 |
|
|
530 | 530 |
/// \ingroup planar |
531 | 531 |
/// |
532 | 532 |
/// \brief Planar embedding of an undirected simple graph |
533 | 533 |
/// |
534 | 534 |
/// This class implements the Boyer-Myrvold algorithm for planar |
535 | 535 |
/// embedding of an undirected graph. The planar embedding is an |
... | ... |
@@ -709,13 +709,13 @@ |
709 | 709 |
} |
710 | 710 |
|
711 | 711 |
/// \brief Gives back the calculated embedding map |
712 | 712 |
/// |
713 | 713 |
/// The returned map contains the successor of each arc in the |
714 | 714 |
/// graph. |
715 |
const EmbeddingMap& |
|
715 |
const EmbeddingMap& embeddingMap() const { |
|
716 | 716 |
return _embedding; |
717 | 717 |
} |
718 | 718 |
|
719 | 719 |
/// \brief Gives back true if the undirected arc is in the |
720 | 720 |
/// kuratowski subdivision |
721 | 721 |
/// |
... | ... |
@@ -236,21 +236,24 @@ |
236 | 236 |
SmartGraph graph; |
237 | 237 |
graphReader(graph, lgfs).run(); |
238 | 238 |
|
239 | 239 |
check(simpleGraph(graph), "Test graphs must be simple"); |
240 | 240 |
|
241 | 241 |
PE pe(graph); |
242 |
|
|
242 |
bool planar = pe.run(); |
|
243 |
check(checkPlanarity(graph) == planar, "Planarity checking failed"); |
|
244 |
|
|
245 |
if (planar) { |
|
243 | 246 |
checkEmbedding(graph, pe); |
244 | 247 |
|
245 | 248 |
PlanarDrawing<Graph> pd(graph); |
246 |
pd.run(pe. |
|
249 |
pd.run(pe.embeddingMap()); |
|
247 | 250 |
checkDrawing(graph, pd); |
248 | 251 |
|
249 | 252 |
PlanarColoring<Graph> pc(graph); |
250 |
pc.runFiveColoring(pe. |
|
253 |
pc.runFiveColoring(pe.embeddingMap()); |
|
251 | 254 |
checkColoring(graph, pc, 5); |
252 | 255 |
|
253 | 256 |
} else { |
254 | 257 |
checkKuratowski(graph, pe); |
255 | 258 |
} |
256 | 259 |
} |
0 comments (0 inline)