278 Parent::nextOut(i); |
278 Parent::nextOut(i); |
279 while (i!=INVALID && (!(*edge_filter_map)[i] |
279 while (i!=INVALID && (!(*edge_filter_map)[i] |
280 || !(*node_filter_map)[Parent::target(i)])) Parent::nextOut(i); |
280 || !(*node_filter_map)[Parent::target(i)])) Parent::nextOut(i); |
281 } |
281 } |
282 |
282 |
283 //x\e |
283 ///\e |
284 |
284 |
285 //x This function hides \c n in the graph, i.e. the iteration |
285 /// This function hides \c n in the graph, i.e. the iteration |
286 //x jumps over it. This is done by simply setting the value of \c n |
286 /// jumps over it. This is done by simply setting the value of \c n |
287 //x to be false in the corresponding node-map. |
287 /// to be false in the corresponding node-map. |
288 void hide(const Node& n) const { node_filter_map->set(n, false); } |
288 void hide(const Node& n) const { node_filter_map->set(n, false); } |
289 |
289 |
290 //x\e |
290 ///\e |
291 |
291 |
292 //x This function hides \c e in the graph, i.e. the iteration |
292 /// This function hides \c e in the graph, i.e. the iteration |
293 //x jumps over it. This is done by simply setting the value of \c e |
293 /// jumps over it. This is done by simply setting the value of \c e |
294 //x to be false in the corresponding edge-map. |
294 /// to be false in the corresponding edge-map. |
295 void hide(const Edge& e) const { edge_filter_map->set(e, false); } |
295 void hide(const Edge& e) const { edge_filter_map->set(e, false); } |
296 |
296 |
297 //x\e |
297 ///\e |
298 |
298 |
299 //x The value of \c n is set to be true in the node-map which stores |
299 /// The value of \c n is set to be true in the node-map which stores |
300 //x hide information. If \c n was hidden previuosly, then it is shown |
300 /// hide information. If \c n was hidden previuosly, then it is shown |
301 //x again |
301 /// again |
302 void unHide(const Node& n) const { node_filter_map->set(n, true); } |
302 void unHide(const Node& n) const { node_filter_map->set(n, true); } |
303 |
303 |
304 //x\e |
304 ///\e |
305 |
305 |
306 //x The value of \c e is set to be true in the edge-map which stores |
306 /// The value of \c e is set to be true in the edge-map which stores |
307 //x hide information. If \c e was hidden previuosly, then it is shown |
307 /// hide information. If \c e was hidden previuosly, then it is shown |
308 //x again |
308 /// again |
309 void unHide(const Edge& e) const { edge_filter_map->set(e, true); } |
309 void unHide(const Edge& e) const { edge_filter_map->set(e, true); } |
310 |
310 |
311 //x Returns true if \c n is hidden. |
311 /// Returns true if \c n is hidden. |
312 |
312 |
313 //x\e |
313 ///\e |
314 //x |
314 /// |
315 bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } |
315 bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } |
316 |
316 |
317 //x Returns true if \c n is hidden. |
317 /// Returns true if \c n is hidden. |
318 |
318 |
319 //x\e |
319 ///\e |
320 //x |
320 /// |
321 bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } |
321 bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } |
322 |
322 |
323 typedef False NodeNumTag; |
323 typedef False NodeNumTag; |
324 typedef False EdgeNumTag; |
324 typedef False EdgeNumTag; |
325 }; |
325 }; |
384 void nextOut(Edge& i) const { |
384 void nextOut(Edge& i) const { |
385 Parent::nextOut(i); |
385 Parent::nextOut(i); |
386 while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextOut(i); |
386 while (i!=INVALID && !(*edge_filter_map)[i]) Parent::nextOut(i); |
387 } |
387 } |
388 |
388 |
389 //x\e |
389 ///\e |
390 |
390 |
391 //x This function hides \c n in the graph, i.e. the iteration |
391 /// This function hides \c n in the graph, i.e. the iteration |
392 //x jumps over it. This is done by simply setting the value of \c n |
392 /// jumps over it. This is done by simply setting the value of \c n |
393 //x to be false in the corresponding node-map. |
393 /// to be false in the corresponding node-map. |
394 void hide(const Node& n) const { node_filter_map->set(n, false); } |
394 void hide(const Node& n) const { node_filter_map->set(n, false); } |
395 |
395 |
396 //x\e |
396 ///\e |
397 |
397 |
398 //x This function hides \c e in the graph, i.e. the iteration |
398 /// This function hides \c e in the graph, i.e. the iteration |
399 //x jumps over it. This is done by simply setting the value of \c e |
399 /// jumps over it. This is done by simply setting the value of \c e |
400 //x to be false in the corresponding edge-map. |
400 /// to be false in the corresponding edge-map. |
401 void hide(const Edge& e) const { edge_filter_map->set(e, false); } |
401 void hide(const Edge& e) const { edge_filter_map->set(e, false); } |
402 |
402 |
403 //x\e |
403 ///\e |
404 |
404 |
405 //x The value of \c n is set to be true in the node-map which stores |
405 /// The value of \c n is set to be true in the node-map which stores |
406 //x hide information. If \c n was hidden previuosly, then it is shown |
406 /// hide information. If \c n was hidden previuosly, then it is shown |
407 //x again |
407 /// again |
408 void unHide(const Node& n) const { node_filter_map->set(n, true); } |
408 void unHide(const Node& n) const { node_filter_map->set(n, true); } |
409 |
409 |
410 //x\e |
410 ///\e |
411 |
411 |
412 //x The value of \c e is set to be true in the edge-map which stores |
412 /// The value of \c e is set to be true in the edge-map which stores |
413 //x hide information. If \c e was hidden previuosly, then it is shown |
413 /// hide information. If \c e was hidden previuosly, then it is shown |
414 //x again |
414 /// again |
415 void unHide(const Edge& e) const { edge_filter_map->set(e, true); } |
415 void unHide(const Edge& e) const { edge_filter_map->set(e, true); } |
416 |
416 |
417 //x Returns true if \c n is hidden. |
417 /// Returns true if \c n is hidden. |
418 |
418 |
419 //x\e |
419 ///\e |
420 //x |
420 /// |
421 bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } |
421 bool hidden(const Node& n) const { return !(*node_filter_map)[n]; } |
422 |
422 |
423 //x Returns true if \c n is hidden. |
423 /// Returns true if \c n is hidden. |
424 |
424 |
425 //x\e |
425 ///\e |
426 //x |
426 /// |
427 bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } |
427 bool hidden(const Edge& e) const { return !(*edge_filter_map)[e]; } |
428 |
428 |
429 typedef False NodeNumTag; |
429 typedef False NodeNumTag; |
430 typedef False EdgeNumTag; |
430 typedef False EdgeNumTag; |
431 }; |
431 }; |
432 |
432 |
433 //x\brief A graph adaptor for hiding nodes and edges from a graph. |
433 /// \brief A graph adaptor for hiding nodes and edges from a graph. |
434 //x\ingroup graph_adaptors |
434 /// \ingroup graph_adaptors |
435 //x |
435 /// |
436 //x\warning Graph adaptors are in even more experimental |
436 /// \warning Graph adaptors are in even more experimental state than the |
437 //xstate than the other |
437 /// other parts of the lib. Use them at you own risk. |
438 //xparts of the lib. Use them at you own risk. |
438 /// |
439 //x |
439 /// SubGraphAdaptor shows the graph with filtered node-set and |
440 //xSubGraphAdaptor shows the graph with filtered node-set and |
440 /// edge-set. If the \c checked parameter is true then it filters the edgeset |
441 //xedge-set. If the \c checked parameter is true then it filters the edgeset |
441 /// to do not get invalid edges without source or target. |
442 //xto do not get invalid edges without source or target. |
442 /// Let \f$ G=(V, A) \f$ be a directed graph |
443 //xLet \f$G=(V, A)\f$ be a directed graph |
443 /// and suppose that the graph instance \c g of type ListGraph |
444 //xand suppose that the graph instance \c g of type ListGraph implements |
444 /// implements \f$ G \f$ . |
445 //x\f$G\f$. |
445 /// Let moreover \f$ b_V \f$ and \f$ b_A \f$ be bool-valued functions resp. |
446 //x/Let moreover \f$b_V\f$ and |
446 /// on the node-set and edge-set. |
447 //x\f$b_A\f$ be bool-valued functions resp. on the node-set and edge-set. |
447 /// SubGraphAdaptor<...>::NodeIt iterates |
448 //xSubGraphAdaptor<...>::NodeIt iterates |
448 /// on the node-set \f$ \{v\in V : b_V(v)=true\} \f$ and |
449 //xon the node-set \f$\{v\in V : b_V(v)=true\}\f$ and |
449 /// SubGraphAdaptor<...>::EdgeIt iterates |
450 //xSubGraphAdaptor<...>::EdgeIt iterates |
450 /// on the edge-set \f$ \{e\in A : b_A(e)=true\} \f$ . Similarly, |
451 //xon the edge-set \f$\{e\in A : b_A(e)=true\}\f$. Similarly, |
451 /// SubGraphAdaptor<...>::OutEdgeIt and |
452 //xSubGraphAdaptor<...>::OutEdgeIt and |
452 /// SubGraphAdaptor<...>::InEdgeIt iterates |
453 //xSubGraphAdaptor<...>::InEdgeIt iterates |
453 /// only on edges leaving and entering a specific node which have true value. |
454 //xonly on edges leaving and entering a specific node which have true value. |
454 /// |
455 //x |
455 /// If the \c checked template parameter is false then we have to note that |
456 //xIf the \c checked template parameter is false then we have to note that |
456 /// the node-iterator cares only the filter on the node-set, and the |
457 //xthe node-iterator cares only the filter on the node-set, and the |
457 /// edge-iterator cares only the filter on the edge-set. |
458 //xedge-iterator cares only the filter on the edge-set. |
458 /// This way the edge-map |
459 //xThis way the edge-map |
459 /// should filter all edges which's source or target is filtered by the |
460 //xshould filter all edges which's source or target is filtered by the |
460 /// node-filter. |
461 //xnode-filter. |
461 /// \code |
462 //x\code |
462 /// typedef ListGraph Graph; |
463 //xtypedef ListGraph Graph; |
463 /// Graph g; |
464 //xGraph g; |
464 /// typedef Graph::Node Node; |
465 //xtypedef Graph::Node Node; |
465 /// typedef Graph::Edge Edge; |
466 //xtypedef Graph::Edge Edge; |
466 /// Node u=g.addNode(); //node of id 0 |
467 //xNode u=g.addNode(); //node of id 0 |
467 /// Node v=g.addNode(); //node of id 1 |
468 //xNode v=g.addNode(); //node of id 1 |
468 /// Node e=g.addEdge(u, v); //edge of id 0 |
469 //xNode e=g.addEdge(u, v); //edge of id 0 |
469 /// Node f=g.addEdge(v, u); //edge of id 1 |
470 //xNode f=g.addEdge(v, u); //edge of id 1 |
470 /// Graph::NodeMap<bool> nm(g, true); |
471 //xGraph::NodeMap<bool> nm(g, true); |
471 /// nm.set(u, false); |
472 //xnm.set(u, false); |
472 /// Graph::EdgeMap<bool> em(g, true); |
473 //xGraph::EdgeMap<bool> em(g, true); |
473 /// em.set(e, false); |
474 //xem.set(e, false); |
474 /// typedef SubGraphAdaptor<Graph, Graph::NodeMap<bool>, Graph::EdgeMap<bool> > SubGW; |
475 //xtypedef SubGraphAdaptor<Graph, Graph::NodeMap<bool>, Graph::EdgeMap<bool> > SubGW; |
475 /// SubGW gw(g, nm, em); |
476 //xSubGW gw(g, nm, em); |
476 /// for (SubGW::NodeIt n(gw); n!=INVALID; ++n) std::cout << g.id(n) << std::endl; |
477 //xfor (SubGW::NodeIt n(gw); n!=INVALID; ++n) std::cout << g.id(n) << std::endl; |
477 /// std::cout << ":-)" << std::endl; |
478 //xstd::cout << ":-)" << std::endl; |
478 /// for (SubGW::EdgeIt e(gw); e!=INVALID; ++e) std::cout << g.id(e) << std::endl; |
479 //xfor (SubGW::EdgeIt e(gw); e!=INVALID; ++e) std::cout << g.id(e) << std::endl; |
479 /// \endcode |
480 //x\endcode |
480 /// The output of the above code is the following. |
481 //xThe output of the above code is the following. |
481 /// \code |
482 //x\code |
482 /// 1 |
483 //x1 |
483 /// :-) |
484 //x:-) |
484 /// 1 |
485 //x1 |
485 /// \endcode |
486 //x\endcode |
486 /// Note that \c n is of type \c SubGW::NodeIt, but it can be converted to |
487 //xNote that \c n is of type \c SubGW::NodeIt, but it can be converted to |
487 /// \c Graph::Node that is why \c g.id(n) can be applied. |
488 //x\c Graph::Node that is why \c g.id(n) can be applied. |
488 /// |
489 //x |
489 /// For other examples see also the documentation of NodeSubGraphAdaptor and |
490 //xFor other examples see also the documentation of NodeSubGraphAdaptor and |
490 /// EdgeSubGraphAdaptor. |
491 //xEdgeSubGraphAdaptor. |
491 /// |
492 //x |
492 /// \author Marton Makai |
493 //x\author Marton Makai |
|
494 |
493 |
495 template<typename _Graph, typename NodeFilterMap, |
494 template<typename _Graph, typename NodeFilterMap, |
496 typename EdgeFilterMap, bool checked = true> |
495 typename EdgeFilterMap, bool checked = true> |
497 class SubGraphAdaptor : |
496 class SubGraphAdaptor : |
498 public IterableGraphExtender< |
497 public IterableGraphExtender< |
545 Parent::setEdgeFilterMap(const_true_map); |
544 Parent::setEdgeFilterMap(const_true_map); |
546 } |
545 } |
547 }; |
546 }; |
548 |
547 |
549 |
548 |
550 //x\brief An adaptor for hiding edges from a graph. |
549 ///\brief An adaptor for hiding edges from a graph. |
551 //x |
550 /// |
552 //x\warning Graph adaptors are in even more experimental state |
551 ///\warning Graph adaptors are in even more experimental state |
553 //xthan the other parts of the lib. Use them at you own risk. |
552 ///than the other parts of the lib. Use them at you own risk. |
554 //x |
553 /// |
555 //xAn adaptor for hiding edges from a graph. |
554 ///An adaptor for hiding edges from a graph. |
556 //xThis adaptor specializes SubGraphAdaptor in the way that |
555 ///This adaptor specializes SubGraphAdaptor in the way that |
557 //xonly the edge-set |
556 ///only the edge-set |
558 //xcan be filtered. The usefulness of this adaptor is demonstrated in the |
557 ///can be filtered. The usefulness of this adaptor is demonstrated in the |
559 //xproblem of searching a maximum number of edge-disjoint shortest paths |
558 ///problem of searching a maximum number of edge-disjoint shortest paths |
560 //xbetween |
559 ///between |
561 //xtwo nodes \c s and \c t. Shortest here means being shortest w.r.t. |
560 ///two nodes \c s and \c t. Shortest here means being shortest w.r.t. |
562 //xnon-negative edge-lengths. Note that |
561 ///non-negative edge-lengths. Note that |
563 //xthe comprehension of the presented solution |
562 ///the comprehension of the presented solution |
564 //xneed's some elementary knowledge from combinatorial optimization. |
563 ///need's some elementary knowledge from combinatorial optimization. |
565 //x |
564 /// |
566 //xIf a single shortest path is to be |
565 ///If a single shortest path is to be |
567 //xsearched between \c s and \c t, then this can be done easily by |
566 ///searched between \c s and \c t, then this can be done easily by |
568 //xapplying the Dijkstra algorithm. What happens, if a maximum number of |
567 ///applying the Dijkstra algorithm. What happens, if a maximum number of |
569 //xedge-disjoint shortest paths is to be computed. It can be proved that an |
568 ///edge-disjoint shortest paths is to be computed. It can be proved that an |
570 //xedge can be in a shortest path if and only |
569 ///edge can be in a shortest path if and only |
571 //xif it is tight with respect to |
570 ///if it is tight with respect to |
572 //xthe potential function computed by Dijkstra. |
571 ///the potential function computed by Dijkstra. |
573 //xMoreover, any path containing |
572 ///Moreover, any path containing |
574 //xonly such edges is a shortest one. |
573 ///only such edges is a shortest one. |
575 //xThus we have to compute a maximum number |
574 ///Thus we have to compute a maximum number |
576 //xof edge-disjoint paths between \c s and \c t in |
575 ///of edge-disjoint paths between \c s and \c t in |
577 //xthe graph which has edge-set |
576 ///the graph which has edge-set |
578 //xall the tight edges. The computation will be demonstrated |
577 ///all the tight edges. The computation will be demonstrated |
579 //xon the following |
578 ///on the following |
580 //xgraph, which is read from the dimacs file \c sub_graph_adaptor_demo.dim. |
579 ///graph, which is read from the dimacs file \c sub_graph_adaptor_demo.dim. |
581 //xThe full source code is available in \ref sub_graph_adaptor_demo.cc. |
580 ///The full source code is available in \ref sub_graph_adaptor_demo.cc. |
582 //xIf you are interested in more demo programs, you can use |
581 ///If you are interested in more demo programs, you can use |
583 //x\ref dim_to_dot.cc to generate .dot files from dimacs files. |
582 ///\ref dim_to_dot.cc to generate .dot files from dimacs files. |
584 //xThe .dot file of the following figure was generated by |
583 ///The .dot file of the following figure was generated by |
585 //xthe demo program \ref dim_to_dot.cc. |
584 ///the demo program \ref dim_to_dot.cc. |
586 //x |
585 /// |
587 //x\dot |
586 ///\dot |
588 //xdigraph lemon_dot_example { |
587 ///digraph lemon_dot_example { |
589 //xnode [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; |
588 ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; |
590 //xn0 [ label="0 (s)" ]; |
589 ///n0 [ label="0 (s)" ]; |
591 //xn1 [ label="1" ]; |
590 ///n1 [ label="1" ]; |
592 //xn2 [ label="2" ]; |
591 ///n2 [ label="2" ]; |
593 //xn3 [ label="3" ]; |
592 ///n3 [ label="3" ]; |
594 //xn4 [ label="4" ]; |
593 ///n4 [ label="4" ]; |
595 //xn5 [ label="5" ]; |
594 ///n5 [ label="5" ]; |
596 //xn6 [ label="6 (t)" ]; |
595 ///n6 [ label="6 (t)" ]; |
597 //xedge [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; |
596 ///edge [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; |
598 //xn5 -> n6 [ label="9, length:4" ]; |
597 ///n5 -> n6 [ label="9, length:4" ]; |
599 //xn4 -> n6 [ label="8, length:2" ]; |
598 ///n4 -> n6 [ label="8, length:2" ]; |
600 //xn3 -> n5 [ label="7, length:1" ]; |
599 ///n3 -> n5 [ label="7, length:1" ]; |
601 //xn2 -> n5 [ label="6, length:3" ]; |
600 ///n2 -> n5 [ label="6, length:3" ]; |
602 //xn2 -> n6 [ label="5, length:5" ]; |
601 ///n2 -> n6 [ label="5, length:5" ]; |
603 //xn2 -> n4 [ label="4, length:2" ]; |
602 ///n2 -> n4 [ label="4, length:2" ]; |
604 //xn1 -> n4 [ label="3, length:3" ]; |
603 ///n1 -> n4 [ label="3, length:3" ]; |
605 //xn0 -> n3 [ label="2, length:1" ]; |
604 ///n0 -> n3 [ label="2, length:1" ]; |
606 //xn0 -> n2 [ label="1, length:2" ]; |
605 ///n0 -> n2 [ label="1, length:2" ]; |
607 //xn0 -> n1 [ label="0, length:3" ]; |
606 ///n0 -> n1 [ label="0, length:3" ]; |
608 //x} |
607 ///} |
609 //x\enddot |
608 ///\enddot |
610 //x |
609 /// |
611 //x\code |
610 ///\code |
612 //xGraph g; |
611 ///Graph g; |
613 //xNode s, t; |
612 ///Node s, t; |
614 //xLengthMap length(g); |
613 ///LengthMap length(g); |
615 //x |
614 /// |
616 //xreadDimacs(std::cin, g, length, s, t); |
615 ///readDimacs(std::cin, g, length, s, t); |
617 //x |
616 /// |
618 //xcout << "edges with lengths (of form id, source--length->target): " << endl; |
617 ///cout << "edges with lengths (of form id, source--length->target): " << endl; |
619 //xfor(EdgeIt e(g); e!=INVALID; ++e) |
618 ///for(EdgeIt e(g); e!=INVALID; ++e) |
620 //x cout << g.id(e) << ", " << g.id(g.source(e)) << "--" |
619 /// cout << g.id(e) << ", " << g.id(g.source(e)) << "--" |
621 //x << length[e] << "->" << g.id(g.target(e)) << endl; |
620 /// << length[e] << "->" << g.id(g.target(e)) << endl; |
622 //x |
621 /// |
623 //xcout << "s: " << g.id(s) << " t: " << g.id(t) << endl; |
622 ///cout << "s: " << g.id(s) << " t: " << g.id(t) << endl; |
624 //x\endcode |
623 ///\endcode |
625 //xNext, the potential function is computed with Dijkstra. |
624 ///Next, the potential function is computed with Dijkstra. |
626 //x\code |
625 ///\code |
627 //xtypedef Dijkstra<Graph, LengthMap> Dijkstra; |
626 ///typedef Dijkstra<Graph, LengthMap> Dijkstra; |
628 //xDijkstra dijkstra(g, length); |
627 ///Dijkstra dijkstra(g, length); |
629 //xdijkstra.run(s); |
628 ///dijkstra.run(s); |
630 //x\endcode |
629 ///\endcode |
631 //xNext, we consrtruct a map which filters the edge-set to the tight edges. |
630 ///Next, we consrtruct a map which filters the edge-set to the tight edges. |
632 //x\code |
631 ///\code |
633 //xtypedef TightEdgeFilterMap<Graph, const Dijkstra::DistMap, LengthMap> |
632 ///typedef TightEdgeFilterMap<Graph, const Dijkstra::DistMap, LengthMap> |
634 //x TightEdgeFilter; |
633 /// TightEdgeFilter; |
635 //xTightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length); |
634 ///TightEdgeFilter tight_edge_filter(g, dijkstra.distMap(), length); |
636 //x |
635 /// |
637 //xtypedef EdgeSubGraphAdaptor<Graph, TightEdgeFilter> SubGW; |
636 ///typedef EdgeSubGraphAdaptor<Graph, TightEdgeFilter> SubGW; |
638 //xSubGW gw(g, tight_edge_filter); |
637 ///SubGW gw(g, tight_edge_filter); |
639 //x\endcode |
638 ///\endcode |
640 //xThen, the maximum nimber of edge-disjoint \c s-\c t paths are computed |
639 ///Then, the maximum nimber of edge-disjoint \c s-\c t paths are computed |
641 //xwith a max flow algorithm Preflow. |
640 ///with a max flow algorithm Preflow. |
642 //x\code |
641 ///\code |
643 //xConstMap<Edge, int> const_1_map(1); |
642 ///ConstMap<Edge, int> const_1_map(1); |
644 //xGraph::EdgeMap<int> flow(g, 0); |
643 ///Graph::EdgeMap<int> flow(g, 0); |
645 //x |
644 /// |
646 //xPreflow<SubGW, int, ConstMap<Edge, int>, Graph::EdgeMap<int> > |
645 ///Preflow<SubGW, int, ConstMap<Edge, int>, Graph::EdgeMap<int> > |
647 //x preflow(gw, s, t, const_1_map, flow); |
646 /// preflow(gw, s, t, const_1_map, flow); |
648 //xpreflow.run(); |
647 ///preflow.run(); |
649 //x\endcode |
648 ///\endcode |
650 //xLast, the output is: |
649 ///Last, the output is: |
651 //x\code |
650 ///\code |
652 //xcout << "maximum number of edge-disjoint shortest path: " |
651 ///cout << "maximum number of edge-disjoint shortest path: " |
653 //x << preflow.flowValue() << endl; |
652 /// << preflow.flowValue() << endl; |
654 //xcout << "edges of the maximum number of edge-disjoint shortest s-t paths: " |
653 ///cout << "edges of the maximum number of edge-disjoint shortest s-t paths: " |
655 //x << endl; |
654 /// << endl; |
656 //xfor(EdgeIt e(g); e!=INVALID; ++e) |
655 ///for(EdgeIt e(g); e!=INVALID; ++e) |
657 //x if (flow[e]) |
656 /// if (flow[e]) |
658 //x cout << " " << g.id(g.source(e)) << "--" |
657 /// cout << " " << g.id(g.source(e)) << "--" |
659 //x << length[e] << "->" << g.id(g.target(e)) << endl; |
658 /// << length[e] << "->" << g.id(g.target(e)) << endl; |
660 //x\endcode |
659 ///\endcode |
661 //xThe program has the following (expected :-)) output: |
660 ///The program has the following (expected :-)) output: |
662 //x\code |
661 ///\code |
663 //xedges with lengths (of form id, source--length->target): |
662 ///edges with lengths (of form id, source--length->target): |
664 //x 9, 5--4->6 |
663 /// 9, 5--4->6 |
665 //x 8, 4--2->6 |
664 /// 8, 4--2->6 |
666 //x 7, 3--1->5 |
665 /// 7, 3--1->5 |
667 //x 6, 2--3->5 |
666 /// 6, 2--3->5 |
668 //x 5, 2--5->6 |
667 /// 5, 2--5->6 |
669 //x 4, 2--2->4 |
668 /// 4, 2--2->4 |
670 //x 3, 1--3->4 |
669 /// 3, 1--3->4 |
671 //x 2, 0--1->3 |
670 /// 2, 0--1->3 |
672 //x 1, 0--2->2 |
671 /// 1, 0--2->2 |
673 //x 0, 0--3->1 |
672 /// 0, 0--3->1 |
674 //xs: 0 t: 6 |
673 ///s: 0 t: 6 |
675 //xmaximum number of edge-disjoint shortest path: 2 |
674 ///maximum number of edge-disjoint shortest path: 2 |
676 //xedges of the maximum number of edge-disjoint shortest s-t paths: |
675 ///edges of the maximum number of edge-disjoint shortest s-t paths: |
677 //x 9, 5--4->6 |
676 /// 9, 5--4->6 |
678 //x 8, 4--2->6 |
677 /// 8, 4--2->6 |
679 //x 7, 3--1->5 |
678 /// 7, 3--1->5 |
680 //x 4, 2--2->4 |
679 /// 4, 2--2->4 |
681 //x 2, 0--1->3 |
680 /// 2, 0--1->3 |
682 //x 1, 0--2->2 |
681 /// 1, 0--2->2 |
683 //x\endcode |
682 ///\endcode |
684 //x |
683 /// |
685 //x\author Marton Makai |
684 ///\author Marton Makai |
686 template<typename Graph, typename EdgeFilterMap> |
685 template<typename Graph, typename EdgeFilterMap> |
687 class EdgeSubGraphAdaptor : |
686 class EdgeSubGraphAdaptor : |
688 public SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, |
687 public SubGraphAdaptor<Graph, ConstMap<typename Graph::Node,bool>, |
689 EdgeFilterMap, false> { |
688 EdgeFilterMap, false> { |
690 public: |
689 public: |
1037 }; |
1036 }; |
1038 |
1037 |
1039 }; |
1038 }; |
1040 |
1039 |
1041 |
1040 |
1042 //x\brief An adaptor for composing a subgraph of a |
1041 ///\brief An adaptor for composing a subgraph of a |
1043 //x bidirected graph made from a directed one. |
1042 /// bidirected graph made from a directed one. |
1044 //x\ingroup graph_adaptors |
1043 ///\ingroup graph_adaptors |
1045 //x |
1044 /// |
1046 //x An adaptor for composing a subgraph of a |
1045 /// An adaptor for composing a subgraph of a |
1047 //x bidirected graph made from a directed one. |
1046 /// bidirected graph made from a directed one. |
1048 //x |
1047 /// |
1049 //x\warning Graph adaptors are in even more experimental state |
1048 ///\warning Graph adaptors are in even more experimental state |
1050 //xthan the other |
1049 ///than the other |
1051 //xparts of the lib. Use them at you own risk. |
1050 ///parts of the lib. Use them at you own risk. |
1052 //x |
1051 /// |
1053 //x Let \f$G=(V, A)\f$ be a directed graph and for each directed edge |
1052 /// Let \f$ G=(V, A) \f$ be a directed graph and for each directed edge |
1054 //x \f$e\in A\f$, let \f$\bar e\f$ denote the edge obtained by |
1053 /// \f$ e\in A \f$ , let \f$ \bar e \f$ denote the edge obtained by |
1055 //x reversing its orientation. We are given moreover two bool valued |
1054 /// reversing its orientation. We are given moreover two bool valued |
1056 //x maps on the edge-set, |
1055 /// maps on the edge-set, |
1057 //x \f$forward\_filter\f$, and \f$backward\_filter\f$. |
1056 /// \f$ forward\_filter \f$ , and \f$ backward\_filter \f$ . |
1058 //x SubBidirGraphAdaptor implements the graph structure with node-set |
1057 /// SubBidirGraphAdaptor implements the graph structure with node-set |
1059 //x \f$V\f$ and edge-set |
1058 /// \f$ V \f$ and edge-set |
1060 //x \f$\{e : e\in A \mbox{ and } forward\_filter(e) \mbox{ is true}\}+\{\bar e : e\in A \mbox{ and } backward\_filter(e) \mbox{ is true}\}\f$. |
1059 /// \f$ \{e : e\in A \mbox{ and } forward\_filter(e) \mbox{ is true}\}+\{\bar e : e\in A \mbox{ and } backward\_filter(e) \mbox{ is true}\} \f$ . |
1061 //x The purpose of writing + instead of union is because parallel |
1060 /// The purpose of writing + instead of union is because parallel |
1062 //x edges can arise. (Similarly, antiparallel edges also can arise). |
1061 /// edges can arise. (Similarly, antiparallel edges also can arise). |
1063 //x In other words, a subgraph of the bidirected graph obtained, which |
1062 /// In other words, a subgraph of the bidirected graph obtained, which |
1064 //x is given by orienting the edges of the original graph in both directions. |
1063 /// is given by orienting the edges of the original graph in both directions. |
1065 //x As the oppositely directed edges are logically different, |
1064 /// As the oppositely directed edges are logically different, |
1066 //x the maps are able to attach different values for them. |
1065 /// the maps are able to attach different values for them. |
1067 //x |
1066 /// |
1068 //x An example for such a construction is \c RevGraphAdaptor where the |
1067 /// An example for such a construction is \c RevGraphAdaptor where the |
1069 //x forward_filter is everywhere false and the backward_filter is |
1068 /// forward_filter is everywhere false and the backward_filter is |
1070 //x everywhere true. We note that for sake of efficiency, |
1069 /// everywhere true. We note that for sake of efficiency, |
1071 //x \c RevGraphAdaptor is implemented in a different way. |
1070 /// \c RevGraphAdaptor is implemented in a different way. |
1072 //x But BidirGraphAdaptor is obtained from |
1071 /// But BidirGraphAdaptor is obtained from |
1073 //x SubBidirGraphAdaptor by considering everywhere true |
1072 /// SubBidirGraphAdaptor by considering everywhere true |
1074 //x valued maps both for forward_filter and backward_filter. |
1073 /// valued maps both for forward_filter and backward_filter. |
1075 //x |
1074 /// |
1076 //x The most important application of SubBidirGraphAdaptor |
1075 /// The most important application of SubBidirGraphAdaptor |
1077 //x is ResGraphAdaptor, which stands for the residual graph in directed |
1076 /// is ResGraphAdaptor, which stands for the residual graph in directed |
1078 //x flow and circulation problems. |
1077 /// flow and circulation problems. |
1079 //x As adaptors usually, the SubBidirGraphAdaptor implements the |
1078 /// As adaptors usually, the SubBidirGraphAdaptor implements the |
1080 //x above mentioned graph structure without its physical storage, |
1079 /// above mentioned graph structure without its physical storage, |
1081 //x that is the whole stuff is stored in constant memory. |
1080 /// that is the whole stuff is stored in constant memory. |
1082 template<typename _Graph, |
1081 template<typename _Graph, |
1083 typename ForwardFilterMap, typename BackwardFilterMap> |
1082 typename ForwardFilterMap, typename BackwardFilterMap> |
1084 class SubBidirGraphAdaptor : |
1083 class SubBidirGraphAdaptor : |
1085 public IterableGraphExtender< |
1084 public IterableGraphExtender< |
1086 SubBidirGraphAdaptorBase<_Graph, ForwardFilterMap, BackwardFilterMap> > { |
1085 SubBidirGraphAdaptorBase<_Graph, ForwardFilterMap, BackwardFilterMap> > { |
1178 return (Number(0) < Number((*flow)[e])); |
1177 return (Number(0) < Number((*flow)[e])); |
1179 } |
1178 } |
1180 }; |
1179 }; |
1181 |
1180 |
1182 |
1181 |
1183 //x\brief An adaptor for composing the residual |
1182 ///\brief An adaptor for composing the residual |
1184 //xgraph for directed flow and circulation problems. |
1183 ///graph for directed flow and circulation problems. |
1185 //x\ingroup graph_adaptors |
1184 ///\ingroup graph_adaptors |
1186 //x |
1185 /// |
1187 //xAn adaptor for composing the residual graph for |
1186 ///An adaptor for composing the residual graph for |
1188 //xdirected flow and circulation problems. |
1187 ///directed flow and circulation problems. |
1189 //xLet \f$G=(V, A)\f$ be a directed graph and let \f$F\f$ be a |
1188 ///Let \f$ G=(V, A) \f$ be a directed graph and let \f$ F \f$ be a |
1190 //xnumber type. Let moreover |
1189 ///number type. Let moreover |
1191 //x\f$f,c:A\to F\f$, be functions on the edge-set. |
1190 /// \f$ f,c:A\to F \f$ , be functions on the edge-set. |
1192 //xIn the appications of ResGraphAdaptor, \f$f\f$ usually stands for a flow |
1191 ///In the appications of ResGraphAdaptor, \f$ f \f$ usually stands for a flow |
1193 //xand \f$c\f$ for a capacity function. |
1192 ///and \f$ c \f$ for a capacity function. |
1194 //xSuppose that a graph instange \c g of type |
1193 ///Suppose that a graph instange \c g of type |
1195 //x\c ListGraph implements \f$G\f$ . |
1194 ///\c ListGraph implements \f$ G \f$ . |
1196 //x\code |
1195 ///\code |
1197 //x ListGraph g; |
1196 /// ListGraph g; |
1198 //x\endcode |
1197 ///\endcode |
1199 //xThen RevGraphAdaptor implements the graph structure with node-set |
1198 ///Then RevGraphAdaptor implements the graph structure with node-set |
1200 //x\f$V\f$ and edge-set \f$A_{forward}\cup A_{backward}\f$, where |
1199 /// \f$ V \f$ and edge-set \f$ A_{forward}\cup A_{backward} \f$ , where |
1201 //x\f$A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\}\f$ and |
1200 /// \f$ A_{forward}=\{uv : uv\in A, f(uv)<c(uv)\} \f$ and |
1202 //x\f$A_{backward}=\{vu : uv\in A, f(uv)>0\}\f$, |
1201 /// \f$ A_{backward}=\{vu : uv\in A, f(uv)>0\} \f$ , |
1203 //xi.e. the so called residual graph. |
1202 ///i.e. the so called residual graph. |
1204 //xWhen we take the union \f$A_{forward}\cup A_{backward}\f$, |
1203 ///When we take the union \f$ A_{forward}\cup A_{backward} \f$ , |
1205 //xmultilicities are counted, i.e. if an edge is in both |
1204 ///multilicities are counted, i.e. if an edge is in both |
1206 //x\f$A_{forward}\f$ and \f$A_{backward}\f$, then in the adaptor it |
1205 /// \f$ A_{forward} \f$ and \f$ A_{backward} \f$ , then in the adaptor it |
1207 //xappears twice. |
1206 ///appears twice. |
1208 //xThe following code shows how |
1207 ///The following code shows how |
1209 //xsuch an instance can be constructed. |
1208 ///such an instance can be constructed. |
1210 //x\code |
1209 ///\code |
1211 //xtypedef ListGraph Graph; |
1210 ///typedef ListGraph Graph; |
1212 //xGraph::EdgeMap<int> f(g); |
1211 ///Graph::EdgeMap<int> f(g); |
1213 //xGraph::EdgeMap<int> c(g); |
1212 ///Graph::EdgeMap<int> c(g); |
1214 //xResGraphAdaptor<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > gw(g); |
1213 ///ResGraphAdaptor<Graph, int, Graph::EdgeMap<int>, Graph::EdgeMap<int> > gw(g); |
1215 //x\endcode |
1214 ///\endcode |
1216 //x\author Marton Makai |
1215 ///\author Marton Makai |
1217 //x |
1216 /// |
1218 template<typename Graph, typename Number, |
1217 template<typename Graph, typename Number, |
1219 typename CapacityMap, typename FlowMap> |
1218 typename CapacityMap, typename FlowMap> |
1220 class ResGraphAdaptor : |
1219 class ResGraphAdaptor : |
1221 public SubBidirGraphAdaptor< |
1220 public SubBidirGraphAdaptor< |
1222 Graph, |
1221 Graph, |