27 # ifndef TPL_GRAPH_UTILS_H 28 # define TPL_GRAPH_UTILS_H 32 # include <tpl_agraph.H> 33 # include <tpl_dynListQueue.H> 35 using namespace Aleph;
39 template <
class GT>
inline static bool 40 __depth_first_traversal(
const GT & g,
typename GT::Node * node,
41 typename GT::Arc * arc,
42 bool (*visit)(
const GT & g,
typename GT::Node *,
68 template <
class GT>
inline size_t 70 bool (*visit)(
const GT & g,
typename GT::Node *,
73 g.reset_bit_nodes(Depth_First);
74 g.reset_bit_arcs(Depth_First);
77 __depth_first_traversal(g, start_node,
nullptr, visit, counter);
83 template <
class GT>
inline 85 bool (*visit)(
const GT &,
typename GT::Node *,
98 bool operator () (
const GT &,
typename GT::Node *,
typename GT::Arc *)
140 Operation * op_ptr =
nullptr;
143 const GT * g_ptr =
nullptr;
147 bool __dft(
typename GT::Node * node,
typename GT::Arc * arc =
nullptr)
152 NODE_BITS(node).set_bit(Depth_First,
true);
155 if ((*op_ptr)(*g_ptr, node, arc))
158 if (count == g_ptr->get_num_nodes())
164 auto arc = it.get_current_arc_ne();
168 ARC_BITS(arc).set_bit(Depth_First,
true);
169 if (__dft (it.get_tgt_node_ne(), arc))
176 size_t dft(
const GT & g,
typename GT::Node * start_node, Operation & __op)
181 g_ptr->reset_bit_nodes(Depth_First);
182 g_ptr->reset_bit_arcs(Depth_First);
203 size_t operator () (
const GT & g, Operation op = Operation())
205 return dft(g, g.get_first_node(), op);
215 size_t operator () (
const GT & g,
typename GT::Node * sn,
216 Operation op = Operation())
218 return dft(g, sn, op);
223 template <
class GT>
inline static bool 224 __depth_first_traversal(
const GT & g,
typename GT::Node * node,
225 typename GT::Arc * arc,
226 bool (*visit)(
const GT & g,
typename GT::Node *,
233 NODE_BITS(node).set_bit(Depth_First,
true);
236 if (visit !=
nullptr)
237 if ((*visit)(g, node, arc))
240 if (count == g.get_num_nodes())
243 for (
auto it = g.get_arc_it(node); it.has_curr(); it.next_ne())
245 auto arc = it.get_current_arc_ne();
249 ARC_BITS(arc).set_bit(Depth_First,
true);
250 if (__depth_first_traversal(g, it.get_tgt_node_ne(), arc, visit, count))
257 template <
class GT>
inline size_t 281 bool (*visit)(
const GT &,
typename GT::Node *,
282 typename GT::Arc *) )
284 g.reset_bit_nodes(Breadth_First);
285 g.reset_bit_arcs(Breadth_First);
288 for (
auto it = g.get_arc_it(start); it.has_curr(); it.next_ne())
289 q.
put(it.get_current_arc_ne());
291 NODE_BITS(start).set_bit(Breadth_First,
true);
292 size_t node_counter = 1;
294 if (visit !=
nullptr)
295 if ((*visit)(g, start,
nullptr))
298 while (not q.
is_empty() and node_counter < g.get_num_nodes())
301 ARC_BITS(arc).set_bit(Breadth_First,
true);
303 auto src = g.get_src_node(arc);
304 auto tgt = g.get_tgt_node(arc);
310 if (visit !=
nullptr)
311 if ((*visit)(g, visit_node, arc))
314 NODE_BITS(visit_node).set_bit(Breadth_First,
true);
317 for (
auto it = g.get_arc_it(visit_node); it.has_curr(); it.next_ne())
319 auto curr_arc = it.get_current_arc_ne();
335 template <
class GT>
inline size_t 337 bool (*visit)(
const GT &,
typename GT::Node *,
383 size_t bft(
const GT & g,
typename GT::Node * start, Operation & op)
385 g.reset_bit_nodes(Breadth_First);
386 g.reset_bit_arcs(Breadth_First);
390 q.
put(it.get_current_arc_ne());
392 NODE_BITS(start).set_bit(Breadth_First,
true);
395 if (op (g, start,
nullptr))
398 while (not q.
is_empty() and count < g.get_num_nodes())
401 ARC_BITS(arc).set_bit(Breadth_First,
true);
403 auto src = g.get_src_node(arc);
404 auto tgt = g.get_tgt_node(arc);
411 if (op (g, curr, arc))
414 NODE_BITS(curr).set_bit(Breadth_First,
true);
419 auto curr_arc = it.get_current_arc_ne();
447 size_t operator () (
const GT & g, Operation op)
449 return bft (g, g.get_first_node(), op);
460 size_t operator () (
const GT & g,
typename GT::Node * p,
461 Operation && op = Operation())
463 return bft(g, p, op);
466 size_t operator () (
const GT & g,
typename GT::Node * p, Operation & op)
468 return bft(g, p, op);
486 template <
class GT>
inline 488 typename GT::Node * end)
495 for (
auto it = g.get_arc_it(start); it.has_curr(); it.next_ne())
496 q.
put(it.get_current_arc_ne());
498 NODE_BITS(start).set_bit(Find_Path,
true);
500 bool path_found =
false;
505 auto src = g.get_src_node(arc);
506 auto tgt = g.get_tgt_node(arc);
514 ARC_BITS(arc).set_bit(Find_Path,
true);
524 for (
auto it = g.get_arc_it(tgt); it.has_curr(); it.next_ne())
526 auto a = it.get_current_arc_ne();
564 template <
class GT>
inline 568 throw std::domain_error(
"test_connectivity() does not work on digraphs");
570 if (g.get_num_arcs() < g.get_num_nodes() - 1)
573 return depth_first_traversal<GT>(g,
nullptr) == g.get_num_nodes();
577 template <
class GT,
class SA>
inline static 578 bool __test_cycle(
const GT & g,
typename GT::Node *,
typename GT::Node *);
602 template <
class GT>
inline 605 g.reset_bit_nodes(Test_Cycle);
606 g.reset_bit_arcs(Test_Cycle);
607 for (
auto it = g.get_arc_it(src); it.has_curr(); it.next_ne())
609 auto arc = it.get_curr_ne();
613 ARC_BITS(arc).set_bit(Test_Cycle,
true);
614 if (__test_cycle(g, src, it.get_tgt_node_ne()))
622 template <
class GT>
inline static bool 623 __test_cycle(
const GT & g,
typename GT::Node * src,
typename GT::Node * curr)
631 NODE_BITS(curr).set_bit(Test_Cycle,
true);
633 for (
auto it = g.get_arc_it(curr); it.has_curr(); it.next_ne())
635 auto arc = it.get_curr_ne();
639 ARC_BITS(arc).set_bit(Test_Cycle,
true);
640 if (__test_cycle(g, src, it.get_tgt_node_ne()))
647 template <
class GT>
inline static 648 bool __is_graph_acyclique(
const GT & g,
typename GT::Node * curr_node)
653 NODE_BITS(curr_node).set_bit(Test_Cycle,
true);
655 for (
auto it = g.get_arc_it(curr_node); it.has_curr(); it.next_ne())
657 auto arc = it.get_current_arc_ne();
661 ARC_BITS(arc).set_bit(Test_Cycle,
true);
663 if (not __is_graph_acyclique(g, it.get_tgt_node_ne()))
680 template <
class GT>
inline 681 bool is_graph_acyclique(
const GT & g,
typename GT::Node * start_node)
684 throw std::domain_error(
"is_graph_acyclique() does not work for digraps");
686 if (g.get_num_arcs() >= g.get_num_nodes())
689 g.reset_bit_arcs(Test_Cycle);
690 g.reset_bit_nodes(Test_Cycle);
692 return __is_graph_acyclique(g, start_node);
702 template <
class GT>
inline 703 bool is_graph_acyclique(
const GT & g)
706 throw std::domain_error(
"is_graph_acyclique() does not work for digraps");
708 if (g.get_num_arcs() >= g.get_num_nodes())
711 g.reset_bit_arcs(Test_Cycle);
712 g.reset_bit_nodes(Test_Cycle);
714 for (
auto it = g.get_node_it(); it.has_curr(); it.next_ne())
716 auto current_node = it.get_current_node_ne();
720 if (not __is_graph_acyclique(g, current_node))
736 inline bool has_cycle(
const GT & g)
738 return not is_graph_acyclique(g);
755 template <
class GT>
inline 757 typename GT::Node * end_node)
759 if (not g.is_digraph() and g.get_num_arcs() >= g.get_num_nodes())
762 g.reset_bit_nodes(Find_Path);
763 g.reset_bit_arcs(Find_Path);
765 for (
auto it = g.get_arc_it(start_node); it.has_curr(); it.next_ne())
767 auto arc = it.get_current_arc_ne();
768 ARC_BITS(arc).set_bit(Find_Path,
true);
769 if (__test_for_path(g, it.get_tgt_node_ne(), end_node))
777 template <
class GT>
inline static 778 bool __test_for_path(
const GT & g,
typename GT::Node * curr_node,
779 typename GT::Node * end_node)
781 if (curr_node == end_node)
787 NODE_BITS(curr_node).set_bit(Find_Path,
true);
789 for (
auto it = g.get_arc_it(curr_node); it.has_curr(); it.next_ne())
791 auto arc = it.get_current_arc_ne();
795 ARC_BITS(arc).set_bit(Find_Path,
true);
796 if (__test_for_path(g, it.get_tgt_node_ne(), end_node))
803 template <
class GT>
inline 806 template <
class GT>
inline 808 typename GT::Node * g_src,
size_t & node_count);
829 template <
class GT>
inline 837 for (
auto it = g.get_node_it(); count < g.get_num_nodes() and it.has_curr();
840 auto curr = it.get_current_node_ne();
877 template <
class GT>
inline 879 typename GT::Node * g_src,
size_t & node_count)
884 NODE_BITS(g_src).set_bit(Build_Subtree,
true);
887 auto sg_src = mapped_node<GT>(g_src);
888 if (sg_src ==
nullptr)
890 sg_src = sg.insert_node(g_src->get_info());
894 for (
auto it = g.get_arc_it(g_src);
895 node_count < g.get_num_nodes() and it.has_curr(); it.next_ne())
897 auto arc = it.get_current_arc_ne();
901 ARC_BITS(arc).set_bit(Build_Subtree,
true);
902 auto g_tgt = it.get_tgt_node_ne();
903 auto sg_tgt = mapped_node<GT>(g_tgt);
904 if (sg_tgt ==
nullptr)
906 sg_tgt = sg.insert_node(g_tgt->get_info());
910 auto sg_arc = sg.insert_arc(sg_src, sg_tgt, arc->get_info());
918 template <
class GT>
inline static 919 bool __find_depth_first_spanning_tree(
const GT & g,
920 typename GT::Node * gnode,
921 typename GT::Arc * garc,
923 typename GT::Node * tnode);
942 template <
class GT>
inline 950 NODE_BITS(gnode).set_bit(Spanning_Tree,
true);
952 auto tnode = tree.insert_node(gnode->get_info());
955 for (
auto it = g.get_arc_it(gnode); it.has_curr(); it.next_ne())
957 auto arc = it.get_current_arc_ne();
961 auto arc_tgt_node = it.get_tgt_node_ne();
965 if (__find_depth_first_spanning_tree(g, arc_tgt_node, arc, tree, tnode))
973 template <
class GT>
inline 980 template <
class GT>
inline static 981 bool __find_depth_first_spanning_tree(
const GT & g,
typename GT::Node * gnode,
982 typename GT::Arc * garc,
983 GT & tree,
typename GT::Node * tnode)
985 NODE_BITS(gnode).set_bit(Spanning_Tree,
true);
986 ARC_BITS(garc).set_bit(Spanning_Tree,
true);
988 auto tree_tgt_node = tree.insert_node(gnode->get_info());
991 auto tarc = tree.insert_arc(tnode, tree_tgt_node, garc->get_info());
994 tnode = tree_tgt_node;
995 if (tree.get_num_nodes() == g.get_num_nodes())
998 assert(tree.get_num_nodes() > tree.get_num_arcs());
1000 for (
auto it = g.get_arc_it(gnode); it.has_curr(); it.next_ne())
1002 auto arc = it.get_current_arc_ne();
1006 auto arc_tgt_node = it.get_tgt_node_ne();
1010 if (__find_depth_first_spanning_tree(g, arc_tgt_node, arc, tree, tnode))
1034 template <
class GT>
inline 1037 g.reset_bit_nodes(Spanning_Tree);
1038 g.reset_bit_arcs(Spanning_Tree);
1042 unique_ptr<typename GT::Node> tp_auto(
new typename GT::Node(gp));
1043 tree.insert_node(tp_auto.get());
1045 NODE_BITS(gp).set_bit(Spanning_Tree,
true);
1048 for (
auto it = g.get_arc_it(gp); it.has_curr(); it.next_ne())
1049 q.
put(it.get_curr_ne());
1053 auto garc = q.
get();
1054 ARC_BITS(garc).set_bit(Spanning_Tree,
true);
1055 auto gsrc = g.get_src_node(garc);
1056 auto gtgt = g.get_tgt_node(garc);
1063 std::swap(gsrc, gtgt);
1065 auto tsrc = mapped_node<GT>(gsrc);
1066 NODE_BITS(gtgt).set_bit(Spanning_Tree,
true);
1069 unique_ptr<typename GT::Node> ttgt_auto(
new typename GT::Node(gtgt));
1070 tree.insert_node(ttgt_auto.get());
1071 auto ttgt = ttgt_auto.release();
1075 auto tarc = tree.insert_arc(tsrc, ttgt, garc->get_info());
1077 if (tree.get_num_nodes() == g.get_num_nodes())
1081 for (
auto it = g.get_arc_it(gtgt); it.has_curr(); it.next_ne())
1083 auto current_arc = it.get_current_arc_ne();
1117 using Node =
typename GT::Node;
1118 using Arc =
typename GT::Arc;
1122 arcs.
for_each([&table, &ret] (Arc * ga)
1127 Node * gsrc = (Node*) ga->src_node;
1128 Node * gtgt = (Node*) ga->tgt_node;
1131 auto * pair_ptr = table.
search(gsrc);
1133 tsrc = pair_ptr->second;
1136 tsrc = ret.insert_node(gsrc->get_info());
1137 table.
insert(gsrc, tsrc);
1142 pair_ptr = table.
search(gtgt);
1144 ttgt = pair_ptr->second;
1147 ttgt = ret.insert_node(gtgt->get_info());
1148 table.
insert(gtgt, ttgt);
1152 Arc * ta = ret.insert_arc(tsrc, ttgt);
1160 template <
class GT>
inline static 1161 long & df(
typename GT::Node * p)
1166 template <
class GT>
inline static 1167 long & low(
typename GT::Node * p)
1172 template <
class GT>
inline static 1174 typename GT::Node * p,
typename GT::Arc * a,
1203 g.for_each_node([] (
auto p)
1210 long current_df = 0;
1211 NODE_BITS(start).set_bit(Depth_First,
true);
1212 df<GT>(start) = current_df++;
1213 int call_counter = 0;
1216 for (
auto it = g.get_arc_it(start);
1217 it.has_curr() and current_df < g.get_num_nodes(); it.next_ne())
1219 auto tgt = it.get_tgt_node_ne();
1223 auto arc = it.get_current_arc_ne();
1227 ARC_BITS(arc).set_bit(Depth_First,
true);
1228 __compute_cut_nodes(g, list, tgt, arc, current_df);
1232 if (call_counter > 1)
1248 template <
class GT>
inline static 1250 typename GT::Node * p,
typename GT::Arc * a,
1253 NODE_BITS(p).set_bit(Depth_First,
true);
1254 low <GT> (p) = df <GT> (p) = curr_df++;
1257 bool p_is_cut_node =
false;
1258 for (
auto it = g.get_arc_it(p); it.has_curr(); it.next_ne())
1260 auto arc = it.get_current_arc_ne();
1264 auto tgt = it.get_tgt_node_ne();
1268 if (df<GT>(tgt) < low<GT>(p))
1269 low<GT>(p) = df<GT>(tgt);
1277 ARC_BITS(arc).set_bit(Depth_First,
true);
1279 __compute_cut_nodes(g, list, tgt, arc, curr_df);
1281 if (low<GT>(tgt) < low<GT>(p))
1282 low<GT>(p) = low<GT>(tgt);
1284 if (low<GT>(tgt) >= df<GT>(p) and df<GT>(tgt) != 0)
1285 p_is_cut_node =
true;
1296 const long Cross_Arc = -1;
1298 template <
class GT>
inline static 1299 bool is_a_cross_arc(
typename GT::Arc * a)
1304 template <
class GT>
inline static 1305 bool is_a_cut_node(
typename GT::Node * p)
1310 template <
class GT>
inline static 1311 bool is_an_cut_arc(
typename GT::Arc * a)
1315 template <
class GT>
inline static 1316 bool is_node_painted(
typename GT::Node * p)
1321 template <
class GT>
inline static 1322 bool is_arc_painted(
typename GT::Arc * arc)
1327 template <
class GT>
inline static 1328 void paint_node(
typename GT::Node * p,
const long & color)
1333 template <
class GT>
inline static 1334 void paint_arc(
typename GT::Arc * a,
const long & color)
1339 template <
class GT>
inline static 1340 const long & get_color(
typename GT::Node * p)
1345 template <
class GT>
inline static 1346 const long & get_color(
typename GT::Arc * a)
1352 template <
class GT>
inline static 1353 void __paint_subgraph(
const GT & g,
typename GT::Node * p,
long current_color)
1355 assert(not is_a_cut_node <GT> (p));
1357 if (is_node_painted <GT> (p))
1360 paint_node <GT> (p, current_color);
1362 for (
auto it = g.get_arc_it(p); it.has_curr(); it.next_ne())
1364 auto arc = it.get_current_arc_ne();
1365 if (is_arc_painted <GT> (arc))
1368 auto tgt = it.get_tgt_node_ne();
1369 if (is_a_cut_node <GT> (tgt))
1372 paint_arc <GT> (arc, current_color);
1374 __paint_subgraph(g, tgt, current_color);
1378 template <
class GT>
inline static 1380 __paint_from_cut_node(
const GT & g,
typename GT::Node * p,
long & current_color)
1382 assert(is_a_cut_node <GT> (p));
1385 for (
auto it = g.get_arc_it(p); it.has_curr(); it.next_ne())
1387 auto arc = it.get_current_arc_ne();
1389 assert(not is_arc_painted <GT> (arc));
1391 auto tgt_node = it.get_tgt_node_ne();
1392 if (is_a_cut_node <GT> (tgt_node))
1399 paint_arc <GT> (arc, Cross_Arc);
1400 if (is_node_painted <GT> (tgt_node))
1405 __paint_subgraph(g, tgt_node, current_color);
1409 assert(not is_arc_painted <GT> (arc));
1446 template <
class GT>
inline long 1449 g.reset_counter_nodes();
1450 g.reset_counter_arcs();
1451 long current_color = 1;
1454 for (
auto it = cut_node_list.
get_it(); it.has_curr(); it.next_ne())
1455 __paint_from_cut_node(g, it.get_curr_ne(), current_color);
1457 return current_color;
1461 template <
class GT>
inline static 1462 void __map_subgraph(
const GT & g, GT & sg,
typename GT::Node * gsrc,
1465 assert(get_color <GT> (gsrc) == color);
1467 auto tsrc = mapped_node<GT>(gsrc);
1470 for (
auto it = g.get_arc_it(gsrc); it.has_curr(); it.next_ne())
1472 auto garc = it.get_current_arc_ne();
1473 if (get_color<GT>(garc) != color or
IS_ARC_VISITED(garc, Build_Subtree))
1476 ARC_BITS(garc).set_bit(Build_Subtree,
true);
1478 auto gtgt = it.get_tgt_node_ne();
1480 assert(get_color <GT> (gtgt) == color);
1482 auto ttgt =
nullptr;
1484 ttgt = mapped_node<GT> (gtgt);
1487 unique_ptr<typename GT::Node> ttgt_auto(
new typename GT::Node(gtgt));
1488 sg.insert_node(ttgt_auto.get());
1490 NODE_BITS(gtgt).set_bit(Build_Subtree,
true);
1491 ttgt = ttgt_auto.release();
1494 auto tarc = sg.insert_arc(tsrc, ttgt, garc->get_info());
1497 __map_subgraph(g, sg, gtgt, color);
1523 typename GT::Node * first =
nullptr;
1524 for (
auto it = g.get_node_it(); it.has_curr(); it.next_ne())
1525 if (get_color <GT> (it.get_current_node_ne()) == color)
1526 first = it.get_current_node_ne();
1528 if (first ==
nullptr)
1529 throw std::domain_error(
"Color does not exist in the graph");
1532 unique_ptr<typename GT::Node> auto_tsrc(
new typename GT::Node(first));
1533 sg.insert_node(auto_tsrc.get());
1535 NODE_BITS(first).set_bit(Build_Subtree,
true);
1537 __map_subgraph(g, sg, first, color);
1568 std::tuple<GT, DynList<typename GT::Arc*>>
1574 for (
auto it = cut_node_list.
get_it(); it.has_curr(); it.next_ne())
1576 auto gp = it.get_curr_ne();
1578 assert(is_a_cut_node <GT> (gp));
1580 unique_ptr<typename GT::Node> tp_auto(
new typename GT::Node(gp));
1581 cut_graph.insert_node(tp_auto.get());
1586 for (
auto it = g.get_arc_it(); it.has_curr(); it.next_ne())
1588 auto garc = it.get_current_arc_ne();
1589 if (is_a_cross_arc <GT> (garc))
1591 cross_arc_list.
append(garc);
1595 if (not is_an_cut_arc <GT> (garc))
1598 auto src = mapped_node<GT>(g.get_src_node(garc));
1599 auto tgt = mapped_node<GT>(g.get_tgt_node(garc));
1601 assert(src !=
nullptr and tgt !=
nullptr);
1603 auto arc = cut_graph.insert_arc(src, tgt, garc->get_info());
1607 return { cut_graph, cross_arc_list };
1617 template <
class GT,
class Distance>
1624 bool operator () (
typename GT::Arc * a1,
typename GT::Arc * a2)
const 1626 return dist(a1) < dist(a2);
1647 for (
auto it = g.get_arc_it(); it.has_curr(); it.next_ne())
1649 auto arc = it.get_curr_ne();
1651 auto ssrc = g.get_src_node(arc);
1652 auto rsrc = mapped_node<GT> (ssrc);
1653 if (rsrc ==
nullptr)
1655 unique_ptr<typename GT::Node> rsrc_auto(
new typename GT::Node(ssrc));
1656 gi.insert_node(rsrc_auto.get());
1658 rsrc = rsrc_auto.release();
1661 auto stgt = g.get_tgt_node(arc);
1662 auto rtgt = mapped_node<GT> (stgt);
1663 if (rtgt ==
nullptr)
1665 unique_ptr<typename GT::Node> rtgt_auto(
new typename GT::Node(stgt));
1666 gi.insert_node(rtgt_auto.get());
1668 rtgt = rtgt_auto.release();
1671 typename GT::Arc * ai = gi.insert_arc(rtgt, rsrc, arc->get_info());
1675 assert(g.get_num_arcs() == gi.get_num_arcs() and
1676 g.get_num_nodes() == gi.get_num_nodes());
1686 template <
class GT,
class SA = Dft_Show_Arc<GT>>
1705 GT operator () (
const GT & g)
const 1712 auto arc = it.get_curr_ne();
1714 auto ssrc = g.get_src_node(arc);
1715 auto rsrc = mapped_node<GT> (ssrc);
1716 if (rsrc ==
nullptr)
1718 unique_ptr<typename GT::Node> rsrc_auto(
new typename GT::Node(ssrc));
1719 gi.insert_node(rsrc_auto.get());
1721 rsrc = rsrc_auto.release();
1724 auto stgt = g.get_tgt_node(arc);
1725 auto rtgt = mapped_node<GT> (stgt);
1726 if (rtgt ==
nullptr)
1728 unique_ptr<typename GT::Node> rtgt_auto(
new typename GT::Node(stgt));
1729 gi.insert_node(rtgt_auto.get());
1731 rtgt = rtgt_auto.release();
1734 typename GT::Arc * ai = gi.insert_arc(rtgt, rsrc, arc->get_info());
1738 assert(g.get_num_arcs() == gi.get_num_arcs() and
1739 g.get_num_nodes() == gi.get_num_nodes());
1742 invert_digraph <GT, SA> (g, gi, sa);
1757 typedef typename GT::Arc_Type Distance_Type;
1759 static const Distance_Type Zero_Distance;
1761 static const Distance_Type Max_Distance;
1763 Distance_Type & operator () (
typename GT::Arc * a)
const 1765 return a->get_info();
1768 Distance_Type & operator () (
typename GT::Arc * a,
typename GT::Node*)
const 1770 return a->get_info();
1773 static void set_zero(
typename GT::Arc * a) { a->get_info() = 0; }
1778 std::numeric_limits<typename Dft_Dist<GT>::Distance_Type>::max();
1796 template <
class GT,
class Distance = Dft_Dist<GT>>
1797 typename Distance::Distance_Type
1798 get_min_path(
typename GT::Node * s,
typename GT::Node * end,
Path<GT> & path)
1800 typename Distance::Distance_Type dist = 0.0;
1832 Total_Cost(Distance __dist = Distance(), SA __sa = SA())
1833 : dist(__dist), sa(__sa)
1841 typename Distance::Distance_Type sum = 0;
1845 sum += dist(it.get_current_arc_ne());
1851 typename Distance::Distance_Type operator () (GT & g)
1853 return total_cost (g);
1856 bool operator () (
typename GT::Arc * a)
1870 # endif // TPL_GRAPH_UTILS_H Definition: tpl_graph_utils.H:138
GT invert_digraph(const GT &g)
Definition: tpl_graph_utils.H:1642
DynList< typename GT::Node * > compute_cut_nodes(const GT &g, typename GT::Node *start)
Definition: tpl_graph_utils.H:1199
Definition: tpl_graph.H:1225
long paint_subgraphs(const GT &g, const DynList< typename GT::Node *> &cut_node_list)
Definition: tpl_graph_utils.H:1447
#define ARC_COUNTER(p)
Definition: aleph-graph.H:339
Invert_Digraph(SA __sa)
Construct functor wih filter sa.
Definition: tpl_graph_utils.H:1694
Pair * insert(const Key &key, const Data &data)
Definition: tpl_dynMapTree.H:112
#define NODE_COOKIE(p)
Definition: aleph-graph.H:333
GT build_spanning_tree(const DynArray< typename GT::Arc *> &arcs)
Definition: tpl_graph_utils.H:1115
auto get_it() const
Definition: htlist.H:151
bool is_empty() const noexcept
rioReturn true if this is empty
Definition: tpl_dynListQueue.H:112
bool test_connectivity(const GT &g)
Definition: tpl_graph_utils.H:565
void insert(Arc *arc)
Definition: tpl_graph.H:2951
void for_each(Operation &operation) noexcept(noexcept(operation))
Definition: htlist.H:589
Definition: tpl_dynMapTree.H:62
Path< GT > find_path_breadth_first(const GT &g, typename GT::Node *start, typename GT::Node *end)
Definition: tpl_graph_utils.H:487
Breadth_First_Traversal(SA __sa=SA())
Definition: tpl_graph_utils.H:438
#define IS_NODE_VISITED(p, bit)
Definition: aleph-graph.H:327
bool test_for_cycle(const GT &g, typename GT::Node *src)
Definition: tpl_graph_utils.H:603
size_t breadth_first_traversal(const GT &g, typename GT::Node *start, bool(*visit)(const GT &, typename GT::Node *, typename GT::Arc *))
Definition: tpl_graph_utils.H:280
GT map_subgraph(const GT &g, const long color)
Definition: tpl_graph_utils.H:1521
Definition: tpl_graph_utils.H:1618
void build_subgraph(const GT &g, GT &sg, typename GT::Node *g_src, size_t &node_count)
Definition: tpl_graph_utils.H:878
Definition: tpl_dynListQueue.H:50
bool test_for_path(const GT &g, typename GT::Node *start_node, typename GT::Node *end_node)
Definition: tpl_graph_utils.H:756
#define ARC_COOKIE(p)
Definition: aleph-graph.H:366
#define NODE_COUNTER(p)
Definition: aleph-graph.H:311
void map_arcs(typename GTS::Arc *p, typename GTT::Arc *q) noexcept
Definition: tpl_graph.H:3445
Distance::Distance_Type total_cost(GT &g)
Compute the total cost.
Definition: tpl_graph_utils.H:1839
#define IS_ARC_VISITED(p, bit)
Definition: aleph-graph.H:360
Depth_First_Traversal(SA __sa=SA())
Definition: tpl_graph_utils.H:195
Definition: tpl_graph.H:53
DynList< typename GT::Arc * > arcs(typename GT::Node *p, SA sa=SA())
Definition: tpl_graph.H:1893
void map_nodes(typename GTS::Node *p, typename GTT::Node *q) noexcept
Definition: tpl_graph.H:3419
Definition: tpl_graph_utils.H:378
Definition: tpl_graph.H:1063
DynList< GT > inconnected_components(const GT &g)
Definition: tpl_graph_utils.H:830
Arc * get_first_arc() const
Definition: tpl_graph.H:3082
Pair * search(const Key &key) const noexcept
Definition: tpl_dynMapTree.H:214
#define NODE_BITS(p)
Definition: aleph-graph.H:305
Definition: tpl_graph_utils.H:96
Definition: tpl_graph_utils.H:1753
Definition: tpl_graph_utils.H:1687
#define ARC_BITS(p)
Definition: aleph-graph.H:351
void empty() noexcept
Empty the queue.
Definition: tpl_dynListQueue.H:185
Definition: tpl_dynArray.H:159
GT find_depth_first_spanning_tree(const GT &g, typename GT::Node *gnode)
Definition: tpl_graph_utils.H:943
size_t depth_first_traversal(const GT &g, typename GT::Node *start_node, bool(*visit)(const GT &g, typename GT::Node *, typename GT::Arc *))
Definition: tpl_graph_utils.H:69
Definition: tpl_graph_utils.H:1825
GT find_breadth_first_spanning_tree(GT &g, typename GT::Node *gp)
Definition: tpl_graph_utils.H:1035
void empty()
Clean the path: all the nodes and arc are removed.
Definition: tpl_graph.H:2761
T & append(const T &item)
Definition: htlist.H:1471
std::tuple< GT, DynList< typename GT::Arc * > > map_cut_graph(const GT &g, const DynList< typename GT::Node *> &cut_node_list)
Definition: tpl_graph_utils.H:1569
T get()
Definition: tpl_dynListQueue.H:165
Definition: tpl_graph.H:1177
T & put(const T &data)
The type of element.
Definition: tpl_dynListQueue.H:125
T & get_last() const
Definition: htlist.H:1572