1 | #include <iostream> |
---|
2 | #include <algorithm> |
---|
3 | #include <iterator> |
---|
4 | #include <functional> |
---|
5 | #include <lemon/list_graph.h> |
---|
6 | #include <lemon/map_iterator.h> |
---|
7 | #include <lemon/graph_reader.h> |
---|
8 | #include <lemon/maps.h> |
---|
9 | |
---|
10 | using namespace std; |
---|
11 | using namespace lemon; |
---|
12 | |
---|
13 | template <typename F, typename G> |
---|
14 | struct unary_compose { |
---|
15 | typedef typename G::argument_type argument_type; |
---|
16 | typedef typename F::result_type result_type; |
---|
17 | |
---|
18 | unary_compose(const F& _f, const G& _g) : f(_f), g(_g) {} |
---|
19 | |
---|
20 | result_type operator()(const argument_type& x) { |
---|
21 | return f(g(x)); |
---|
22 | } |
---|
23 | |
---|
24 | private: |
---|
25 | F f; |
---|
26 | G g; |
---|
27 | }; |
---|
28 | |
---|
29 | template <typename F, typename G> |
---|
30 | unary_compose<F, G> compose1(const F& f, const G& g) { |
---|
31 | return unary_compose<F, G>(f, g); |
---|
32 | } |
---|
33 | |
---|
34 | |
---|
35 | |
---|
36 | |
---|
37 | template <typename T> |
---|
38 | struct Second { |
---|
39 | typedef T argument_type; |
---|
40 | typedef typename T::second_type result_type; |
---|
41 | |
---|
42 | typename T::second_type operator()(const T& t) const { |
---|
43 | return t.second; |
---|
44 | } |
---|
45 | }; |
---|
46 | |
---|
47 | template <typename T> |
---|
48 | struct First { |
---|
49 | typedef T argument_type; |
---|
50 | typedef typename T::first_type result_type; |
---|
51 | typename T::first_type operator()(const T& t) const { |
---|
52 | return t.first; |
---|
53 | } |
---|
54 | }; |
---|
55 | |
---|
56 | |
---|
57 | int main() { |
---|
58 | |
---|
59 | typedef ListGraph Graph; |
---|
60 | |
---|
61 | typedef Graph::Edge Edge; |
---|
62 | typedef Graph::Node Node; |
---|
63 | typedef Graph::EdgeIt EdgeIt; |
---|
64 | typedef Graph::NodeIt NodeIt; |
---|
65 | typedef Graph::EdgeMap<int> LengthMap; |
---|
66 | |
---|
67 | typedef IdMap<Graph, Edge> EdgeIdMap; |
---|
68 | |
---|
69 | Graph graph; |
---|
70 | LengthMap length(graph); |
---|
71 | |
---|
72 | readGraph(std::cin, graph, length); |
---|
73 | |
---|
74 | const LengthMap& constLength = length; |
---|
75 | |
---|
76 | copy(length.valueSet().begin(), length.valueSet().end(), |
---|
77 | ostream_iterator<int>(cout, " ")); |
---|
78 | cout << endl; |
---|
79 | |
---|
80 | |
---|
81 | copy(constLength.valueSet().begin(), constLength.valueSet().end(), |
---|
82 | ostream_iterator<int>(cout, " ")); |
---|
83 | cout << endl; |
---|
84 | |
---|
85 | |
---|
86 | transform(constLength.keySet().begin(), constLength.keySet().end(), |
---|
87 | ostream_iterator<int>(cout, " "), |
---|
88 | MapFunctor<EdgeIdMap>(EdgeIdMap(graph))); |
---|
89 | cout << endl; |
---|
90 | |
---|
91 | |
---|
92 | transform(constLength.mapSet().begin(), constLength.mapSet().end(), |
---|
93 | ostream_iterator<int>(cout, " "), |
---|
94 | Second<LengthMap::MapSet::Value>()); |
---|
95 | cout << endl; |
---|
96 | |
---|
97 | transform(constLength.mapSet().begin(), constLength.mapSet().end(), |
---|
98 | ostream_iterator<int>(cout, " "), |
---|
99 | compose1(MapFunctor<EdgeIdMap>(EdgeIdMap(graph)), |
---|
100 | First<LengthMap::MapSet::Value>() )); |
---|
101 | cout << endl; |
---|
102 | |
---|
103 | transform(length.mapSet().begin(), length.mapSet().end(), |
---|
104 | ostream_iterator<int>(cout, " "), |
---|
105 | Second<LengthMap::MapSet::Value>()); |
---|
106 | cout << endl; |
---|
107 | |
---|
108 | transform(length.mapSet().begin(), length.mapSet().end(), |
---|
109 | ostream_iterator<int>(cout, " "), |
---|
110 | compose1(MapFunctor<EdgeIdMap>(EdgeIdMap(graph)), |
---|
111 | First<LengthMap::MapSet::Value>() )); |
---|
112 | cout << endl; |
---|
113 | |
---|
114 | return 0; |
---|
115 | } |
---|