36 |
36 |
37 #include <algorithm> |
37 #include <algorithm> |
38 |
38 |
39 namespace lemon { |
39 namespace lemon { |
40 |
40 |
41 ///\brief Base type for the Digraph Adaptors |
|
42 /// |
|
43 ///Base type for the Digraph Adaptors |
|
44 /// |
|
45 ///This is the base type for most of LEMON digraph adaptors. This |
|
46 ///class implements a trivial digraph adaptor i.e. it only wraps the |
|
47 ///functions and types of the digraph. The purpose of this class is |
|
48 ///to make easier implementing digraph adaptors. E.g. if an adaptor |
|
49 ///is considered which differs from the wrapped digraph only in some |
|
50 ///of its functions or types, then it can be derived from |
|
51 ///DigraphAdaptor, and only the differences should be implemented. |
|
52 template<typename _Digraph> |
41 template<typename _Digraph> |
53 class DigraphAdaptorBase { |
42 class DigraphAdaptorBase { |
54 public: |
43 public: |
55 typedef _Digraph Digraph; |
44 typedef _Digraph Digraph; |
56 typedef DigraphAdaptorBase Adaptor; |
45 typedef DigraphAdaptorBase Adaptor; |
164 |
153 |
165 }; |
154 }; |
166 |
155 |
167 }; |
156 }; |
168 |
157 |
169 ///\ingroup graph_adaptors |
|
170 /// |
|
171 ///\brief Trivial Digraph Adaptor |
|
172 /// |
|
173 /// This class is an adaptor which does not change the adapted |
|
174 /// digraph. It can be used only to test the digraph adaptors. |
|
175 template <typename _Digraph> |
|
176 class DigraphAdaptor : |
|
177 public DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > { |
|
178 public: |
|
179 typedef _Digraph Digraph; |
|
180 typedef DigraphAdaptorExtender<DigraphAdaptorBase<_Digraph> > Parent; |
|
181 protected: |
|
182 DigraphAdaptor() : Parent() { } |
|
183 |
|
184 public: |
|
185 explicit DigraphAdaptor(Digraph& digraph) { setDigraph(digraph); } |
|
186 }; |
|
187 |
|
188 /// \brief Just gives back a digraph adaptor |
|
189 /// |
|
190 /// Just gives back a digraph adaptor which |
|
191 /// should be provide original digraph |
|
192 template<typename Digraph> |
|
193 DigraphAdaptor<const Digraph> |
|
194 digraphAdaptor(const Digraph& digraph) { |
|
195 return DigraphAdaptor<const Digraph>(digraph); |
|
196 } |
|
197 |
|
198 |
158 |
199 template <typename _Digraph> |
159 template <typename _Digraph> |
200 class RevDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> { |
160 class RevDigraphAdaptorBase : public DigraphAdaptorBase<_Digraph> { |
201 public: |
161 public: |
202 typedef _Digraph Digraph; |
162 typedef _Digraph Digraph; |
229 /// |
189 /// |
230 ///\brief A digraph adaptor which reverses the orientation of the arcs. |
190 ///\brief A digraph adaptor which reverses the orientation of the arcs. |
231 /// |
191 /// |
232 /// If \c g is defined as |
192 /// If \c g is defined as |
233 ///\code |
193 ///\code |
234 /// ListDigraph g; |
194 /// ListDigraph dg; |
235 ///\endcode |
195 ///\endcode |
236 /// then |
196 /// then |
237 ///\code |
197 ///\code |
238 /// RevDigraphAdaptor<ListDigraph> ga(g); |
198 /// RevDigraphAdaptor<ListDigraph> dga(dg); |
239 ///\endcode |
199 ///\endcode |
240 /// implements the digraph obtained from \c g by |
200 /// implements the digraph obtained from \c dg by |
241 /// reversing the orientation of its arcs. |
201 /// reversing the orientation of its arcs. |
242 /// |
202 /// |
243 /// A good example of using RevDigraphAdaptor is to decide that the |
203 /// A good example of using RevDigraphAdaptor is to decide whether |
244 /// directed graph is wheter strongly connected or not. If from one |
204 /// the directed graph is strongly connected or not. The digraph is |
245 /// node each node is reachable and from each node is reachable this |
205 /// strongly connected iff each node is reachable from one node and |
246 /// node then and just then the digraph is strongly |
206 /// this node is reachable from the others. Instead of this |
247 /// connected. Instead of this condition we use a little bit |
207 /// condition we use a slightly different, from one node each node |
248 /// different. From one node each node ahould be reachable in the |
208 /// is reachable both in the digraph and the reversed digraph. Now |
249 /// digraph and in the reversed digraph. Now this condition can be |
209 /// this condition can be checked with the Dfs algorithm and the |
250 /// checked with the Dfs algorithm class and the RevDigraphAdaptor |
210 /// RevDigraphAdaptor class. |
251 /// algorithm class. |
211 /// |
252 /// |
212 /// The implementation: |
253 /// And look at the code: |
|
254 /// |
|
255 ///\code |
213 ///\code |
256 /// bool stronglyConnected(const Digraph& digraph) { |
214 /// bool stronglyConnected(const Digraph& digraph) { |
257 /// if (NodeIt(digraph) == INVALID) return true; |
215 /// if (NodeIt(digraph) == INVALID) return true; |
258 /// Dfs<Digraph> dfs(digraph); |
216 /// Dfs<Digraph> dfs(digraph); |
259 /// dfs.run(NodeIt(digraph)); |
217 /// dfs.run(NodeIt(digraph)); |
372 Parent::nextOut(i); |
334 Parent::nextOut(i); |
373 while (i != INVALID && (!(*_arc_filter)[i] |
335 while (i != INVALID && (!(*_arc_filter)[i] |
374 || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i); |
336 || !(*_node_filter)[Parent::target(i)])) Parent::nextOut(i); |
375 } |
337 } |
376 |
338 |
377 ///\e |
|
378 |
|
379 /// This function hides \c n in the digraph, i.e. the iteration |
|
380 /// jumps over it. This is done by simply setting the value of \c n |
|
381 /// to be false in the corresponding node-map. |
|
382 void hide(const Node& n) const { _node_filter->set(n, false); } |
339 void hide(const Node& n) const { _node_filter->set(n, false); } |
383 |
|
384 ///\e |
|
385 |
|
386 /// This function hides \c a in the digraph, i.e. the iteration |
|
387 /// jumps over it. This is done by simply setting the value of \c a |
|
388 /// to be false in the corresponding arc-map. |
|
389 void hide(const Arc& a) const { _arc_filter->set(a, false); } |
340 void hide(const Arc& a) const { _arc_filter->set(a, false); } |
390 |
341 |
391 ///\e |
342 void unHide(const Node& n) const { _node_filter->set(n, true); } |
392 |
|
393 /// The value of \c n is set to be true in the node-map which stores |
|
394 /// hide information. If \c n was hidden previuosly, then it is shown |
|
395 /// again |
|
396 void unHide(const Node& n) const { _node_filter->set(n, true); } |
|
397 |
|
398 ///\e |
|
399 |
|
400 /// The value of \c a is set to be true in the arc-map which stores |
|
401 /// hide information. If \c a was hidden previuosly, then it is shown |
|
402 /// again |
|
403 void unHide(const Arc& a) const { _arc_filter->set(a, true); } |
343 void unHide(const Arc& a) const { _arc_filter->set(a, true); } |
404 |
344 |
405 /// Returns true if \c n is hidden. |
|
406 |
|
407 ///\e |
|
408 /// |
|
409 bool hidden(const Node& n) const { return !(*_node_filter)[n]; } |
345 bool hidden(const Node& n) const { return !(*_node_filter)[n]; } |
410 |
|
411 /// Returns true if \c a is hidden. |
|
412 |
|
413 ///\e |
|
414 /// |
|
415 bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; } |
346 bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; } |
416 |
347 |
417 typedef False NodeNumTag; |
348 typedef False NodeNumTag; |
418 typedef False EdgeNumTag; |
349 typedef False EdgeNumTag; |
419 |
350 |
546 void nextOut(Arc& i) const { |
477 void nextOut(Arc& i) const { |
547 Parent::nextOut(i); |
478 Parent::nextOut(i); |
548 while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); |
479 while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); |
549 } |
480 } |
550 |
481 |
551 ///\e |
|
552 |
|
553 /// This function hides \c n in the digraph, i.e. the iteration |
|
554 /// jumps over it. This is done by simply setting the value of \c n |
|
555 /// to be false in the corresponding node-map. |
|
556 void hide(const Node& n) const { _node_filter->set(n, false); } |
482 void hide(const Node& n) const { _node_filter->set(n, false); } |
557 |
|
558 ///\e |
|
559 |
|
560 /// This function hides \c e in the digraph, i.e. the iteration |
|
561 /// jumps over it. This is done by simply setting the value of \c e |
|
562 /// to be false in the corresponding arc-map. |
|
563 void hide(const Arc& e) const { _arc_filter->set(e, false); } |
483 void hide(const Arc& e) const { _arc_filter->set(e, false); } |
564 |
484 |
565 ///\e |
485 void unHide(const Node& n) const { _node_filter->set(n, true); } |
566 |
|
567 /// The value of \c n is set to be true in the node-map which stores |
|
568 /// hide information. If \c n was hidden previuosly, then it is shown |
|
569 /// again |
|
570 void unHide(const Node& n) const { _node_filter->set(n, true); } |
|
571 |
|
572 ///\e |
|
573 |
|
574 /// The value of \c e is set to be true in the arc-map which stores |
|
575 /// hide information. If \c e was hidden previuosly, then it is shown |
|
576 /// again |
|
577 void unHide(const Arc& e) const { _arc_filter->set(e, true); } |
486 void unHide(const Arc& e) const { _arc_filter->set(e, true); } |
578 |
487 |
579 /// Returns true if \c n is hidden. |
|
580 |
|
581 ///\e |
|
582 /// |
|
583 bool hidden(const Node& n) const { return !(*_node_filter)[n]; } |
488 bool hidden(const Node& n) const { return !(*_node_filter)[n]; } |
584 |
|
585 /// Returns true if \c n is hidden. |
|
586 |
|
587 ///\e |
|
588 /// |
|
589 bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; } |
489 bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; } |
590 |
490 |
591 typedef False NodeNumTag; |
491 typedef False NodeNumTag; |
592 typedef False EdgeNumTag; |
492 typedef False EdgeNumTag; |
593 |
493 |
659 /// \ingroup graph_adaptors |
559 /// \ingroup graph_adaptors |
660 /// |
560 /// |
661 /// \brief A digraph adaptor for hiding nodes and arcs from a digraph. |
561 /// \brief A digraph adaptor for hiding nodes and arcs from a digraph. |
662 /// |
562 /// |
663 /// SubDigraphAdaptor shows the digraph with filtered node-set and |
563 /// SubDigraphAdaptor shows the digraph with filtered node-set and |
664 /// arc-set. If the \c checked parameter is true then it filters the arcset |
564 /// arc-set. If the \c checked parameter is true then it filters the arc-set |
665 /// to do not get invalid arcs without source or target. |
565 /// respect to the source and target. |
666 /// Let \f$ G=(V, A) \f$ be a directed digraph |
|
667 /// and suppose that the digraph instance \c g of type ListDigraph |
|
668 /// implements \f$ G \f$. |
|
669 /// Let moreover \f$ b_V \f$ and \f$ b_A \f$ be bool-valued functions resp. |
|
670 /// on the node-set and arc-set. |
|
671 /// SubDigraphAdaptor<...>::NodeIt iterates |
|
672 /// on the node-set \f$ \{v\in V : b_V(v)=true\} \f$ and |
|
673 /// SubDigraphAdaptor<...>::ArcIt iterates |
|
674 /// on the arc-set \f$ \{e\in A : b_A(e)=true\} \f$. Similarly, |
|
675 /// SubDigraphAdaptor<...>::OutArcIt and |
|
676 /// SubDigraphAdaptor<...>::InArcIt iterates |
|
677 /// only on arcs leaving and entering a specific node which have true value. |
|
678 /// |
566 /// |
679 /// If the \c checked template parameter is false then we have to |
567 /// If the \c checked template parameter is false then the |
680 /// note that the node-iterator cares only the filter on the |
568 /// node-iterator cares only the filter on the node-set, and the |
681 /// node-set, and the arc-iterator cares only the filter on the |
569 /// arc-iterator cares only the filter on the arc-set. Therefore |
682 /// arc-set. This way the arc-map should filter all arcs which's |
570 /// the arc-map have to filter all arcs which's source or target is |
683 /// source or target is filtered by the node-filter. |
571 /// filtered by the node-filter. |
684 ///\code |
572 ///\code |
685 /// typedef ListDigraph Digraph; |
573 /// typedef ListDigraph Digraph; |
686 /// DIGRAPH_TYPEDEFS(Digraph); |
574 /// DIGRAPH_TYPEDEFS(Digraph); |
687 /// Digraph g; |
575 /// Digraph g; |
688 /// Node u=g.addNode(); //node of id 0 |
576 /// Node u=g.addNode(); //node of id 0 |
691 /// Arc f=g.addArc(v, u); //arc of id 1 |
579 /// Arc f=g.addArc(v, u); //arc of id 1 |
692 /// BoolNodeMap nm(g, true); |
580 /// BoolNodeMap nm(g, true); |
693 /// nm.set(u, false); |
581 /// nm.set(u, false); |
694 /// BoolArcMap am(g, true); |
582 /// BoolArcMap am(g, true); |
695 /// am.set(a, false); |
583 /// am.set(a, false); |
696 /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubGA; |
584 /// typedef SubDigraphAdaptor<Digraph, BoolNodeMap, BoolArcMap> SubDGA; |
697 /// SubGA ga(g, nm, am); |
585 /// SubDGA ga(g, nm, am); |
698 /// for (SubGA::NodeIt n(ga); n!=INVALID; ++n) |
586 /// for (SubDGA::NodeIt n(ga); n!=INVALID; ++n) |
699 /// std::cout << g.id(n) << std::endl; |
587 /// std::cout << g.id(n) << std::endl; |
700 /// std::cout << ":-)" << std::endl; |
588 /// for (SubDGA::ArcIt a(ga); a!=INVALID; ++a) |
701 /// for (SubGA::ArcIt a(ga); a!=INVALID; ++a) |
|
702 /// std::cout << g.id(a) << std::endl; |
589 /// std::cout << g.id(a) << std::endl; |
703 ///\endcode |
590 ///\endcode |
704 /// The output of the above code is the following. |
591 /// The output of the above code is the following. |
705 ///\code |
592 ///\code |
706 /// 1 |
593 /// 1 |
707 /// :-) |
|
708 /// 1 |
594 /// 1 |
709 ///\endcode |
595 ///\endcode |
710 /// Note that \c n is of type \c SubGA::NodeIt, but it can be converted to |
596 /// Note that \c n is of type \c SubDGA::NodeIt, but it can be converted to |
711 /// \c Digraph::Node that is why \c g.id(n) can be applied. |
597 /// \c Digraph::Node that is why \c g.id(n) can be applied. |
712 /// |
598 /// |
713 /// For other examples see also the documentation of |
599 /// For other examples see also the documentation of |
714 /// NodeSubDigraphAdaptor and ArcSubDigraphAdaptor. |
600 /// NodeSubDigraphAdaptor and ArcSubDigraphAdaptor. |
715 template<typename _Digraph, |
601 template<typename _Digraph, |
726 |
612 |
727 typedef DigraphAdaptorExtender< |
613 typedef DigraphAdaptorExtender< |
728 SubDigraphAdaptorBase<Digraph, NodeFilterMap, ArcFilterMap, checked> > |
614 SubDigraphAdaptorBase<Digraph, NodeFilterMap, ArcFilterMap, checked> > |
729 Parent; |
615 Parent; |
730 |
616 |
|
617 typedef typename Parent::Node Node; |
|
618 typedef typename Parent::Arc Arc; |
|
619 |
731 protected: |
620 protected: |
732 SubDigraphAdaptor() { } |
621 SubDigraphAdaptor() { } |
733 public: |
622 public: |
734 |
623 |
|
624 /// \brief Constructor |
|
625 /// |
|
626 /// Creates a sub-digraph-adaptor for the given digraph with |
|
627 /// given node and arc map filters. |
735 SubDigraphAdaptor(Digraph& digraph, NodeFilterMap& node_filter, |
628 SubDigraphAdaptor(Digraph& digraph, NodeFilterMap& node_filter, |
736 ArcFilterMap& arc_filter) { |
629 ArcFilterMap& arc_filter) { |
737 setDigraph(digraph); |
630 setDigraph(digraph); |
738 setNodeFilterMap(node_filter); |
631 setNodeFilterMap(node_filter); |
739 setArcFilterMap(arc_filter); |
632 setArcFilterMap(arc_filter); |
740 } |
633 } |
741 |
634 |
|
635 /// \brief Hides the node of the graph |
|
636 /// |
|
637 /// This function hides \c n in the digraph, i.e. the iteration |
|
638 /// jumps over it. This is done by simply setting the value of \c n |
|
639 /// to be false in the corresponding node-map. |
|
640 void hide(const Node& n) const { Parent::hide(n); } |
|
641 |
|
642 /// \brief Hides the arc of the graph |
|
643 /// |
|
644 /// This function hides \c a in the digraph, i.e. the iteration |
|
645 /// jumps over it. This is done by simply setting the value of \c a |
|
646 /// to be false in the corresponding arc-map. |
|
647 void hide(const Arc& a) const { Parent::hide(a); } |
|
648 |
|
649 /// \brief Unhides the node of the graph |
|
650 /// |
|
651 /// The value of \c n is set to be true in the node-map which stores |
|
652 /// hide information. If \c n was hidden previuosly, then it is shown |
|
653 /// again |
|
654 void unHide(const Node& n) const { Parent::unHide(n); } |
|
655 |
|
656 /// \brief Unhides the arc of the graph |
|
657 /// |
|
658 /// The value of \c a is set to be true in the arc-map which stores |
|
659 /// hide information. If \c a was hidden previuosly, then it is shown |
|
660 /// again |
|
661 void unHide(const Arc& a) const { Parent::unHide(a); } |
|
662 |
|
663 /// \brief Returns true if \c n is hidden. |
|
664 /// |
|
665 /// Returns true if \c n is hidden. |
|
666 /// |
|
667 bool hidden(const Node& n) const { return Parent::hidden(n); } |
|
668 |
|
669 /// \brief Returns true if \c a is hidden. |
|
670 /// |
|
671 /// Returns true if \c a is hidden. |
|
672 /// |
|
673 bool hidden(const Arc& a) const { return Parent::hidden(a); } |
|
674 |
742 }; |
675 }; |
743 |
676 |
744 /// \brief Just gives back a sub digraph adaptor |
677 /// \brief Just gives back a sub-digraph-adaptor |
745 /// |
678 /// |
746 /// Just gives back a sub digraph adaptor |
679 /// Just gives back a sub-digraph-adaptor |
747 template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap> |
680 template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap> |
748 SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap> |
681 SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap> |
749 subDigraphAdaptor(const Digraph& digraph, |
682 subDigraphAdaptor(const Digraph& digraph, |
750 NodeFilterMap& nfm, ArcFilterMap& afm) { |
683 NodeFilterMap& nfm, ArcFilterMap& afm) { |
751 return SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap> |
684 return SubDigraphAdaptor<const Digraph, NodeFilterMap, ArcFilterMap> |
772 SubDigraphAdaptor<const Digraph, const NodeFilterMap, const ArcFilterMap> |
705 SubDigraphAdaptor<const Digraph, const NodeFilterMap, const ArcFilterMap> |
773 subDigraphAdaptor(const Digraph& digraph, |
706 subDigraphAdaptor(const Digraph& digraph, |
774 NodeFilterMap& nfm, ArcFilterMap& afm) { |
707 NodeFilterMap& nfm, ArcFilterMap& afm) { |
775 return SubDigraphAdaptor<const Digraph, const NodeFilterMap, |
708 return SubDigraphAdaptor<const Digraph, const NodeFilterMap, |
776 const ArcFilterMap>(digraph, nfm, afm); |
709 const ArcFilterMap>(digraph, nfm, afm); |
|
710 |
777 } |
711 } |
778 |
712 |
779 |
713 |
780 |
714 |
781 ///\ingroup graph_adaptors |
715 ///\ingroup graph_adaptors |
800 |
734 |
801 typedef SubDigraphAdaptor<Digraph, NodeFilterMap, |
735 typedef SubDigraphAdaptor<Digraph, NodeFilterMap, |
802 ConstMap<typename Digraph::Arc, bool>, checked> |
736 ConstMap<typename Digraph::Arc, bool>, checked> |
803 Parent; |
737 Parent; |
804 |
738 |
|
739 typedef typename Parent::Node Node; |
|
740 |
805 protected: |
741 protected: |
806 ConstMap<typename Digraph::Arc, bool> const_true_map; |
742 ConstMap<typename Digraph::Arc, bool> const_true_map; |
807 |
743 |
808 NodeSubDigraphAdaptor() : const_true_map(true) { |
744 NodeSubDigraphAdaptor() : const_true_map(true) { |
809 Parent::setArcFilterMap(const_true_map); |
745 Parent::setArcFilterMap(const_true_map); |
810 } |
746 } |
811 |
747 |
812 public: |
748 public: |
813 |
749 |
|
750 /// \brief Constructor |
|
751 /// |
|
752 /// Creates a node-sub-digraph-adaptor for the given digraph with |
|
753 /// given node map filter. |
814 NodeSubDigraphAdaptor(Digraph& _digraph, NodeFilterMap& node_filter) : |
754 NodeSubDigraphAdaptor(Digraph& _digraph, NodeFilterMap& node_filter) : |
815 Parent(), const_true_map(true) { |
755 Parent(), const_true_map(true) { |
816 Parent::setDigraph(_digraph); |
756 Parent::setDigraph(_digraph); |
817 Parent::setNodeFilterMap(node_filter); |
757 Parent::setNodeFilterMap(node_filter); |
818 Parent::setArcFilterMap(const_true_map); |
758 Parent::setArcFilterMap(const_true_map); |
819 } |
759 } |
820 |
760 |
|
761 /// \brief Hides the node of the graph |
|
762 /// |
|
763 /// This function hides \c n in the digraph, i.e. the iteration |
|
764 /// jumps over it. This is done by simply setting the value of \c n |
|
765 /// to be false in the corresponding node-map. |
|
766 void hide(const Node& n) const { Parent::hide(n); } |
|
767 |
|
768 /// \brief Unhides the node of the graph |
|
769 /// |
|
770 /// The value of \c n is set to be true in the node-map which stores |
|
771 /// hide information. If \c n was hidden previuosly, then it is shown |
|
772 /// again |
|
773 void unHide(const Node& n) const { Parent::unHide(n); } |
|
774 |
|
775 /// \brief Returns true if \c n is hidden. |
|
776 /// |
|
777 /// Returns true if \c n is hidden. |
|
778 /// |
|
779 bool hidden(const Node& n) const { return Parent::hidden(n); } |
|
780 |
821 }; |
781 }; |
822 |
782 |
823 |
783 |
824 /// \brief Just gives back a \c NodeSubDigraphAdaptor |
784 /// \brief Just gives back a node-sub-digraph adaptor |
825 /// |
785 /// |
826 /// Just gives back a \c NodeSubDigraphAdaptor |
786 /// Just gives back a node-sub-digraph adaptor |
827 template<typename Digraph, typename NodeFilterMap> |
787 template<typename Digraph, typename NodeFilterMap> |
828 NodeSubDigraphAdaptor<const Digraph, NodeFilterMap> |
788 NodeSubDigraphAdaptor<const Digraph, NodeFilterMap> |
829 nodeSubDigraphAdaptor(const Digraph& digraph, NodeFilterMap& nfm) { |
789 nodeSubDigraphAdaptor(const Digraph& digraph, NodeFilterMap& nfm) { |
830 return NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>(digraph, nfm); |
790 return NodeSubDigraphAdaptor<const Digraph, NodeFilterMap>(digraph, nfm); |
831 } |
791 } |
844 ///An adaptor for hiding arcs from a digraph. This adaptor |
804 ///An adaptor for hiding arcs from a digraph. This adaptor |
845 ///specializes SubDigraphAdaptor in the way that only the arc-set |
805 ///specializes SubDigraphAdaptor in the way that only the arc-set |
846 ///can be filtered. The usefulness of this adaptor is demonstrated |
806 ///can be filtered. The usefulness of this adaptor is demonstrated |
847 ///in the problem of searching a maximum number of arc-disjoint |
807 ///in the problem of searching a maximum number of arc-disjoint |
848 ///shortest paths between two nodes \c s and \c t. Shortest here |
808 ///shortest paths between two nodes \c s and \c t. Shortest here |
849 ///means being shortest w.r.t. non-negative arc-lengths. Note that |
809 ///means being shortest with respect to non-negative |
850 ///the comprehension of the presented solution need's some |
810 ///arc-lengths. Note that the comprehension of the presented |
851 ///elementary knowlarc from combinatorial optimization. |
811 ///solution need's some elementary knowledge from combinatorial |
|
812 ///optimization. |
852 /// |
813 /// |
853 ///If a single shortest path is to be searched between \c s and \c |
814 ///If a single shortest path is to be searched between \c s and \c |
854 ///t, then this can be done easily by applying the Dijkstra |
815 ///t, then this can be done easily by applying the Dijkstra |
855 ///algorithm. What happens, if a maximum number of arc-disjoint |
816 ///algorithm. What happens, if a maximum number of arc-disjoint |
856 ///shortest paths is to be computed. It can be proved that an arc |
817 ///shortest paths is to be computed. It can be proved that an arc |
866 ///programs, you can use \ref dim_to_dot.cc to generate .dot files |
827 ///programs, you can use \ref dim_to_dot.cc to generate .dot files |
867 ///from dimacs files. The .dot file of the following figure was |
828 ///from dimacs files. The .dot file of the following figure was |
868 ///generated by the demo program \ref dim_to_dot.cc. |
829 ///generated by the demo program \ref dim_to_dot.cc. |
869 /// |
830 /// |
870 ///\dot |
831 ///\dot |
871 ///didigraph lemon_dot_example { |
832 ///digraph lemon_dot_example { |
872 ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; |
833 ///node [ shape=ellipse, fontname=Helvetica, fontsize=10 ]; |
873 ///n0 [ label="0 (s)" ]; |
834 ///n0 [ label="0 (s)" ]; |
874 ///n1 [ label="1" ]; |
835 ///n1 [ label="1" ]; |
875 ///n2 [ label="2" ]; |
836 ///n2 [ label="2" ]; |
876 ///n3 [ label="3" ]; |
837 ///n3 [ label="3" ]; |
972 typedef _Digraph Digraph; |
933 typedef _Digraph Digraph; |
973 typedef _ArcFilterMap ArcFilterMap; |
934 typedef _ArcFilterMap ArcFilterMap; |
974 |
935 |
975 typedef SubDigraphAdaptor<Digraph, ConstMap<typename Digraph::Node, bool>, |
936 typedef SubDigraphAdaptor<Digraph, ConstMap<typename Digraph::Node, bool>, |
976 ArcFilterMap, false> Parent; |
937 ArcFilterMap, false> Parent; |
|
938 |
|
939 typedef typename Parent::Arc Arc; |
|
940 |
977 protected: |
941 protected: |
978 ConstMap<typename Digraph::Node, bool> const_true_map; |
942 ConstMap<typename Digraph::Node, bool> const_true_map; |
979 |
943 |
980 ArcSubDigraphAdaptor() : const_true_map(true) { |
944 ArcSubDigraphAdaptor() : const_true_map(true) { |
981 Parent::setNodeFilterMap(const_true_map); |
945 Parent::setNodeFilterMap(const_true_map); |
982 } |
946 } |
983 |
947 |
984 public: |
948 public: |
985 |
949 |
|
950 /// \brief Constructor |
|
951 /// |
|
952 /// Creates a arc-sub-digraph-adaptor for the given digraph with |
|
953 /// given arc map filter. |
986 ArcSubDigraphAdaptor(Digraph& digraph, ArcFilterMap& arc_filter) |
954 ArcSubDigraphAdaptor(Digraph& digraph, ArcFilterMap& arc_filter) |
987 : Parent(), const_true_map(true) { |
955 : Parent(), const_true_map(true) { |
988 Parent::setDigraph(digraph); |
956 Parent::setDigraph(digraph); |
989 Parent::setNodeFilterMap(const_true_map); |
957 Parent::setNodeFilterMap(const_true_map); |
990 Parent::setArcFilterMap(arc_filter); |
958 Parent::setArcFilterMap(arc_filter); |
991 } |
959 } |
992 |
960 |
|
961 /// \brief Hides the arc of the graph |
|
962 /// |
|
963 /// This function hides \c a in the digraph, i.e. the iteration |
|
964 /// jumps over it. This is done by simply setting the value of \c a |
|
965 /// to be false in the corresponding arc-map. |
|
966 void hide(const Arc& a) const { Parent::hide(a); } |
|
967 |
|
968 /// \brief Unhides the arc of the graph |
|
969 /// |
|
970 /// The value of \c a is set to be true in the arc-map which stores |
|
971 /// hide information. If \c a was hidden previuosly, then it is shown |
|
972 /// again |
|
973 void unHide(const Arc& a) const { Parent::unHide(a); } |
|
974 |
|
975 /// \brief Returns true if \c a is hidden. |
|
976 /// |
|
977 /// Returns true if \c a is hidden. |
|
978 /// |
|
979 bool hidden(const Arc& a) const { return Parent::hidden(a); } |
|
980 |
993 }; |
981 }; |
994 |
982 |
995 /// \brief Just gives back an arc sub digraph adaptor |
983 /// \brief Just gives back an arc-sub-digraph adaptor |
996 /// |
984 /// |
997 /// Just gives back an arc sub digraph adaptor |
985 /// Just gives back an arc-sub-digraph adaptor |
998 template<typename Digraph, typename ArcFilterMap> |
986 template<typename Digraph, typename ArcFilterMap> |
999 ArcSubDigraphAdaptor<const Digraph, ArcFilterMap> |
987 ArcSubDigraphAdaptor<const Digraph, ArcFilterMap> |
1000 arcSubDigraphAdaptor(const Digraph& digraph, ArcFilterMap& afm) { |
988 arcSubDigraphAdaptor(const Digraph& digraph, ArcFilterMap& afm) { |
1001 return ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>(digraph, afm); |
989 return ArcSubDigraphAdaptor<const Digraph, ArcFilterMap>(digraph, afm); |
1002 } |
990 } |
1391 |
1379 |
1392 }; |
1380 }; |
1393 |
1381 |
1394 ///\ingroup graph_adaptors |
1382 ///\ingroup graph_adaptors |
1395 /// |
1383 /// |
1396 /// \brief An graph is made from a directed digraph by an adaptor |
1384 /// \brief A graph is made from a directed digraph by an adaptor |
1397 /// |
1385 /// |
1398 /// This adaptor makes an undirected graph from a directed |
1386 /// This adaptor makes an undirected graph from a directed |
1399 /// digraph. All arc of the underlying will be showed in the adaptor |
1387 /// graph. All arc of the underlying digraph will be showed in the |
1400 /// as an edge. Let's see an informal example about using |
1388 /// adaptor as an edge. Let's see an informal example about using |
1401 /// this adaptor: |
1389 /// this adaptor. |
1402 /// |
1390 /// |
1403 /// There is a network of the streets of a town. Of course there are |
1391 /// There is a network of the streets of a town. Of course there are |
1404 /// some one-way street in the town hence the network is a directed |
1392 /// some one-way street in the town hence the network is a directed |
1405 /// one. There is a crazy driver who go oppositely in the one-way |
1393 /// one. There is a crazy driver who go oppositely in the one-way |
1406 /// street without moral sense. Of course he can pass this streets |
1394 /// street without moral sense. Of course he can pass this streets |
2020 int maxArcId() const { |
2002 int maxArcId() const { |
2021 return std::max(_digraph->maxNodeId() << 1, |
2003 return std::max(_digraph->maxNodeId() << 1, |
2022 (_digraph->maxArcId() << 1) | 1); |
2004 (_digraph->maxArcId() << 1) | 1); |
2023 } |
2005 } |
2024 |
2006 |
2025 /// \brief Returns true when the node is in-node. |
|
2026 /// |
|
2027 /// Returns true when the node is in-node. |
|
2028 static bool inNode(const Node& n) { |
2007 static bool inNode(const Node& n) { |
2029 return n._in; |
2008 return n._in; |
2030 } |
2009 } |
2031 |
2010 |
2032 /// \brief Returns true when the node is out-node. |
|
2033 /// |
|
2034 /// Returns true when the node is out-node. |
|
2035 static bool outNode(const Node& n) { |
2011 static bool outNode(const Node& n) { |
2036 return !n._in; |
2012 return !n._in; |
2037 } |
2013 } |
2038 |
2014 |
2039 /// \brief Returns true when the arc is arc in the original digraph. |
|
2040 /// |
|
2041 /// Returns true when the arc is arc in the original digraph. |
|
2042 static bool origArc(const Arc& e) { |
2015 static bool origArc(const Arc& e) { |
2043 return e._item.firstState(); |
2016 return e._item.firstState(); |
2044 } |
2017 } |
2045 |
2018 |
2046 /// \brief Returns true when the arc binds an in-node and an out-node. |
|
2047 /// |
|
2048 /// Returns true when the arc binds an in-node and an out-node. |
|
2049 static bool bindArc(const Arc& e) { |
2019 static bool bindArc(const Arc& e) { |
2050 return e._item.secondState(); |
2020 return e._item.secondState(); |
2051 } |
2021 } |
2052 |
2022 |
2053 /// \brief Gives back the in-node created from the \c node. |
|
2054 /// |
|
2055 /// Gives back the in-node created from the \c node. |
|
2056 static Node inNode(const DigraphNode& n) { |
2023 static Node inNode(const DigraphNode& n) { |
2057 return Node(n, true); |
2024 return Node(n, true); |
2058 } |
2025 } |
2059 |
2026 |
2060 /// \brief Gives back the out-node created from the \c node. |
|
2061 /// |
|
2062 /// Gives back the out-node created from the \c node. |
|
2063 static Node outNode(const DigraphNode& n) { |
2027 static Node outNode(const DigraphNode& n) { |
2064 return Node(n, false); |
2028 return Node(n, false); |
2065 } |
2029 } |
2066 |
2030 |
2067 /// \brief Gives back the arc binds the two part of the node. |
|
2068 /// |
|
2069 /// Gives back the arc binds the two part of the node. |
|
2070 static Arc arc(const DigraphNode& n) { |
2031 static Arc arc(const DigraphNode& n) { |
2071 return Arc(n); |
2032 return Arc(n); |
2072 } |
2033 } |
2073 |
2034 |
2074 /// \brief Gives back the arc of the original arc. |
|
2075 /// |
|
2076 /// Gives back the arc of the original arc. |
|
2077 static Arc arc(const DigraphArc& e) { |
2035 static Arc arc(const DigraphArc& e) { |
2078 return Arc(e); |
2036 return Arc(e); |
2079 } |
2037 } |
2080 |
2038 |
2081 typedef True NodeNumTag; |
2039 typedef True NodeNumTag; |
2273 /// The aim of this class is to run algorithm with node costs if the |
2231 /// The aim of this class is to run algorithm with node costs if the |
2274 /// algorithm can use directly just arc costs. In this case we should use |
2232 /// algorithm can use directly just arc costs. In this case we should use |
2275 /// a \c SplitDigraphAdaptor and set the node cost of the digraph to the |
2233 /// a \c SplitDigraphAdaptor and set the node cost of the digraph to the |
2276 /// bind arc in the adapted digraph. |
2234 /// bind arc in the adapted digraph. |
2277 /// |
2235 /// |
2278 /// By example a maximum flow algoritm can compute how many arc |
2236 /// For example a maximum flow algorithm can compute how many arc |
2279 /// disjoint paths are in the digraph. But we would like to know how |
2237 /// disjoint paths are in the digraph. But we would like to know how |
2280 /// many node disjoint paths are in the digraph. First we have to |
2238 /// many node disjoint paths are in the digraph. First we have to |
2281 /// adapt the digraph with the \c SplitDigraphAdaptor. Then run the flow |
2239 /// adapt the digraph with the \c SplitDigraphAdaptor. Then run the flow |
2282 /// algorithm on the adapted digraph. The bottleneck of the flow will |
2240 /// algorithm on the adapted digraph. The bottleneck of the flow will |
2283 /// be the bind arcs which bounds the flow with the count of the |
2241 /// be the bind arcs which bounds the flow with the count of the |
2328 : public DigraphAdaptorExtender<SplitDigraphAdaptorBase<_Digraph> > { |
2286 : public DigraphAdaptorExtender<SplitDigraphAdaptorBase<_Digraph> > { |
2329 public: |
2287 public: |
2330 typedef _Digraph Digraph; |
2288 typedef _Digraph Digraph; |
2331 typedef DigraphAdaptorExtender<SplitDigraphAdaptorBase<Digraph> > Parent; |
2289 typedef DigraphAdaptorExtender<SplitDigraphAdaptorBase<Digraph> > Parent; |
2332 |
2290 |
|
2291 typedef typename Digraph::Node DigraphNode; |
|
2292 typedef typename Digraph::Arc DigraphArc; |
|
2293 |
2333 typedef typename Parent::Node Node; |
2294 typedef typename Parent::Node Node; |
2334 typedef typename Parent::Arc Arc; |
2295 typedef typename Parent::Arc Arc; |
2335 |
2296 |
2336 /// \brief Constructor of the adaptor. |
2297 /// \brief Constructor of the adaptor. |
2337 /// |
2298 /// |
2338 /// Constructor of the adaptor. |
2299 /// Constructor of the adaptor. |
2339 SplitDigraphAdaptor(Digraph& g) { |
2300 SplitDigraphAdaptor(Digraph& g) { |
2340 Parent::setDigraph(g); |
2301 Parent::setDigraph(g); |
|
2302 } |
|
2303 |
|
2304 /// \brief Returns true when the node is in-node. |
|
2305 /// |
|
2306 /// Returns true when the node is in-node. |
|
2307 static bool inNode(const Node& n) { |
|
2308 return Parent::inNode(n); |
|
2309 } |
|
2310 |
|
2311 /// \brief Returns true when the node is out-node. |
|
2312 /// |
|
2313 /// Returns true when the node is out-node. |
|
2314 static bool outNode(const Node& n) { |
|
2315 return Parent::outNode(n); |
|
2316 } |
|
2317 |
|
2318 /// \brief Returns true when the arc is arc in the original digraph. |
|
2319 /// |
|
2320 /// Returns true when the arc is arc in the original digraph. |
|
2321 static bool origArc(const Arc& a) { |
|
2322 return Parent::origArc(a); |
|
2323 } |
|
2324 |
|
2325 /// \brief Returns true when the arc binds an in-node and an out-node. |
|
2326 /// |
|
2327 /// Returns true when the arc binds an in-node and an out-node. |
|
2328 static bool bindArc(const Arc& a) { |
|
2329 return Parent::bindArc(a); |
|
2330 } |
|
2331 |
|
2332 /// \brief Gives back the in-node created from the \c node. |
|
2333 /// |
|
2334 /// Gives back the in-node created from the \c node. |
|
2335 static Node inNode(const DigraphNode& n) { |
|
2336 return Parent::inNode(n); |
|
2337 } |
|
2338 |
|
2339 /// \brief Gives back the out-node created from the \c node. |
|
2340 /// |
|
2341 /// Gives back the out-node created from the \c node. |
|
2342 static Node outNode(const DigraphNode& n) { |
|
2343 return Parent::outNode(n); |
|
2344 } |
|
2345 |
|
2346 /// \brief Gives back the arc binds the two part of the node. |
|
2347 /// |
|
2348 /// Gives back the arc binds the two part of the node. |
|
2349 static Arc arc(const DigraphNode& n) { |
|
2350 return Parent::arc(n); |
|
2351 } |
|
2352 |
|
2353 /// \brief Gives back the arc of the original arc. |
|
2354 /// |
|
2355 /// Gives back the arc of the original arc. |
|
2356 static Arc arc(const DigraphArc& a) { |
|
2357 return Parent::arc(a); |
2341 } |
2358 } |
2342 |
2359 |
2343 /// \brief NodeMap combined from two original NodeMap |
2360 /// \brief NodeMap combined from two original NodeMap |
2344 /// |
2361 /// |
2345 /// This class adapt two of the original digraph NodeMap to |
2362 /// This class adapt two of the original digraph NodeMap to |