↑ Collapse diff ↑
Ignore white space 6 line context
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Sun Mar 14 09:08:34 2010
4
%%BoundingBox: -353 -264 559 292
5
%%EndComments
6
/lb { setlinewidth setrgbcolor newpath moveto
7
      4 2 roll 1 index 1 index curveto stroke } bind def
8
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
9
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
10
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
11
      2 index 1 index sub 2 index 2 index add lineto
12
      2 index 1 index sub 2 index 2 index sub lineto
13
      2 index 1 index add 2 index 2 index sub lineto
14
      closepath pop pop pop} bind def
15
/di { newpath 2 index 1 index add 2 index moveto
16
      2 index             2 index 2 index add lineto
17
      2 index 1 index sub 2 index             lineto
18
      2 index             2 index 2 index sub lineto
19
      closepath pop pop pop} bind def
20
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
21
     setrgbcolor 1.1 div c fill
22
   } bind def
23
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
24
     setrgbcolor 1.1 div sq fill
25
   } bind def
26
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
27
     setrgbcolor 1.1 div di fill
28
   } bind def
29
/nfemale { 0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
30
  newpath 5 index 5 index moveto 5 index 5 index 5 index 3.01 mul sub
31
  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub moveto
32
  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto stroke
33
  5 index 5 index 5 index c fill
34
  setrgbcolor 1.1 div c fill
35
  } bind def
36
/nmale {
37
  0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
38
  newpath 5 index 5 index moveto
39
  5 index 4 index 1 mul 1.5 mul add
40
  5 index 5 index 3 sqrt 1.5 mul mul add
41
  1 index 1 index lineto
42
  1 index 1 index 7 index sub moveto
43
  1 index 1 index lineto
44
  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub lineto
45
  stroke
46
  5 index 5 index 5 index c fill
47
  setrgbcolor 1.1 div c fill
48
  } bind def
49
/arrl 1 def
50
/arrw 0.3 def
51
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
52
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
53
       /w exch def /len exch def
54
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
55
       len w sub arrl sub dx dy lrl
56
       arrw dy dx neg lrl
57
       dx arrl w add mul dy w 2 div arrw add mul sub
58
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
59
       dx arrl w add mul neg dy w 2 div arrw add mul sub
60
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
61
       arrw dy dx neg lrl
62
       len w sub arrl sub neg dx dy lrl
63
       closepath fill } bind def
64
/cshow { 2 index 2 index moveto dup stringwidth pop
65
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
66

	
67
gsave
68
%Arcs:
69
gsave
70
140.321 266.249 -327.729 150.06 0 0 0 4.99223 l
71
82.1207 -238.726 -245.288 -110.743 0 0 0 4.99223 l
72
336.635 -229.036 533.603 13.109 0 0 0 4.99223 l
73
53.8598 -45.8071 -245.288 -110.743 0 0 0 4.99223 l
74
-75.5617 118.579 -327.729 150.06 0 0 0 4.99223 l
75
-327.729 150.06 -245.288 -110.743 1 0 0 11.9813 l
76
533.603 13.109 218.184 -84.2955 0 0 0 4.99223 l
77
39.87 175.035 141.163 67.2575 0 0 0 4.99223 l
78
53.8598 -45.8071 -75.5617 118.579 0 0 0 4.99223 l
79
-102.406 -141.267 82.1207 -238.726 0 0 0 4.99223 l
80
399.144 166.894 533.603 13.109 1 0 0 11.9813 l
81
39.87 175.035 140.321 266.249 1 0 0 11.9813 l
82
399.144 166.894 140.321 266.249 0 0 0 4.99223 l
83
399.144 166.894 141.163 67.2575 0 0 0 4.99223 l
84
53.8598 -45.8071 204.765 -173.77 0 0 0 4.99223 l
85
82.1207 -238.726 204.765 -173.77 0 0 0 4.99223 l
86
258.227 61.658 399.144 166.894 0 0 0 4.99223 l
87
53.8598 -45.8071 -102.406 -141.267 1 0 0 11.9813 l
88
175.073 -37.4477 141.163 67.2575 0 0 0 4.99223 l
89
258.227 61.658 380 0 0 0 0 4.99223 l
90
34.6739 40.8267 -75.5617 118.579 1 0 0 11.9813 l
91
380 0 533.603 13.109 0 0 0 4.99223 l
92
175.073 -37.4477 380 0 0 0 0 4.99223 l
93
218.184 -84.2955 204.765 -173.77 0 0 0 4.99223 l
94
53.8598 -45.8071 34.6739 40.8267 0 0 0 4.99223 l
95
167.905 -213.988 82.1207 -238.726 1 0 0 11.9813 l
96
336.635 -229.036 204.765 -173.77 1 0 0 11.9813 l
97
336.635 -229.036 167.905 -213.988 0 0 0 4.99223 l
98
329.08 -26.3098 218.184 -84.2955 0 0 0 4.99223 l
99
39.87 175.035 -75.5617 118.579 0 0 0 4.99223 l
100
53.8598 -45.8071 175.073 -37.4477 0 0 0 4.99223 l
101
34.6739 40.8267 141.163 67.2575 0 0 0 4.99223 l
102
258.227 61.658 141.163 67.2575 1 0 0 11.9813 l
103
175.073 -37.4477 218.184 -84.2955 1 0 0 11.9813 l
104
380 0 329.08 -26.3098 1 0 0 11.9813 l
105
grestore
106
%Nodes:
107
gsave
108
-245.288 -110.743 14.9767 1 1 1 nc
109
204.765 -173.77 14.9767 1 1 1 nc
110
-327.729 150.06 14.9767 1 1 1 nc
111
-75.5617 118.579 14.9767 1 1 1 nc
112
218.184 -84.2955 14.9767 1 1 1 nc
113
140.321 266.249 14.9767 1 1 1 nc
114
141.163 67.2575 14.9767 1 1 1 nc
115
82.1207 -238.726 14.9767 1 1 1 nc
116
329.08 -26.3098 14.9767 1 1 1 nc
117
-102.406 -141.267 14.9767 1 1 1 nc
118
533.603 13.109 14.9767 1 1 1 nc
119
167.905 -213.988 14.9767 1 1 1 nc
120
336.635 -229.036 14.9767 1 1 1 nc
121
380 0 14.9767 1 1 1 nc
122
399.144 166.894 14.9767 1 1 1 nc
123
34.6739 40.8267 14.9767 1 1 1 nc
124
39.87 175.035 14.9767 1 1 1 nc
125
175.073 -37.4477 14.9767 1 1 1 nc
126
53.8598 -45.8071 14.9767 1 1 1 nc
127
258.227 61.658 14.9767 1 1 1 nc
128
grestore
129
grestore
130
showpage
Ignore white space 6 line context
1
%!PS-Adobe-2.0 EPSF-2.0
2
%%Creator: LEMON, graphToEps()
3
%%CreationDate: Fri Oct 19 18:32:32 2007
4
%%BoundingBox: 0 0 596 842
5
%%DocumentPaperSizes: a4
6
%%EndComments
7
/lb { setlinewidth setrgbcolor newpath moveto
8
      4 2 roll 1 index 1 index curveto stroke } bind def
9
/l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def
10
/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def
11
/sq { newpath 2 index 1 index add 2 index 2 index add moveto
12
      2 index 1 index sub 2 index 2 index add lineto
13
      2 index 1 index sub 2 index 2 index sub lineto
14
      2 index 1 index add 2 index 2 index sub lineto
15
      closepath pop pop pop} bind def
16
/di { newpath 2 index 1 index add 2 index moveto
17
      2 index             2 index 2 index add lineto
18
      2 index 1 index sub 2 index             lineto
19
      2 index             2 index 2 index sub lineto
20
      closepath pop pop pop} bind def
21
/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill
22
     setrgbcolor 1.1 div c fill
23
   } bind def
24
/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill
25
     setrgbcolor 1.1 div sq fill
26
   } bind def
27
/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill
28
     setrgbcolor 1.1 div di fill
29
   } bind def
30
/nfemale { 0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
31
  newpath 5 index 5 index moveto 5 index 5 index 5 index 3.01 mul sub
32
  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub moveto
33
  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto stroke
34
  5 index 5 index 5 index c fill
35
  setrgbcolor 1.1 div c fill
36
  } bind def
37
/nmale {
38
  0 0 0 setrgbcolor 3 index 0.0909091 1.5 mul mul setlinewidth
39
  newpath 5 index 5 index moveto
40
  5 index 4 index 1 mul 1.5 mul add
41
  5 index 5 index 3 sqrt 1.5 mul mul add
42
  1 index 1 index lineto
43
  1 index 1 index 7 index sub moveto
44
  1 index 1 index lineto
45
  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub lineto
46
  stroke
47
  5 index 5 index 5 index c fill
48
  setrgbcolor 1.1 div c fill
49
  } bind def
50
/arrl 1 def
51
/arrw 0.3 def
52
/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def
53
/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def
54
       /w exch def /len exch def
55
       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto
56
       len w sub arrl sub dx dy lrl
57
       arrw dy dx neg lrl
58
       dx arrl w add mul dy w 2 div arrw add mul sub
59
       dy arrl w add mul dx w 2 div arrw add mul add rlineto
60
       dx arrl w add mul neg dy w 2 div arrw add mul sub
61
       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto
62
       arrw dy dx neg lrl
63
       len w sub arrl sub neg dx dy lrl
64
       closepath fill } bind def
65
/cshow { 2 index 2 index moveto dup stringwidth pop
66
         neg 2 div fosi .35 mul neg rmoveto show pop pop} def
67

	
68
gsave
69
15 138.307 translate
70
12.7843 dup scale
71
90 rotate
72
0.608112 -43.6081 translate
73
%Edges:
74
gsave
75
9 31 9.5 30.5 10 30 0 0 0 0.091217 lb
76
9 31 5.5 34.5 2 38 0 0 0 0.091217 lb
77
9 31 25.5 16 42 1 0 0 0 0.091217 lb
78
3 40 23 20.5 43 1 0 0 0 0.091217 lb
79
3 40 22.5 20.5 42 1 0 0 0 0.091217 lb
80
3 40 2.5 40.5 2 41 0 0 0 0.091217 lb
81
13 25 10.5 24.5 8 24 0 0 0 0.091217 lb
82
13 25 12 27 11 29 0 0 0 0.091217 lb
83
3 4 2.5 3 2 2 0 0 0 0.091217 lb
84
3 4 4.5 3 6 2 0 0 0 0.091217 lb
85
6 25 7 24.5 8 24 0 0 0 0.091217 lb
86
6 25 6 24.5 6 24 0 0 0 0.091217 lb
87
34 2 33.5 2 33 2 0 0 0 0.091217 lb
88
34 2 35 2 36 2 0 0 0 0.091217 lb
89
6 8 16 9 26 10 0 0 0 0.091217 lb
90
6 8 6 10.5 6 13 0 0 0 0.091217 lb
91
6 8 6 7.5 6 7 0 0 0 0.091217 lb
92
26 10 27.5 8.5 29 7 0 0 0 0.091217 lb
93
26 10 27.5 9 29 8 0 0 0 0.091217 lb
94
10 30 10.5 29.5 11 29 0 0 0 0.091217 lb
95
8 24 7 23.5 6 23 0 0 0 0.091217 lb
96
8 24 8 24.5 8 25 0 0 0 0.091217 lb
97
33 2 32.5 2 32 2 0 0 0 0.091217 lb
98
29 7 17.5 7 6 7 0 0 0 0.091217 lb
99
2 2 1.5 22 1 42 0 0 0 0.091217 lb
100
2 2 3.5 2 5 2 0 0 0 0.091217 lb
101
21 15 13.5 14.5 6 14 0 0 0 0.091217 lb
102
21 15 21 15.5 21 16 0 0 0 0.091217 lb
103
1 42 0.5 42.5 0 43 0 0 0 0.091217 lb
104
1 42 1.5 41.5 2 41 0 0 0 0.091217 lb
105
6 15 6 15.5 6 16 0 0 0 0.091217 lb
106
6 15 6 14.5 6 14 0 0 0 0.091217 lb
107
43 1 22 0.5 1 0 0 0 0 0.091217 lb
108
31 2 18.5 2 6 2 0 0 0 0.091217 lb
109
31 2 31.5 2 32 2 0 0 0 0.091217 lb
110
6 24 6 23.5 6 23 0 0 0 0.091217 lb
111
6 16 6 16.5 6 17 0 0 0 0.091217 lb
112
6 23 6 20 6 17 0 0 0 0.091217 lb
113
6 2 5.5 2 5 2 0 0 0 0.091217 lb
114
6 2 6 4.5 6 7 0 0 0 0.091217 lb
115
0 43 0.5 21.5 1 0 0 0 0 0.091217 lb
116
1 1 19.5 1.5 38 2 0 0 0 0.091217 lb
117
1 1 1 0.5 1 0 0 0 0 0.091217 lb
118
2 38 5.5 31.5 9 25 0 0 0 0.091217 lb
119
25 13 15.5 13 6 13 0 0 0 0.091217 lb
120
25 13 15.5 13.5 6 14 0 0 0 0.091217 lb
121
8 25 8.5 25 9 25 0 0 0 0.091217 lb
122
11 29 24.5 15.5 38 2 0 0 0 0.091217 lb
123
6 17 11.5 18 17 19 0 0 0 0.091217 lb
124
16 23 26.5 12.5 37 2 0 0 0 0.091217 lb
125
16 23 18.5 19.5 21 16 0 0 0 0.091217 lb
126
36 2 36.5 2 37 2 0 0 0 0.091217 lb
127
36 2 32.5 5 29 8 0 0 0 0.091217 lb
128
6 13 6 13.5 6 14 0 0 0 0.091217 lb
129
37 2 37.5 2 38 2 0 0 0 0.091217 lb
130
21 16 19 17.5 17 19 0 0 0 0.091217 lb
131
grestore
132
%Nodes:
133
gsave
134
29 8 0.304556 1 1 1 nc
135
2 41 0.304556 1 1 1 nc
136
6 7 0.304556 1 1 1 nc
137
5 2 0.304556 1 1 1 nc
138
17 19 0.304556 1 1 1 nc
139
21 16 0.304556 1 1 1 nc
140
1 0 0.304556 1 1 1 nc
141
9 25 0.304556 1 1 1 nc
142
6 14 0.304556 1 1 1 nc
143
42 1 0.304556 1 1 1 nc
144
38 2 0.304556 1 1 1 nc
145
37 2 0.304556 1 1 1 nc
146
6 13 0.304556 1 1 1 nc
147
36 2 0.304556 1 1 1 nc
148
16 23 0.304556 1 1 1 nc
149
6 17 0.304556 1 1 1 nc
150
11 29 0.304556 1 1 1 nc
151
8 25 0.304556 1 1 1 nc
152
32 2 0.304556 1 1 1 nc
153
25 13 0.304556 1 1 1 nc
154
2 38 0.304556 1 1 1 nc
155
1 1 0.304556 1 1 1 nc
156
0 43 0.304556 1 1 1 nc
157
6 2 0.304556 1 1 1 nc
158
6 23 0.304556 1 1 1 nc
159
6 16 0.304556 1 1 1 nc
160
6 24 0.304556 1 1 1 nc
161
31 2 0.304556 1 1 1 nc
162
43 1 0.304556 1 1 1 nc
163
6 15 0.304556 1 1 1 nc
164
1 42 0.304556 1 1 1 nc
165
21 15 0.304556 1 1 1 nc
166
2 2 0.304556 1 1 1 nc
167
29 7 0.304556 1 1 1 nc
168
33 2 0.304556 1 1 1 nc
169
8 24 0.304556 1 1 1 nc
170
10 30 0.304556 1 1 1 nc
171
26 10 0.304556 1 1 1 nc
172
6 8 0.304556 1 1 1 nc
173
34 2 0.304556 1 1 1 nc
174
6 25 0.304556 1 1 1 nc
175
3 4 0.304556 1 1 1 nc
176
13 25 0.304556 1 1 1 nc
177
3 40 0.304556 1 1 1 nc
178
9 31 0.304556 1 1 1 nc
179
grestore
180
grestore
181
showpage
Ignore white space 6 line context
1
%%%%% Defining LEMON %%%%%
2

	
3
@misc{lemon,
4
  key =          {LEMON},
5
  title =        {{LEMON} -- {L}ibrary for {E}fficient {M}odeling and
6
                  {O}ptimization in {N}etworks},
7
  howpublished = {\url{http://lemon.cs.elte.hu/}},
8
  year =         2009
9
}
10

	
11
@misc{egres,
12
  key =          {EGRES},
13
  title =        {{EGRES} -- {E}gerv{\'a}ry {R}esearch {G}roup on
14
                  {C}ombinatorial {O}ptimization},
15
  url =          {http://www.cs.elte.hu/egres/}
16
}
17

	
18
@misc{coinor,
19
  key =          {COIN-OR},
20
  title =        {{COIN-OR} -- {C}omputational {I}nfrastructure for
21
                  {O}perations {R}esearch},
22
  url =          {http://www.coin-or.org/}
23
}
24

	
25

	
26
%%%%% Other libraries %%%%%%
27

	
28
@misc{boost,
29
  key =          {Boost},
30
  title =        {{B}oost {C++} {L}ibraries},
31
  url =          {http://www.boost.org/}
32
}
33

	
34
@book{bglbook,
35
  author =       {Jeremy G. Siek and Lee-Quan Lee and Andrew
36
                  Lumsdaine},
37
  title =        {The Boost Graph Library: User Guide and Reference
38
                  Manual},
39
  publisher =    {Addison-Wesley},
40
  year =         2002
41
}
42

	
43
@misc{leda,
44
  key =          {LEDA},
45
  title =        {{LEDA} -- {L}ibrary of {E}fficient {D}ata {T}ypes and
46
                  {A}lgorithms},
47
  url =          {http://www.algorithmic-solutions.com/}
48
}
49

	
50
@book{ledabook,
51
  author =       {Kurt Mehlhorn and Stefan N{\"a}her},
52
  title =        {{LEDA}: {A} platform for combinatorial and geometric
53
                  computing},
54
  isbn =         {0-521-56329-1},
55
  publisher =    {Cambridge University Press},
56
  address =      {New York, NY, USA},
57
  year =         1999
58
}
59

	
60

	
61
%%%%% Tools that LEMON depends on %%%%%
62

	
63
@misc{cmake,
64
  key =          {CMake},
65
  title =        {{CMake} -- {C}ross {P}latform {M}ake},
66
  url =          {http://www.cmake.org/}
67
}
68

	
69
@misc{doxygen,
70
  key =          {Doxygen},
71
  title =        {{Doxygen} -- {S}ource code documentation generator
72
                  tool},
73
  url =          {http://www.doxygen.org/}
74
}
75

	
76

	
77
%%%%% LP/MIP libraries %%%%%
78

	
79
@misc{glpk,
80
  key =          {GLPK},
81
  title =        {{GLPK} -- {GNU} {L}inear {P}rogramming {K}it},
82
  url =          {http://www.gnu.org/software/glpk/}
83
}
84

	
85
@misc{clp,
86
  key =          {Clp},
87
  title =        {{Clp} -- {Coin-Or} {L}inear {P}rogramming},
88
  url =          {http://projects.coin-or.org/Clp/}
89
}
90

	
91
@misc{cbc,
92
  key =          {Cbc},
93
  title =        {{Cbc} -- {Coin-Or} {B}ranch and {C}ut},
94
  url =          {http://projects.coin-or.org/Cbc/}
95
}
96

	
97
@misc{cplex,
98
  key =          {CPLEX},
99
  title =        {{ILOG} {CPLEX}},
100
  url =          {http://www.ilog.com/}
101
}
102

	
103
@misc{soplex,
104
  key =          {SoPlex},
105
  title =        {{SoPlex} -- {T}he {S}equential {O}bject-{O}riented
106
                  {S}implex},
107
  url =          {http://soplex.zib.de/}
108
}
109

	
110

	
111
%%%%% General books %%%%%
112

	
113
@book{amo93networkflows,
114
  author =       {Ravindra K. Ahuja and Thomas L. Magnanti and James
115
                  B. Orlin},
116
  title =        {Network Flows: Theory, Algorithms, and Applications},
117
  publisher =    {Prentice-Hall, Inc.},
118
  year =         1993,
119
  month =        feb,
120
  isbn =         {978-0136175490}
121
}
122

	
123
@book{schrijver03combinatorial,
124
  author =       {Alexander Schrijver},
125
  title =        {Combinatorial Optimization: Polyhedra and Efficiency},
126
  publisher =    {Springer-Verlag},
127
  year =         2003,
128
  isbn =         {978-3540443896}
129
}
130

	
131
@book{clrs01algorithms,
132
  author =       {Thomas H. Cormen and Charles E. Leiserson and Ronald
133
                  L. Rivest and Clifford Stein},
134
  title =        {Introduction to Algorithms},
135
  publisher =    {The MIT Press},
136
  year =         2001,
137
  edition =      {2nd}
138
}
139

	
140
@book{stroustrup00cpp,
141
  author =       {Bjarne Stroustrup},
142
  title =        {The C++ Programming Language},
143
  edition =      {3rd},
144
  publisher =    {Addison-Wesley Professional},
145
  isbn =         0201700735,
146
  month =        {February},
147
  year =         2000
148
}
149

	
150

	
151
%%%%% Maximum flow algorithms %%%%%
152

	
153
@article{edmondskarp72theoretical,
154
  author =       {Jack Edmonds and Richard M. Karp},
155
  title =        {Theoretical improvements in algorithmic efficiency
156
                  for network flow problems},
157
  journal =      {Journal of the ACM},
158
  year =         1972,
159
  volume =       19,
160
  number =       2,
161
  pages =        {248-264}
162
}
163

	
164
@article{goldberg88newapproach,
165
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
166
  title =        {A new approach to the maximum flow problem},
167
  journal =      {Journal of the ACM},
168
  year =         1988,
169
  volume =       35,
170
  number =       4,
171
  pages =        {921-940}
172
}
173

	
174
@article{dinic70algorithm,
175
  author =       {E. A. Dinic},
176
  title =        {Algorithm for solution of a problem of maximum flow
177
                  in a network with power estimation},
178
  journal =      {Soviet Math. Doklady},
179
  year =         1970,
180
  volume =       11,
181
  pages =        {1277-1280}
182
}
183

	
184
@article{goldberg08partial,
185
  author =       {Andrew V. Goldberg},
186
  title =        {The Partial Augment-Relabel Algorithm for the
187
                  Maximum Flow Problem},
188
  journal =      {16th Annual European Symposium on Algorithms},
189
  year =         2008,
190
  pages =        {466-477}
191
}
192

	
193
@article{sleator83dynamic,
194
  author =       {Daniel D. Sleator and Robert E. Tarjan},
195
  title =        {A data structure for dynamic trees},
196
  journal =      {Journal of Computer and System Sciences},
197
  year =         1983,
198
  volume =       26,
199
  number =       3,
200
  pages =        {362-391}
201
}
202

	
203

	
204
%%%%% Minimum mean cycle algorithms %%%%%
205

	
206
@article{karp78characterization,
207
  author =       {Richard M. Karp},
208
  title =        {A characterization of the minimum cycle mean in a
209
                  digraph},
210
  journal =      {Discrete Math.},
211
  year =         1978,
212
  volume =       23,
213
  pages =        {309-311}
214
}
215

	
216
@article{dasdan98minmeancycle,
217
  author =       {Ali Dasdan and Rajesh K. Gupta},
218
  title =        {Faster Maximum and Minimum Mean Cycle Alogrithms for
219
                  System Performance Analysis},
220
  journal =      {IEEE Transactions on Computer-Aided Design of
221
                  Integrated Circuits and Systems},
222
  year =         1998,
223
  volume =       17,
224
  number =       10,
225
  pages =        {889-899}
226
}
227

	
228

	
229
%%%%% Minimum cost flow algorithms %%%%%
230

	
231
@article{klein67primal,
232
  author =       {Morton Klein},
233
  title =        {A primal method for minimal cost flows with
234
                  applications to the assignment and transportation
235
                  problems},
236
  journal =      {Management Science},
237
  year =         1967,
238
  volume =       14,
239
  pages =        {205-220}
240
}
241

	
242
@article{goldberg89cyclecanceling,
243
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
244
  title =        {Finding minimum-cost circulations by canceling
245
                  negative cycles},
246
  journal =      {Journal of the ACM},
247
  year =         1989,
248
  volume =       36,
249
  number =       4,
250
  pages =        {873-886}
251
}
252

	
253
@article{goldberg90approximation,
254
  author =       {Andrew V. Goldberg and Robert E. Tarjan},
255
  title =        {Finding Minimum-Cost Circulations by Successive
256
                  Approximation},
257
  journal =      {Mathematics of Operations Research},
258
  year =         1990,
259
  volume =       15,
260
  number =       3,
261
  pages =        {430-466}
262
}
263

	
264
@article{goldberg97efficient,
265
  author =       {Andrew V. Goldberg},
266
  title =        {An Efficient Implementation of a Scaling
267
                  Minimum-Cost Flow Algorithm},
268
  journal =      {Journal of Algorithms},
269
  year =         1997,
270
  volume =       22,
271
  number =       1,
272
  pages =        {1-29}
273
}
274

	
275
@article{bunnagel98efficient,
276
  author =       {Ursula B{\"u}nnagel and Bernhard Korte and Jens
277
                  Vygen},
278
  title =        {Efficient implementation of the {G}oldberg-{T}arjan
279
                  minimum-cost flow algorithm},
280
  journal =      {Optimization Methods and Software},
281
  year =         1998,
282
  volume =       10,
283
  pages =        {157-174}
284
}
285

	
286
@book{dantzig63linearprog,
287
  author =       {George B. Dantzig},
288
  title =        {Linear Programming and Extensions},
289
  publisher =    {Princeton University Press},
290
  year =         1963
291
}
292

	
293
@mastersthesis{kellyoneill91netsimplex,
294
  author =       {Damian J. Kelly and Garrett M. O'Neill},
295
  title =        {The Minimum Cost Flow Problem and The Network
296
                  Simplex Method},
297
  school =       {University College},
298
  address =      {Dublin, Ireland},
299
  year =         1991,
300
  month =        sep,
301
}
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_BELLMAN_FORD_H
20
#define LEMON_BELLMAN_FORD_H
21

	
22
/// \ingroup shortest_path
23
/// \file
24
/// \brief Bellman-Ford algorithm.
25

	
26
#include <lemon/list_graph.h>
27
#include <lemon/bits/path_dump.h>
28
#include <lemon/core.h>
29
#include <lemon/error.h>
30
#include <lemon/maps.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/path.h>
33

	
34
#include <limits>
35

	
36
namespace lemon {
37

	
38
  /// \brief Default operation traits for the BellmanFord algorithm class.
39
  ///
40
  /// This operation traits class defines all computational operations
41
  /// and constants that are used in the Bellman-Ford algorithm.
42
  /// The default implementation is based on the \c numeric_limits class.
43
  /// If the numeric type does not have infinity value, then the maximum
44
  /// value is used as extremal infinity value.
45
  ///
46
  /// \see BellmanFordToleranceOperationTraits
47
  template <
48
    typename V,
49
    bool has_inf = std::numeric_limits<V>::has_infinity>
50
  struct BellmanFordDefaultOperationTraits {
51
    /// \brief Value type for the algorithm.
52
    typedef V Value;
53
    /// \brief Gives back the zero value of the type.
54
    static Value zero() {
55
      return static_cast<Value>(0);
56
    }
57
    /// \brief Gives back the positive infinity value of the type.
58
    static Value infinity() {
59
      return std::numeric_limits<Value>::infinity();
60
    }
61
    /// \brief Gives back the sum of the given two elements.
62
    static Value plus(const Value& left, const Value& right) {
63
      return left + right;
64
    }
65
    /// \brief Gives back \c true only if the first value is less than
66
    /// the second.
67
    static bool less(const Value& left, const Value& right) {
68
      return left < right;
69
    }
70
  };
71

	
72
  template <typename V>
73
  struct BellmanFordDefaultOperationTraits<V, false> {
74
    typedef V Value;
75
    static Value zero() {
76
      return static_cast<Value>(0);
77
    }
78
    static Value infinity() {
79
      return std::numeric_limits<Value>::max();
80
    }
81
    static Value plus(const Value& left, const Value& right) {
82
      if (left == infinity() || right == infinity()) return infinity();
83
      return left + right;
84
    }
85
    static bool less(const Value& left, const Value& right) {
86
      return left < right;
87
    }
88
  };
89

	
90
  /// \brief Operation traits for the BellmanFord algorithm class
91
  /// using tolerance.
92
  ///
93
  /// This operation traits class defines all computational operations
94
  /// and constants that are used in the Bellman-Ford algorithm.
95
  /// The only difference between this implementation and
96
  /// \ref BellmanFordDefaultOperationTraits is that this class uses
97
  /// the \ref Tolerance "tolerance technique" in its \ref less()
98
  /// function.
99
  ///
100
  /// \tparam V The value type.
101
  /// \tparam eps The epsilon value for the \ref less() function.
102
  /// By default, it is the epsilon value used by \ref Tolerance
103
  /// "Tolerance<V>".
104
  ///
105
  /// \see BellmanFordDefaultOperationTraits
106
#ifdef DOXYGEN
107
  template <typename V, V eps>
108
#else
109
  template <
110
    typename V,
111
    V eps = Tolerance<V>::def_epsilon>
112
#endif
113
  struct BellmanFordToleranceOperationTraits {
114
    /// \brief Value type for the algorithm.
115
    typedef V Value;
116
    /// \brief Gives back the zero value of the type.
117
    static Value zero() {
118
      return static_cast<Value>(0);
119
    }
120
    /// \brief Gives back the positive infinity value of the type.
121
    static Value infinity() {
122
      return std::numeric_limits<Value>::infinity();
123
    }
124
    /// \brief Gives back the sum of the given two elements.
125
    static Value plus(const Value& left, const Value& right) {
126
      return left + right;
127
    }
128
    /// \brief Gives back \c true only if the first value is less than
129
    /// the second.
130
    static bool less(const Value& left, const Value& right) {
131
      return left + eps < right;
132
    }
133
  };
134

	
135
  /// \brief Default traits class of BellmanFord class.
136
  ///
137
  /// Default traits class of BellmanFord class.
138
  /// \param GR The type of the digraph.
139
  /// \param LEN The type of the length map.
140
  template<typename GR, typename LEN>
141
  struct BellmanFordDefaultTraits {
142
    /// The type of the digraph the algorithm runs on.
143
    typedef GR Digraph;
144

	
145
    /// \brief The type of the map that stores the arc lengths.
146
    ///
147
    /// The type of the map that stores the arc lengths.
148
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
149
    typedef LEN LengthMap;
150

	
151
    /// The type of the arc lengths.
152
    typedef typename LEN::Value Value;
153

	
154
    /// \brief Operation traits for Bellman-Ford algorithm.
155
    ///
156
    /// It defines the used operations and the infinity value for the
157
    /// given \c Value type.
158
    /// \see BellmanFordDefaultOperationTraits,
159
    /// BellmanFordToleranceOperationTraits
160
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
161

	
162
    /// \brief The type of the map that stores the last arcs of the
163
    /// shortest paths.
164
    ///
165
    /// The type of the map that stores the last
166
    /// arcs of the shortest paths.
167
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
168
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
169

	
170
    /// \brief Instantiates a \c PredMap.
171
    ///
172
    /// This function instantiates a \ref PredMap.
173
    /// \param g is the digraph to which we would like to define the
174
    /// \ref PredMap.
175
    static PredMap *createPredMap(const GR& g) {
176
      return new PredMap(g);
177
    }
178

	
179
    /// \brief The type of the map that stores the distances of the nodes.
180
    ///
181
    /// The type of the map that stores the distances of the nodes.
182
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
183
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
184

	
185
    /// \brief Instantiates a \c DistMap.
186
    ///
187
    /// This function instantiates a \ref DistMap.
188
    /// \param g is the digraph to which we would like to define the
189
    /// \ref DistMap.
190
    static DistMap *createDistMap(const GR& g) {
191
      return new DistMap(g);
192
    }
193

	
194
  };
195

	
196
  /// \brief %BellmanFord algorithm class.
197
  ///
198
  /// \ingroup shortest_path
199
  /// This class provides an efficient implementation of the Bellman-Ford
200
  /// algorithm. The maximum time complexity of the algorithm is
201
  /// <tt>O(ne)</tt>.
202
  ///
203
  /// The Bellman-Ford algorithm solves the single-source shortest path
204
  /// problem when the arcs can have negative lengths, but the digraph
205
  /// should not contain directed cycles with negative total length.
206
  /// If all arc costs are non-negative, consider to use the Dijkstra
207
  /// algorithm instead, since it is more efficient.
208
  ///
209
  /// The arc lengths are passed to the algorithm using a
210
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any
211
  /// kind of length. The type of the length values is determined by the
212
  /// \ref concepts::ReadMap::Value "Value" type of the length map.
213
  ///
214
  /// There is also a \ref bellmanFord() "function-type interface" for the
215
  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
216
  /// it can be used easier.
217
  ///
218
  /// \tparam GR The type of the digraph the algorithm runs on.
219
  /// The default type is \ref ListDigraph.
220
  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
221
  /// the lengths of the arcs. The default map type is
222
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
223
  /// \tparam TR The traits class that defines various types used by the
224
  /// algorithm. By default, it is \ref BellmanFordDefaultTraits
225
  /// "BellmanFordDefaultTraits<GR, LEN>".
226
  /// In most cases, this parameter should not be set directly,
227
  /// consider to use the named template parameters instead.
228
#ifdef DOXYGEN
229
  template <typename GR, typename LEN, typename TR>
230
#else
231
  template <typename GR=ListDigraph,
232
            typename LEN=typename GR::template ArcMap<int>,
233
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
234
#endif
235
  class BellmanFord {
236
  public:
237

	
238
    ///The type of the underlying digraph.
239
    typedef typename TR::Digraph Digraph;
240

	
241
    /// \brief The type of the arc lengths.
242
    typedef typename TR::LengthMap::Value Value;
243
    /// \brief The type of the map that stores the arc lengths.
244
    typedef typename TR::LengthMap LengthMap;
245
    /// \brief The type of the map that stores the last
246
    /// arcs of the shortest paths.
247
    typedef typename TR::PredMap PredMap;
248
    /// \brief The type of the map that stores the distances of the nodes.
249
    typedef typename TR::DistMap DistMap;
250
    /// The type of the paths.
251
    typedef PredMapPath<Digraph, PredMap> Path;
252
    ///\brief The \ref BellmanFordDefaultOperationTraits
253
    /// "operation traits class" of the algorithm.
254
    typedef typename TR::OperationTraits OperationTraits;
255

	
256
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
257
    typedef TR Traits;
258

	
259
  private:
260

	
261
    typedef typename Digraph::Node Node;
262
    typedef typename Digraph::NodeIt NodeIt;
263
    typedef typename Digraph::Arc Arc;
264
    typedef typename Digraph::OutArcIt OutArcIt;
265

	
266
    // Pointer to the underlying digraph.
267
    const Digraph *_gr;
268
    // Pointer to the length map
269
    const LengthMap *_length;
270
    // Pointer to the map of predecessors arcs.
271
    PredMap *_pred;
272
    // Indicates if _pred is locally allocated (true) or not.
273
    bool _local_pred;
274
    // Pointer to the map of distances.
275
    DistMap *_dist;
276
    // Indicates if _dist is locally allocated (true) or not.
277
    bool _local_dist;
278

	
279
    typedef typename Digraph::template NodeMap<bool> MaskMap;
280
    MaskMap *_mask;
281

	
282
    std::vector<Node> _process;
283

	
284
    // Creates the maps if necessary.
285
    void create_maps() {
286
      if(!_pred) {
287
        _local_pred = true;
288
        _pred = Traits::createPredMap(*_gr);
289
      }
290
      if(!_dist) {
291
        _local_dist = true;
292
        _dist = Traits::createDistMap(*_gr);
293
      }
294
      if(!_mask) {
295
        _mask = new MaskMap(*_gr);
296
      }
297
    }
298

	
299
  public :
300

	
301
    typedef BellmanFord Create;
302

	
303
    /// \name Named Template Parameters
304

	
305
    ///@{
306

	
307
    template <class T>
308
    struct SetPredMapTraits : public Traits {
309
      typedef T PredMap;
310
      static PredMap *createPredMap(const Digraph&) {
311
        LEMON_ASSERT(false, "PredMap is not initialized");
312
        return 0; // ignore warnings
313
      }
314
    };
315

	
316
    /// \brief \ref named-templ-param "Named parameter" for setting
317
    /// \c PredMap type.
318
    ///
319
    /// \ref named-templ-param "Named parameter" for setting
320
    /// \c PredMap type.
321
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
322
    template <class T>
323
    struct SetPredMap
324
      : public BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > {
325
      typedef BellmanFord< Digraph, LengthMap, SetPredMapTraits<T> > Create;
326
    };
327

	
328
    template <class T>
329
    struct SetDistMapTraits : public Traits {
330
      typedef T DistMap;
331
      static DistMap *createDistMap(const Digraph&) {
332
        LEMON_ASSERT(false, "DistMap is not initialized");
333
        return 0; // ignore warnings
334
      }
335
    };
336

	
337
    /// \brief \ref named-templ-param "Named parameter" for setting
338
    /// \c DistMap type.
339
    ///
340
    /// \ref named-templ-param "Named parameter" for setting
341
    /// \c DistMap type.
342
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
343
    template <class T>
344
    struct SetDistMap
345
      : public BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > {
346
      typedef BellmanFord< Digraph, LengthMap, SetDistMapTraits<T> > Create;
347
    };
348

	
349
    template <class T>
350
    struct SetOperationTraitsTraits : public Traits {
351
      typedef T OperationTraits;
352
    };
353

	
354
    /// \brief \ref named-templ-param "Named parameter" for setting
355
    /// \c OperationTraits type.
356
    ///
357
    /// \ref named-templ-param "Named parameter" for setting
358
    /// \c OperationTraits type.
359
    /// For more information, see \ref BellmanFordDefaultOperationTraits.
360
    template <class T>
361
    struct SetOperationTraits
362
      : public BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> > {
363
      typedef BellmanFord< Digraph, LengthMap, SetOperationTraitsTraits<T> >
364
      Create;
365
    };
366

	
367
    ///@}
368

	
369
  protected:
370

	
371
    BellmanFord() {}
372

	
373
  public:
374

	
375
    /// \brief Constructor.
376
    ///
377
    /// Constructor.
378
    /// \param g The digraph the algorithm runs on.
379
    /// \param length The length map used by the algorithm.
380
    BellmanFord(const Digraph& g, const LengthMap& length) :
381
      _gr(&g), _length(&length),
382
      _pred(0), _local_pred(false),
383
      _dist(0), _local_dist(false), _mask(0) {}
384

	
385
    ///Destructor.
386
    ~BellmanFord() {
387
      if(_local_pred) delete _pred;
388
      if(_local_dist) delete _dist;
389
      if(_mask) delete _mask;
390
    }
391

	
392
    /// \brief Sets the length map.
393
    ///
394
    /// Sets the length map.
395
    /// \return <tt>(*this)</tt>
396
    BellmanFord &lengthMap(const LengthMap &map) {
397
      _length = &map;
398
      return *this;
399
    }
400

	
401
    /// \brief Sets the map that stores the predecessor arcs.
402
    ///
403
    /// Sets the map that stores the predecessor arcs.
404
    /// If you don't use this function before calling \ref run()
405
    /// or \ref init(), an instance will be allocated automatically.
406
    /// The destructor deallocates this automatically allocated map,
407
    /// of course.
408
    /// \return <tt>(*this)</tt>
409
    BellmanFord &predMap(PredMap &map) {
410
      if(_local_pred) {
411
        delete _pred;
412
        _local_pred=false;
413
      }
414
      _pred = &map;
415
      return *this;
416
    }
417

	
418
    /// \brief Sets the map that stores the distances of the nodes.
419
    ///
420
    /// Sets the map that stores the distances of the nodes calculated
421
    /// by the algorithm.
422
    /// If you don't use this function before calling \ref run()
423
    /// or \ref init(), an instance will be allocated automatically.
424
    /// The destructor deallocates this automatically allocated map,
425
    /// of course.
426
    /// \return <tt>(*this)</tt>
427
    BellmanFord &distMap(DistMap &map) {
428
      if(_local_dist) {
429
        delete _dist;
430
        _local_dist=false;
431
      }
432
      _dist = &map;
433
      return *this;
434
    }
435

	
436
    /// \name Execution Control
437
    /// The simplest way to execute the Bellman-Ford algorithm is to use
438
    /// one of the member functions called \ref run().\n
439
    /// If you need better control on the execution, you have to call
440
    /// \ref init() first, then you can add several source nodes
441
    /// with \ref addSource(). Finally the actual path computation can be
442
    /// performed with \ref start(), \ref checkedStart() or
443
    /// \ref limitedStart().
444

	
445
    ///@{
446

	
447
    /// \brief Initializes the internal data structures.
448
    ///
449
    /// Initializes the internal data structures. The optional parameter
450
    /// is the initial distance of each node.
451
    void init(const Value value = OperationTraits::infinity()) {
452
      create_maps();
453
      for (NodeIt it(*_gr); it != INVALID; ++it) {
454
        _pred->set(it, INVALID);
455
        _dist->set(it, value);
456
      }
457
      _process.clear();
458
      if (OperationTraits::less(value, OperationTraits::infinity())) {
459
        for (NodeIt it(*_gr); it != INVALID; ++it) {
460
          _process.push_back(it);
461
          _mask->set(it, true);
462
        }
463
      } else {
464
        for (NodeIt it(*_gr); it != INVALID; ++it) {
465
          _mask->set(it, false);
466
        }
467
      }
468
    }
469

	
470
    /// \brief Adds a new source node.
471
    ///
472
    /// This function adds a new source node. The optional second parameter
473
    /// is the initial distance of the node.
474
    void addSource(Node source, Value dst = OperationTraits::zero()) {
475
      _dist->set(source, dst);
476
      if (!(*_mask)[source]) {
477
        _process.push_back(source);
478
        _mask->set(source, true);
479
      }
480
    }
481

	
482
    /// \brief Executes one round from the Bellman-Ford algorithm.
483
    ///
484
    /// If the algoritm calculated the distances in the previous round
485
    /// exactly for the paths of at most \c k arcs, then this function
486
    /// will calculate the distances exactly for the paths of at most
487
    /// <tt>k+1</tt> arcs. Performing \c k iterations using this function
488
    /// calculates the shortest path distances exactly for the paths
489
    /// consisting of at most \c k arcs.
490
    ///
491
    /// \warning The paths with limited arc number cannot be retrieved
492
    /// easily with \ref path() or \ref predArc() functions. If you also
493
    /// need the shortest paths and not only the distances, you should
494
    /// store the \ref predMap() "predecessor map" after each iteration
495
    /// and build the path manually.
496
    ///
497
    /// \return \c true when the algorithm have not found more shorter
498
    /// paths.
499
    ///
500
    /// \see ActiveIt
501
    bool processNextRound() {
502
      for (int i = 0; i < int(_process.size()); ++i) {
503
        _mask->set(_process[i], false);
504
      }
505
      std::vector<Node> nextProcess;
506
      std::vector<Value> values(_process.size());
507
      for (int i = 0; i < int(_process.size()); ++i) {
508
        values[i] = (*_dist)[_process[i]];
509
      }
510
      for (int i = 0; i < int(_process.size()); ++i) {
511
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
512
          Node target = _gr->target(it);
513
          Value relaxed = OperationTraits::plus(values[i], (*_length)[it]);
514
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
515
            _pred->set(target, it);
516
            _dist->set(target, relaxed);
517
            if (!(*_mask)[target]) {
518
              _mask->set(target, true);
519
              nextProcess.push_back(target);
520
            }
521
          }
522
        }
523
      }
524
      _process.swap(nextProcess);
525
      return _process.empty();
526
    }
527

	
528
    /// \brief Executes one weak round from the Bellman-Ford algorithm.
529
    ///
530
    /// If the algorithm calculated the distances in the previous round
531
    /// at least for the paths of at most \c k arcs, then this function
532
    /// will calculate the distances at least for the paths of at most
533
    /// <tt>k+1</tt> arcs.
534
    /// This function does not make it possible to calculate the shortest
535
    /// path distances exactly for paths consisting of at most \c k arcs,
536
    /// this is why it is called weak round.
537
    ///
538
    /// \return \c true when the algorithm have not found more shorter
539
    /// paths.
540
    ///
541
    /// \see ActiveIt
542
    bool processNextWeakRound() {
543
      for (int i = 0; i < int(_process.size()); ++i) {
544
        _mask->set(_process[i], false);
545
      }
546
      std::vector<Node> nextProcess;
547
      for (int i = 0; i < int(_process.size()); ++i) {
548
        for (OutArcIt it(*_gr, _process[i]); it != INVALID; ++it) {
549
          Node target = _gr->target(it);
550
          Value relaxed =
551
            OperationTraits::plus((*_dist)[_process[i]], (*_length)[it]);
552
          if (OperationTraits::less(relaxed, (*_dist)[target])) {
553
            _pred->set(target, it);
554
            _dist->set(target, relaxed);
555
            if (!(*_mask)[target]) {
556
              _mask->set(target, true);
557
              nextProcess.push_back(target);
558
            }
559
          }
560
        }
561
      }
562
      _process.swap(nextProcess);
563
      return _process.empty();
564
    }
565

	
566
    /// \brief Executes the algorithm.
567
    ///
568
    /// Executes the algorithm.
569
    ///
570
    /// This method runs the Bellman-Ford algorithm from the root node(s)
571
    /// in order to compute the shortest path to each node.
572
    ///
573
    /// The algorithm computes
574
    /// - the shortest path tree (forest),
575
    /// - the distance of each node from the root(s).
576
    ///
577
    /// \pre init() must be called and at least one root node should be
578
    /// added with addSource() before using this function.
579
    void start() {
580
      int num = countNodes(*_gr) - 1;
581
      for (int i = 0; i < num; ++i) {
582
        if (processNextWeakRound()) break;
583
      }
584
    }
585

	
586
    /// \brief Executes the algorithm and checks the negative cycles.
587
    ///
588
    /// Executes the algorithm and checks the negative cycles.
589
    ///
590
    /// This method runs the Bellman-Ford algorithm from the root node(s)
591
    /// in order to compute the shortest path to each node and also checks
592
    /// if the digraph contains cycles with negative total length.
593
    ///
594
    /// The algorithm computes
595
    /// - the shortest path tree (forest),
596
    /// - the distance of each node from the root(s).
597
    ///
598
    /// \return \c false if there is a negative cycle in the digraph.
599
    ///
600
    /// \pre init() must be called and at least one root node should be
601
    /// added with addSource() before using this function.
602
    bool checkedStart() {
603
      int num = countNodes(*_gr);
604
      for (int i = 0; i < num; ++i) {
605
        if (processNextWeakRound()) return true;
606
      }
607
      return _process.empty();
608
    }
609

	
610
    /// \brief Executes the algorithm with arc number limit.
611
    ///
612
    /// Executes the algorithm with arc number limit.
613
    ///
614
    /// This method runs the Bellman-Ford algorithm from the root node(s)
615
    /// in order to compute the shortest path distance for each node
616
    /// using only the paths consisting of at most \c num arcs.
617
    ///
618
    /// The algorithm computes
619
    /// - the limited distance of each node from the root(s),
620
    /// - the predecessor arc for each node.
621
    ///
622
    /// \warning The paths with limited arc number cannot be retrieved
623
    /// easily with \ref path() or \ref predArc() functions. If you also
624
    /// need the shortest paths and not only the distances, you should
625
    /// store the \ref predMap() "predecessor map" after each iteration
626
    /// and build the path manually.
627
    ///
628
    /// \pre init() must be called and at least one root node should be
629
    /// added with addSource() before using this function.
630
    void limitedStart(int num) {
631
      for (int i = 0; i < num; ++i) {
632
        if (processNextRound()) break;
633
      }
634
    }
635

	
636
    /// \brief Runs the algorithm from the given root node.
637
    ///
638
    /// This method runs the Bellman-Ford algorithm from the given root
639
    /// node \c s in order to compute the shortest path to each node.
640
    ///
641
    /// The algorithm computes
642
    /// - the shortest path tree (forest),
643
    /// - the distance of each node from the root(s).
644
    ///
645
    /// \note bf.run(s) is just a shortcut of the following code.
646
    /// \code
647
    ///   bf.init();
648
    ///   bf.addSource(s);
649
    ///   bf.start();
650
    /// \endcode
651
    void run(Node s) {
652
      init();
653
      addSource(s);
654
      start();
655
    }
656

	
657
    /// \brief Runs the algorithm from the given root node with arc
658
    /// number limit.
659
    ///
660
    /// This method runs the Bellman-Ford algorithm from the given root
661
    /// node \c s in order to compute the shortest path distance for each
662
    /// node using only the paths consisting of at most \c num arcs.
663
    ///
664
    /// The algorithm computes
665
    /// - the limited distance of each node from the root(s),
666
    /// - the predecessor arc for each node.
667
    ///
668
    /// \warning The paths with limited arc number cannot be retrieved
669
    /// easily with \ref path() or \ref predArc() functions. If you also
670
    /// need the shortest paths and not only the distances, you should
671
    /// store the \ref predMap() "predecessor map" after each iteration
672
    /// and build the path manually.
673
    ///
674
    /// \note bf.run(s, num) is just a shortcut of the following code.
675
    /// \code
676
    ///   bf.init();
677
    ///   bf.addSource(s);
678
    ///   bf.limitedStart(num);
679
    /// \endcode
680
    void run(Node s, int num) {
681
      init();
682
      addSource(s);
683
      limitedStart(num);
684
    }
685

	
686
    ///@}
687

	
688
    /// \brief LEMON iterator for getting the active nodes.
689
    ///
690
    /// This class provides a common style LEMON iterator that traverses
691
    /// the active nodes of the Bellman-Ford algorithm after the last
692
    /// phase. These nodes should be checked in the next phase to
693
    /// find augmenting arcs outgoing from them.
694
    class ActiveIt {
695
    public:
696

	
697
      /// \brief Constructor.
698
      ///
699
      /// Constructor for getting the active nodes of the given BellmanFord
700
      /// instance.
701
      ActiveIt(const BellmanFord& algorithm) : _algorithm(&algorithm)
702
      {
703
        _index = _algorithm->_process.size() - 1;
704
      }
705

	
706
      /// \brief Invalid constructor.
707
      ///
708
      /// Invalid constructor.
709
      ActiveIt(Invalid) : _algorithm(0), _index(-1) {}
710

	
711
      /// \brief Conversion to \c Node.
712
      ///
713
      /// Conversion to \c Node.
714
      operator Node() const {
715
        return _index >= 0 ? _algorithm->_process[_index] : INVALID;
716
      }
717

	
718
      /// \brief Increment operator.
719
      ///
720
      /// Increment operator.
721
      ActiveIt& operator++() {
722
        --_index;
723
        return *this;
724
      }
725

	
726
      bool operator==(const ActiveIt& it) const {
727
        return static_cast<Node>(*this) == static_cast<Node>(it);
728
      }
729
      bool operator!=(const ActiveIt& it) const {
730
        return static_cast<Node>(*this) != static_cast<Node>(it);
731
      }
732
      bool operator<(const ActiveIt& it) const {
733
        return static_cast<Node>(*this) < static_cast<Node>(it);
734
      }
735

	
736
    private:
737
      const BellmanFord* _algorithm;
738
      int _index;
739
    };
740

	
741
    /// \name Query Functions
742
    /// The result of the Bellman-Ford algorithm can be obtained using these
743
    /// functions.\n
744
    /// Either \ref run() or \ref init() should be called before using them.
745

	
746
    ///@{
747

	
748
    /// \brief The shortest path to the given node.
749
    ///
750
    /// Gives back the shortest path to the given node from the root(s).
751
    ///
752
    /// \warning \c t should be reached from the root(s).
753
    ///
754
    /// \pre Either \ref run() or \ref init() must be called before
755
    /// using this function.
756
    Path path(Node t) const
757
    {
758
      return Path(*_gr, *_pred, t);
759
    }
760

	
761
    /// \brief The distance of the given node from the root(s).
762
    ///
763
    /// Returns the distance of the given node from the root(s).
764
    ///
765
    /// \warning If node \c v is not reached from the root(s), then
766
    /// the return value of this function is undefined.
767
    ///
768
    /// \pre Either \ref run() or \ref init() must be called before
769
    /// using this function.
770
    Value dist(Node v) const { return (*_dist)[v]; }
771

	
772
    /// \brief Returns the 'previous arc' of the shortest path tree for
773
    /// the given node.
774
    ///
775
    /// This function returns the 'previous arc' of the shortest path
776
    /// tree for node \c v, i.e. it returns the last arc of a
777
    /// shortest path from a root to \c v. It is \c INVALID if \c v
778
    /// is not reached from the root(s) or if \c v is a root.
779
    ///
780
    /// The shortest path tree used here is equal to the shortest path
781
    /// tree used in \ref predNode() and \ref predMap().
782
    ///
783
    /// \pre Either \ref run() or \ref init() must be called before
784
    /// using this function.
785
    Arc predArc(Node v) const { return (*_pred)[v]; }
786

	
787
    /// \brief Returns the 'previous node' of the shortest path tree for
788
    /// the given node.
789
    ///
790
    /// This function returns the 'previous node' of the shortest path
791
    /// tree for node \c v, i.e. it returns the last but one node of
792
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
793
    /// is not reached from the root(s) or if \c v is a root.
794
    ///
795
    /// The shortest path tree used here is equal to the shortest path
796
    /// tree used in \ref predArc() and \ref predMap().
797
    ///
798
    /// \pre Either \ref run() or \ref init() must be called before
799
    /// using this function.
800
    Node predNode(Node v) const {
801
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]);
802
    }
803

	
804
    /// \brief Returns a const reference to the node map that stores the
805
    /// distances of the nodes.
806
    ///
807
    /// Returns a const reference to the node map that stores the distances
808
    /// of the nodes calculated by the algorithm.
809
    ///
810
    /// \pre Either \ref run() or \ref init() must be called before
811
    /// using this function.
812
    const DistMap &distMap() const { return *_dist;}
813

	
814
    /// \brief Returns a const reference to the node map that stores the
815
    /// predecessor arcs.
816
    ///
817
    /// Returns a const reference to the node map that stores the predecessor
818
    /// arcs, which form the shortest path tree (forest).
819
    ///
820
    /// \pre Either \ref run() or \ref init() must be called before
821
    /// using this function.
822
    const PredMap &predMap() const { return *_pred; }
823

	
824
    /// \brief Checks if a node is reached from the root(s).
825
    ///
826
    /// Returns \c true if \c v is reached from the root(s).
827
    ///
828
    /// \pre Either \ref run() or \ref init() must be called before
829
    /// using this function.
830
    bool reached(Node v) const {
831
      return (*_dist)[v] != OperationTraits::infinity();
832
    }
833

	
834
    /// \brief Gives back a negative cycle.
835
    ///
836
    /// This function gives back a directed cycle with negative total
837
    /// length if the algorithm has already found one.
838
    /// Otherwise it gives back an empty path.
839
    lemon::Path<Digraph> negativeCycle() const {
840
      typename Digraph::template NodeMap<int> state(*_gr, -1);
841
      lemon::Path<Digraph> cycle;
842
      for (int i = 0; i < int(_process.size()); ++i) {
843
        if (state[_process[i]] != -1) continue;
844
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
845
             v = _gr->source((*_pred)[v])) {
846
          if (state[v] == i) {
847
            cycle.addFront((*_pred)[v]);
848
            for (Node u = _gr->source((*_pred)[v]); u != v;
849
                 u = _gr->source((*_pred)[u])) {
850
              cycle.addFront((*_pred)[u]);
851
            }
852
            return cycle;
853
          }
854
          else if (state[v] >= 0) {
855
            break;
856
          }
857
          state[v] = i;
858
        }
859
      }
860
      return cycle;
861
    }
862

	
863
    ///@}
864
  };
865

	
866
  /// \brief Default traits class of bellmanFord() function.
867
  ///
868
  /// Default traits class of bellmanFord() function.
869
  /// \tparam GR The type of the digraph.
870
  /// \tparam LEN The type of the length map.
871
  template <typename GR, typename LEN>
872
  struct BellmanFordWizardDefaultTraits {
873
    /// The type of the digraph the algorithm runs on.
874
    typedef GR Digraph;
875

	
876
    /// \brief The type of the map that stores the arc lengths.
877
    ///
878
    /// The type of the map that stores the arc lengths.
879
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
880
    typedef LEN LengthMap;
881

	
882
    /// The type of the arc lengths.
883
    typedef typename LEN::Value Value;
884

	
885
    /// \brief Operation traits for Bellman-Ford algorithm.
886
    ///
887
    /// It defines the used operations and the infinity value for the
888
    /// given \c Value type.
889
    /// \see BellmanFordDefaultOperationTraits,
890
    /// BellmanFordToleranceOperationTraits
891
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
892

	
893
    /// \brief The type of the map that stores the last
894
    /// arcs of the shortest paths.
895
    ///
896
    /// The type of the map that stores the last arcs of the shortest paths.
897
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
898
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
899

	
900
    /// \brief Instantiates a \c PredMap.
901
    ///
902
    /// This function instantiates a \ref PredMap.
903
    /// \param g is the digraph to which we would like to define the
904
    /// \ref PredMap.
905
    static PredMap *createPredMap(const GR &g) {
906
      return new PredMap(g);
907
    }
908

	
909
    /// \brief The type of the map that stores the distances of the nodes.
910
    ///
911
    /// The type of the map that stores the distances of the nodes.
912
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
913
    typedef typename GR::template NodeMap<Value> DistMap;
914

	
915
    /// \brief Instantiates a \c DistMap.
916
    ///
917
    /// This function instantiates a \ref DistMap.
918
    /// \param g is the digraph to which we would like to define the
919
    /// \ref DistMap.
920
    static DistMap *createDistMap(const GR &g) {
921
      return new DistMap(g);
922
    }
923

	
924
    ///The type of the shortest paths.
925

	
926
    ///The type of the shortest paths.
927
    ///It must meet the \ref concepts::Path "Path" concept.
928
    typedef lemon::Path<Digraph> Path;
929
  };
930

	
931
  /// \brief Default traits class used by BellmanFordWizard.
932
  ///
933
  /// Default traits class used by BellmanFordWizard.
934
  /// \tparam GR The type of the digraph.
935
  /// \tparam LEN The type of the length map.
936
  template <typename GR, typename LEN>
937
  class BellmanFordWizardBase
938
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
939

	
940
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
941
  protected:
942
    // Type of the nodes in the digraph.
943
    typedef typename Base::Digraph::Node Node;
944

	
945
    // Pointer to the underlying digraph.
946
    void *_graph;
947
    // Pointer to the length map
948
    void *_length;
949
    // Pointer to the map of predecessors arcs.
950
    void *_pred;
951
    // Pointer to the map of distances.
952
    void *_dist;
953
    //Pointer to the shortest path to the target node.
954
    void *_path;
955
    //Pointer to the distance of the target node.
956
    void *_di;
957

	
958
    public:
959
    /// Constructor.
960

	
961
    /// This constructor does not require parameters, it initiates
962
    /// all of the attributes to default values \c 0.
963
    BellmanFordWizardBase() :
964
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
965

	
966
    /// Constructor.
967

	
968
    /// This constructor requires two parameters,
969
    /// others are initiated to \c 0.
970
    /// \param gr The digraph the algorithm runs on.
971
    /// \param len The length map.
972
    BellmanFordWizardBase(const GR& gr,
973
                          const LEN& len) :
974
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))),
975
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))),
976
      _pred(0), _dist(0), _path(0), _di(0) {}
977

	
978
  };
979

	
980
  /// \brief Auxiliary class for the function-type interface of the
981
  /// \ref BellmanFord "Bellman-Ford" algorithm.
982
  ///
983
  /// This auxiliary class is created to implement the
984
  /// \ref bellmanFord() "function-type interface" of the
985
  /// \ref BellmanFord "Bellman-Ford" algorithm.
986
  /// It does not have own \ref run() method, it uses the
987
  /// functions and features of the plain \ref BellmanFord.
988
  ///
989
  /// This class should only be used through the \ref bellmanFord()
990
  /// function, which makes it easier to use the algorithm.
991
  ///
992
  /// \tparam TR The traits class that defines various types used by the
993
  /// algorithm.
994
  template<class TR>
995
  class BellmanFordWizard : public TR {
996
    typedef TR Base;
997

	
998
    typedef typename TR::Digraph Digraph;
999

	
1000
    typedef typename Digraph::Node Node;
1001
    typedef typename Digraph::NodeIt NodeIt;
1002
    typedef typename Digraph::Arc Arc;
1003
    typedef typename Digraph::OutArcIt ArcIt;
1004

	
1005
    typedef typename TR::LengthMap LengthMap;
1006
    typedef typename LengthMap::Value Value;
1007
    typedef typename TR::PredMap PredMap;
1008
    typedef typename TR::DistMap DistMap;
1009
    typedef typename TR::Path Path;
1010

	
1011
  public:
1012
    /// Constructor.
1013
    BellmanFordWizard() : TR() {}
1014

	
1015
    /// \brief Constructor that requires parameters.
1016
    ///
1017
    /// Constructor that requires parameters.
1018
    /// These parameters will be the default values for the traits class.
1019
    /// \param gr The digraph the algorithm runs on.
1020
    /// \param len The length map.
1021
    BellmanFordWizard(const Digraph& gr, const LengthMap& len)
1022
      : TR(gr, len) {}
1023

	
1024
    /// \brief Copy constructor
1025
    BellmanFordWizard(const TR &b) : TR(b) {}
1026

	
1027
    ~BellmanFordWizard() {}
1028

	
1029
    /// \brief Runs the Bellman-Ford algorithm from the given source node.
1030
    ///
1031
    /// This method runs the Bellman-Ford algorithm from the given source
1032
    /// node in order to compute the shortest path to each node.
1033
    void run(Node s) {
1034
      BellmanFord<Digraph,LengthMap,TR>
1035
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1036
           *reinterpret_cast<const LengthMap*>(Base::_length));
1037
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1038
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1039
      bf.run(s);
1040
    }
1041

	
1042
    /// \brief Runs the Bellman-Ford algorithm to find the shortest path
1043
    /// between \c s and \c t.
1044
    ///
1045
    /// This method runs the Bellman-Ford algorithm from node \c s
1046
    /// in order to compute the shortest path to node \c t.
1047
    /// Actually, it computes the shortest path to each node, but using
1048
    /// this function you can retrieve the distance and the shortest path
1049
    /// for a single target node easier.
1050
    ///
1051
    /// \return \c true if \c t is reachable form \c s.
1052
    bool run(Node s, Node t) {
1053
      BellmanFord<Digraph,LengthMap,TR>
1054
        bf(*reinterpret_cast<const Digraph*>(Base::_graph),
1055
           *reinterpret_cast<const LengthMap*>(Base::_length));
1056
      if (Base::_pred) bf.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1057
      if (Base::_dist) bf.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1058
      bf.run(s);
1059
      if (Base::_path) *reinterpret_cast<Path*>(Base::_path) = bf.path(t);
1060
      if (Base::_di) *reinterpret_cast<Value*>(Base::_di) = bf.dist(t);
1061
      return bf.reached(t);
1062
    }
1063

	
1064
    template<class T>
1065
    struct SetPredMapBase : public Base {
1066
      typedef T PredMap;
1067
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068
      SetPredMapBase(const TR &b) : TR(b) {}
1069
    };
1070

	
1071
    /// \brief \ref named-templ-param "Named parameter" for setting
1072
    /// the predecessor map.
1073
    ///
1074
    /// \ref named-templ-param "Named parameter" for setting
1075
    /// the map that stores the predecessor arcs of the nodes.
1076
    template<class T>
1077
    BellmanFordWizard<SetPredMapBase<T> > predMap(const T &t) {
1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079
      return BellmanFordWizard<SetPredMapBase<T> >(*this);
1080
    }
1081

	
1082
    template<class T>
1083
    struct SetDistMapBase : public Base {
1084
      typedef T DistMap;
1085
      static DistMap *createDistMap(const Digraph &) { return 0; };
1086
      SetDistMapBase(const TR &b) : TR(b) {}
1087
    };
1088

	
1089
    /// \brief \ref named-templ-param "Named parameter" for setting
1090
    /// the distance map.
1091
    ///
1092
    /// \ref named-templ-param "Named parameter" for setting
1093
    /// the map that stores the distances of the nodes calculated
1094
    /// by the algorithm.
1095
    template<class T>
1096
    BellmanFordWizard<SetDistMapBase<T> > distMap(const T &t) {
1097
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1098
      return BellmanFordWizard<SetDistMapBase<T> >(*this);
1099
    }
1100

	
1101
    template<class T>
1102
    struct SetPathBase : public Base {
1103
      typedef T Path;
1104
      SetPathBase(const TR &b) : TR(b) {}
1105
    };
1106

	
1107
    /// \brief \ref named-func-param "Named parameter" for getting
1108
    /// the shortest path to the target node.
1109
    ///
1110
    /// \ref named-func-param "Named parameter" for getting
1111
    /// the shortest path to the target node.
1112
    template<class T>
1113
    BellmanFordWizard<SetPathBase<T> > path(const T &t)
1114
    {
1115
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1116
      return BellmanFordWizard<SetPathBase<T> >(*this);
1117
    }
1118

	
1119
    /// \brief \ref named-func-param "Named parameter" for getting
1120
    /// the distance of the target node.
1121
    ///
1122
    /// \ref named-func-param "Named parameter" for getting
1123
    /// the distance of the target node.
1124
    BellmanFordWizard dist(const Value &d)
1125
    {
1126
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1127
      return *this;
1128
    }
1129

	
1130
  };
1131

	
1132
  /// \brief Function type interface for the \ref BellmanFord "Bellman-Ford"
1133
  /// algorithm.
1134
  ///
1135
  /// \ingroup shortest_path
1136
  /// Function type interface for the \ref BellmanFord "Bellman-Ford"
1137
  /// algorithm.
1138
  ///
1139
  /// This function also has several \ref named-templ-func-param
1140
  /// "named parameters", they are declared as the members of class
1141
  /// \ref BellmanFordWizard.
1142
  /// The following examples show how to use these parameters.
1143
  /// \code
1144
  ///   // Compute shortest path from node s to each node
1145
  ///   bellmanFord(g,length).predMap(preds).distMap(dists).run(s);
1146
  ///
1147
  ///   // Compute shortest path from s to t
1148
  ///   bool reached = bellmanFord(g,length).path(p).dist(d).run(s,t);
1149
  /// \endcode
1150
  /// \warning Don't forget to put the \ref BellmanFordWizard::run() "run()"
1151
  /// to the end of the parameter list.
1152
  /// \sa BellmanFordWizard
1153
  /// \sa BellmanFord
1154
  template<typename GR, typename LEN>
1155
  BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >
1156
  bellmanFord(const GR& digraph,
1157
              const LEN& length)
1158
  {
1159
    return BellmanFordWizard<BellmanFordWizardBase<GR,LEN> >(digraph, length);
1160
  }
1161

	
1162
} //END OF NAMESPACE LEMON
1163

	
1164
#endif
1165

	
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2010
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#ifndef LEMON_BINOMIAL_HEAP_H
20
#define LEMON_BINOMIAL_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Binomial Heap implementation.
25

	
26
#include <vector>
27
#include <utility>
28
#include <functional>
29
#include <lemon/math.h>
30
#include <lemon/counter.h>
31

	
32
namespace lemon {
33

	
34
  /// \ingroup heaps
35
  ///
36
  ///\brief Binomial heap data structure.
37
  ///
38
  /// This class implements the \e binomial \e heap data structure.
39
  /// It fully conforms to the \ref concepts::Heap "heap concept".
40
  ///
41
  /// The methods \ref increase() and \ref erase() are not efficient
42
  /// in a binomial heap. In case of many calls of these operations,
43
  /// it is better to use other heap structure, e.g. \ref BinHeap
44
  /// "binary heap".
45
  ///
46
  /// \tparam PR Type of the priorities of the items.
47
  /// \tparam IM A read-writable item map with \c int values, used
48
  /// internally to handle the cross references.
49
  /// \tparam CMP A functor class for comparing the priorities.
50
  /// The default is \c std::less<PR>.
51
#ifdef DOXYGEN
52
  template <typename PR, typename IM, typename CMP>
53
#else
54
  template <typename PR, typename IM, typename CMP = std::less<PR> >
55
#endif
56
  class BinomialHeap {
57
  public:
58
    /// Type of the item-int map.
59
    typedef IM ItemIntMap;
60
    /// Type of the priorities.
61
    typedef PR Prio;
62
    /// Type of the items stored in the heap.
63
    typedef typename ItemIntMap::Key Item;
64
    /// Functor type for comparing the priorities.
65
    typedef CMP Compare;
66

	
67
    /// \brief Type to represent the states of the items.
68
    ///
69
    /// Each item has a state associated to it. It can be "in heap",
70
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71
    /// heap's point of view, but may be useful to the user.
72
    ///
73
    /// The item-int map must be initialized in such way that it assigns
74
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75
    enum State {
76
      IN_HEAP = 0,    ///< = 0.
77
      PRE_HEAP = -1,  ///< = -1.
78
      POST_HEAP = -2  ///< = -2.
79
    };
80

	
81
  private:
82
    class Store;
83

	
84
    std::vector<Store> _data;
85
    int _min, _head;
86
    ItemIntMap &_iim;
87
    Compare _comp;
88
    int _num_items;
89

	
90
  public:
91
    /// \brief Constructor.
92
    ///
93
    /// Constructor.
94
    /// \param map A map that assigns \c int values to the items.
95
    /// It is used internally to handle the cross references.
96
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
97
    explicit BinomialHeap(ItemIntMap &map)
98
      : _min(0), _head(-1), _iim(map), _num_items(0) {}
99

	
100
    /// \brief Constructor.
101
    ///
102
    /// Constructor.
103
    /// \param map A map that assigns \c int values to the items.
104
    /// It is used internally to handle the cross references.
105
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
106
    /// \param comp The function object used for comparing the priorities.
107
    BinomialHeap(ItemIntMap &map, const Compare &comp)
108
      : _min(0), _head(-1), _iim(map), _comp(comp), _num_items(0) {}
109

	
110
    /// \brief The number of items stored in the heap.
111
    ///
112
    /// This function returns the number of items stored in the heap.
113
    int size() const { return _num_items; }
114

	
115
    /// \brief Check if the heap is empty.
116
    ///
117
    /// This function returns \c true if the heap is empty.
118
    bool empty() const { return _num_items==0; }
119

	
120
    /// \brief Make the heap empty.
121
    ///
122
    /// This functon makes the heap empty.
123
    /// It does not change the cross reference map. If you want to reuse
124
    /// a heap that is not surely empty, you should first clear it and
125
    /// then you should set the cross reference map to \c PRE_HEAP
126
    /// for each item.
127
    void clear() {
128
      _data.clear(); _min=0; _num_items=0; _head=-1;
129
    }
130

	
131
    /// \brief Set the priority of an item or insert it, if it is
132
    /// not stored in the heap.
133
    ///
134
    /// This method sets the priority of the given item if it is
135
    /// already stored in the heap. Otherwise it inserts the given
136
    /// item into the heap with the given priority.
137
    /// \param item The item.
138
    /// \param value The priority.
139
    void set (const Item& item, const Prio& value) {
140
      int i=_iim[item];
141
      if ( i >= 0 && _data[i].in ) {
142
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
143
        if ( _comp(_data[i].prio, value) ) increase(item, value);
144
      } else push(item, value);
145
    }
146

	
147
    /// \brief Insert an item into the heap with the given priority.
148
    ///
149
    /// This function inserts the given item into the heap with the
150
    /// given priority.
151
    /// \param item The item to insert.
152
    /// \param value The priority of the item.
153
    /// \pre \e item must not be stored in the heap.
154
    void push (const Item& item, const Prio& value) {
155
      int i=_iim[item];
156
      if ( i<0 ) {
157
        int s=_data.size();
158
        _iim.set( item,s );
159
        Store st;
160
        st.name=item;
161
        st.prio=value;
162
        _data.push_back(st);
163
        i=s;
164
      }
165
      else {
166
        _data[i].parent=_data[i].right_neighbor=_data[i].child=-1;
167
        _data[i].degree=0;
168
        _data[i].in=true;
169
        _data[i].prio=value;
170
      }
171

	
172
      if( 0==_num_items ) {
173
        _head=i;
174
        _min=i;
175
      } else {
176
        merge(i);
177
        if( _comp(_data[i].prio, _data[_min].prio) ) _min=i;
178
      }
179
      ++_num_items;
180
    }
181

	
182
    /// \brief Return the item having minimum priority.
183
    ///
184
    /// This function returns the item having minimum priority.
185
    /// \pre The heap must be non-empty.
186
    Item top() const { return _data[_min].name; }
187

	
188
    /// \brief The minimum priority.
189
    ///
190
    /// This function returns the minimum priority.
191
    /// \pre The heap must be non-empty.
192
    Prio prio() const { return _data[_min].prio; }
193

	
194
    /// \brief The priority of the given item.
195
    ///
196
    /// This function returns the priority of the given item.
197
    /// \param item The item.
198
    /// \pre \e item must be in the heap.
199
    const Prio& operator[](const Item& item) const {
200
      return _data[_iim[item]].prio;
201
    }
202

	
203
    /// \brief Remove the item having minimum priority.
204
    ///
205
    /// This function removes the item having minimum priority.
206
    /// \pre The heap must be non-empty.
207
    void pop() {
208
      _data[_min].in=false;
209

	
210
      int head_child=-1;
211
      if ( _data[_min].child!=-1 ) {
212
        int child=_data[_min].child;
213
        int neighb;
214
        while( child!=-1 ) {
215
          neighb=_data[child].right_neighbor;
216
          _data[child].parent=-1;
217
          _data[child].right_neighbor=head_child;
218
          head_child=child;
219
          child=neighb;
220
        }
221
      }
222

	
223
      if ( _data[_head].right_neighbor==-1 ) {
224
        // there was only one root
225
        _head=head_child;
226
      }
227
      else {
228
        // there were more roots
229
        if( _head!=_min )  { unlace(_min); }
230
        else { _head=_data[_head].right_neighbor; }
231
        merge(head_child);
232
      }
233
      _min=findMin();
234
      --_num_items;
235
    }
236

	
237
    /// \brief Remove the given item from the heap.
238
    ///
239
    /// This function removes the given item from the heap if it is
240
    /// already stored.
241
    /// \param item The item to delete.
242
    /// \pre \e item must be in the heap.
243
    void erase (const Item& item) {
244
      int i=_iim[item];
245
      if ( i >= 0 && _data[i].in ) {
246
        decrease( item, _data[_min].prio-1 );
247
        pop();
248
      }
249
    }
250

	
251
    /// \brief Decrease the priority of an item to the given value.
252
    ///
253
    /// This function decreases the priority of an item to the given value.
254
    /// \param item The item.
255
    /// \param value The priority.
256
    /// \pre \e item must be stored in the heap with priority at least \e value.
257
    void decrease (Item item, const Prio& value) {
258
      int i=_iim[item];
259
      int p=_data[i].parent;
260
      _data[i].prio=value;
261

	
262
      while( p!=-1 && _comp(value, _data[p].prio) ) {
263
        _data[i].name=_data[p].name;
264
        _data[i].prio=_data[p].prio;
265
        _data[p].name=item;
266
        _data[p].prio=value;
267
        _iim[_data[i].name]=i;
268
        i=p;
269
        p=_data[p].parent;
270
      }
271
      _iim[item]=i;
272
      if ( _comp(value, _data[_min].prio) ) _min=i;
273
    }
274

	
275
    /// \brief Increase the priority of an item to the given value.
276
    ///
277
    /// This function increases the priority of an item to the given value.
278
    /// \param item The item.
279
    /// \param value The priority.
280
    /// \pre \e item must be stored in the heap with priority at most \e value.
281
    void increase (Item item, const Prio& value) {
282
      erase(item);
283
      push(item, value);
284
    }
285

	
286
    /// \brief Return the state of an item.
287
    ///
288
    /// This method returns \c PRE_HEAP if the given item has never
289
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
290
    /// and \c POST_HEAP otherwise.
291
    /// In the latter case it is possible that the item will get back
292
    /// to the heap again.
293
    /// \param item The item.
294
    State state(const Item &item) const {
295
      int i=_iim[item];
296
      if( i>=0 ) {
297
        if ( _data[i].in ) i=0;
298
        else i=-2;
299
      }
300
      return State(i);
301
    }
302

	
303
    /// \brief Set the state of an item in the heap.
304
    ///
305
    /// This function sets the state of the given item in the heap.
306
    /// It can be used to manually clear the heap when it is important
307
    /// to achive better time complexity.
308
    /// \param i The item.
309
    /// \param st The state. It should not be \c IN_HEAP.
310
    void state(const Item& i, State st) {
311
      switch (st) {
312
      case POST_HEAP:
313
      case PRE_HEAP:
314
        if (state(i) == IN_HEAP) {
315
          erase(i);
316
        }
317
        _iim[i] = st;
318
        break;
319
      case IN_HEAP:
320
        break;
321
      }
322
    }
323

	
324
  private:
325

	
326
    // Find the minimum of the roots
327
    int findMin() {
328
      if( _head!=-1 ) {
329
        int min_loc=_head, min_val=_data[_head].prio;
330
        for( int x=_data[_head].right_neighbor; x!=-1;
331
             x=_data[x].right_neighbor ) {
332
          if( _comp( _data[x].prio,min_val ) ) {
333
            min_val=_data[x].prio;
334
            min_loc=x;
335
          }
336
        }
337
        return min_loc;
338
      }
339
      else return -1;
340
    }
341

	
342
    // Merge the heap with another heap starting at the given position
343
    void merge(int a) {
344
      if( _head==-1 || a==-1 ) return;
345
      if( _data[a].right_neighbor==-1 &&
346
          _data[a].degree<=_data[_head].degree ) {
347
        _data[a].right_neighbor=_head;
348
        _head=a;
349
      } else {
350
        interleave(a);
351
      }
352
      if( _data[_head].right_neighbor==-1 ) return;
353

	
354
      int x=_head;
355
      int x_prev=-1, x_next=_data[x].right_neighbor;
356
      while( x_next!=-1 ) {
357
        if( _data[x].degree!=_data[x_next].degree ||
358
            ( _data[x_next].right_neighbor!=-1 &&
359
              _data[_data[x_next].right_neighbor].degree==_data[x].degree ) ) {
360
          x_prev=x;
361
          x=x_next;
362
        }
363
        else {
364
          if( _comp(_data[x_next].prio,_data[x].prio) ) {
365
            if( x_prev==-1 ) {
366
              _head=x_next;
367
            } else {
368
              _data[x_prev].right_neighbor=x_next;
369
            }
370
            fuse(x,x_next);
371
            x=x_next;
372
          }
373
          else {
374
            _data[x].right_neighbor=_data[x_next].right_neighbor;
375
            fuse(x_next,x);
376
          }
377
        }
378
        x_next=_data[x].right_neighbor;
379
      }
380
    }
381

	
382
    // Interleave the elements of the given list into the list of the roots
383
    void interleave(int a) {
384
      int p=_head, q=a;
385
      int curr=_data.size();
386
      _data.push_back(Store());
387

	
388
      while( p!=-1 || q!=-1 ) {
389
        if( q==-1 || ( p!=-1 && _data[p].degree<_data[q].degree ) ) {
390
          _data[curr].right_neighbor=p;
391
          curr=p;
392
          p=_data[p].right_neighbor;
393
        }
394
        else {
395
          _data[curr].right_neighbor=q;
396
          curr=q;
397
          q=_data[q].right_neighbor;
398
        }
399
      }
400

	
401
      _head=_data.back().right_neighbor;
402
      _data.pop_back();
403
    }
404

	
405
    // Lace node a under node b
406
    void fuse(int a, int b) {
407
      _data[a].parent=b;
408
      _data[a].right_neighbor=_data[b].child;
409
      _data[b].child=a;
410

	
411
      ++_data[b].degree;
412
    }
413

	
414
    // Unlace node a (if it has siblings)
415
    void unlace(int a) {
416
      int neighb=_data[a].right_neighbor;
417
      int other=_head;
418

	
419
      while( _data[other].right_neighbor!=a )
420
        other=_data[other].right_neighbor;
421
      _data[other].right_neighbor=neighb;
422
    }
423

	
424
  private:
425

	
426
    class Store {
427
      friend class BinomialHeap;
428

	
429
      Item name;
430
      int parent;
431
      int right_neighbor;
432
      int child;
433
      int degree;
434
      bool in;
435
      Prio prio;
436

	
437
      Store() : parent(-1), right_neighbor(-1), child(-1), degree(0),
438
        in(true) {}
439
    };
440
  };
441

	
442
} //namespace lemon
443

	
444
#endif //LEMON_BINOMIAL_HEAP_H
445

	
Ignore white space 6 line context
... ...
@@ -17,16 +17,17 @@
17 17
config.log
18 18
config.status
19 19
libtool
20 20
stamp-h1
21 21
lemon/lemon.pc
22 22
lemon/libemon.la
23 23
lemon/stamp-h2
24 24
doc/Doxyfile
25
doc/references.dox
25 26
cmake/version.cmake
26 27
.dirstamp
27 28
.libs/*
28 29
.deps/*
29 30
demo/*.eps
30 31
m4/libtool.m4
31 32
m4/ltoptions.m4
32 33
m4/ltsugar.m4
Ignore white space 6 line context
... ...
@@ -109,16 +109,18 @@
109 109
    "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel Maintainer."
110 110
    FORCE )
111 111

	
112 112

	
113 113
INCLUDE(CheckTypeSize)
114 114
CHECK_TYPE_SIZE("long long" LONG_LONG)
115 115
SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
116 116

	
117
INCLUDE(FindPythonInterp)
118

	
117 119
ENABLE_TESTING()
118 120

	
119 121
IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer")
120 122
  ADD_CUSTOM_TARGET(check ALL COMMAND ${CMAKE_CTEST_COMMAND})
121 123
ELSE()
122 124
  ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND})
123 125
ENDIF()
124 126

	
Ignore white space 6 line context
... ...
@@ -168,8 +168,30 @@
168 168

	
169 169
   The directory where the COIN-OR libraries are located. This is only
170 170
   useful when the COIN-OR headers and libraries are not under the
171 171
   same prefix (which is unlikely).
172 172

	
173 173
--without-coin
174 174

	
175 175
   Disable COIN-OR support.
176

	
177

	
178
Makefile Variables
179
==================
180

	
181
Some Makefile variables are reserved by the GNU Coding Standards for
182
the use of the "user" - the person building the package. For instance,
183
CXX and CXXFLAGS are such variables, and have the same meaning as
184
explained in the previous section. These variables can be set on the
185
command line when invoking `make' like this:
186
`make [VARIABLE=VALUE]...'
187

	
188
WARNINGCXXFLAGS is a non-standard Makefile variable introduced by us
189
to hold several compiler flags related to warnings. Its default value
190
can be overridden when invoking `make'. For example to disable all
191
warning flags use `make WARNINGCXXFLAGS='.
192

	
193
In order to turn off a single flag from the default set of warning
194
flags, you can use the CXXFLAGS variable, since this is passed after
195
WARNINGCXXFLAGS. For example to turn off `-Wold-style-cast' (which is
196
used by default when g++ is detected) you can use
197
`make CXXFLAGS="-g -O2 -Wno-old-style-cast"'.
Ignore white space 6 line context
... ...
@@ -39,16 +39,17 @@
39 39
dist_bin_SCRIPTS =
40 40
TESTS =
41 41
XFAIL_TESTS =
42 42

	
43 43
include lemon/Makefile.am
44 44
include test/Makefile.am
45 45
include doc/Makefile.am
46 46
include tools/Makefile.am
47
include scripts/Makefile.am
47 48

	
48 49
DIST_SUBDIRS = demo
49 50

	
50 51
demo:
51 52
	$(MAKE) $(AM_MAKEFLAGS) -C demo
52 53

	
53 54
MRPROPERFILES = \
54 55
	aclocal.m4 \
Ignore white space 6 line context
... ...
@@ -12,31 +12,39 @@
12 12

	
13 13
Contents
14 14
========
15 15

	
16 16
LICENSE
17 17

	
18 18
   Copying, distribution and modification conditions and terms.
19 19

	
20
NEWS
21

	
22
   News and version history.
23

	
20 24
INSTALL
21 25

	
22 26
   General building and installation instructions.
23 27

	
24 28
lemon/
25 29

	
26 30
   Source code of LEMON library.
27 31

	
28 32
doc/
29 33

	
30 34
   Documentation of LEMON. The starting page is doc/html/index.html.
31 35

	
32 36
demo/
33 37

	
34 38
   Some example programs to make you easier to get familiar with LEMON.
35 39

	
40
scripts/
41

	
42
   Scripts that make it easier to develop LEMON.
43

	
36 44
test/
37 45

	
38 46
   Programs to check the integrity and correctness of LEMON.
39 47

	
40 48
tools/
41 49

	
42 50
   Various utilities related to LEMON.
Ignore white space 6 line context
... ...
@@ -36,16 +36,17 @@
36 36
dnl Checks for programs.
37 37
AC_PROG_CXX
38 38
AC_PROG_CXXCPP
39 39
AC_PROG_INSTALL
40 40
AC_DISABLE_SHARED
41 41
AC_PROG_LIBTOOL
42 42

	
43 43
AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no])
44
AC_CHECK_PROG([python_found],[python],[yes],[no])
44 45
AC_CHECK_PROG([gs_found],[gs],[yes],[no])
45 46

	
46 47
dnl Detect Intel compiler.
47 48
AC_MSG_CHECKING([whether we are using the Intel C++ compiler])
48 49
AC_COMPILE_IFELSE([#ifndef __INTEL_COMPILER
49 50
choke me
50 51
#endif], [ICC=[yes]], [ICC=[no]])
51 52
if test x"$ICC" = x"yes"; then
... ...
@@ -77,16 +78,31 @@
77 78
AC_MSG_CHECKING([whether to build the additional tools])
78 79
if test x"$enable_tools" != x"no"; then
79 80
  AC_MSG_RESULT([yes])
80 81
else
81 82
  AC_MSG_RESULT([no])
82 83
fi
83 84
AM_CONDITIONAL([WANT_TOOLS], [test x"$enable_tools" != x"no"])
84 85

	
86
dnl Support for running test cases using valgrind.
87
use_valgrind=no
88
AC_ARG_ENABLE([valgrind],
89
AS_HELP_STRING([--enable-valgrind], [use valgrind when running tests]),
90
              [use_valgrind=yes])
91

	
92
if [[ "$use_valgrind" = "yes" ]]; then
93
  AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
94

	
95
  if [[ "$HAVE_VALGRIND" = "no" ]]; then
96
    AC_MSG_ERROR([Valgrind not found in PATH.])
97
  fi
98
fi
99
AM_CONDITIONAL(USE_VALGRIND, [test "$use_valgrind" = "yes"])
100

	
85 101
dnl Checks for header files.
86 102
AC_CHECK_HEADERS(limits.h sys/time.h sys/times.h unistd.h)
87 103

	
88 104
dnl Checks for typedefs, structures, and compiler characteristics.
89 105
AC_C_CONST
90 106
AC_C_INLINE
91 107
AC_TYPE_SIZE_T
92 108
AC_HEADER_TIME
... ...
@@ -123,16 +139,17 @@
123 139
echo
124 140
echo GLPK support.................. : $lx_glpk_found
125 141
echo CPLEX support................. : $lx_cplex_found
126 142
echo SOPLEX support................ : $lx_soplex_found
127 143
echo CLP support................... : $lx_clp_found
128 144
echo CBC support................... : $lx_cbc_found
129 145
echo
130 146
echo Build additional tools........ : $enable_tools
147
echo Use valgrind for tests........ : $use_valgrind
131 148
echo
132 149
echo The packace will be installed in
133 150
echo -n '  '
134 151
echo $prefix.
135 152
echo
136 153
echo '*********************************************************************'
137 154

	
138 155
echo
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -60,19 +60,28 @@
60 60
  // Set the group mandatory
61 61
  ap.mandatoryGroup("gr");
62 62
  // Set the options of the group exclusive (only one option can be given)
63 63
  ap.onlyOneGroup("gr");
64 64
  // Add non-parsed arguments (e.g. input files)
65 65
  ap.other("infile", "The input file.")
66 66
    .other("...");
67 67

	
68
  // Throw an exception when problems occurs. The default behavior is to
69
  // exit(1) on these cases, but this makes Valgrind falsely warn
70
  // about memory leaks.
71
  ap.throwOnProblems();
72

	
68 73
  // Perform the parsing process
69 74
  // (in case of any error it terminates the program)
70
  ap.parse();
75
  // The try {} construct is necessary only if the ap.trowOnProblems()
76
  // setting is in use.
77
  try {
78
    ap.parse();
79
  } catch (ArgParserException &) { return 1; }
71 80

	
72 81
  // Check each option if it has been given and print its value
73 82
  std::cout << "Parameters of '" << ap.commandName() << "':\n";
74 83

	
75 84
  std::cout << "  Value of -n: " << i << std::endl;
76 85
  if(ap.given("val")) std::cout << "  Value of -val: " << d << std::endl;
77 86
  if(ap.given("val2")) {
78 87
    d = ap["val2"];
Ignore white space 6 line context
... ...
@@ -12,35 +12,38 @@
12 12
)
13 13

	
14 14
CONFIGURE_FILE(
15 15
  ${PROJECT_SOURCE_DIR}/doc/mainpage.dox.in
16 16
  ${PROJECT_BINARY_DIR}/doc/mainpage.dox
17 17
  @ONLY
18 18
)
19 19

	
20
IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
20
IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE)
21 21
  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
22 22
  SET(GHOSTSCRIPT_OPTIONS -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha)
23 23
  ADD_CUSTOM_TARGET(html
24 24
    COMMAND ${CMAKE_COMMAND} -E remove_directory gen-images
25 25
    COMMAND ${CMAKE_COMMAND} -E make_directory gen-images
26 26
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
27 27
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
28 28
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
29 29
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
30 30
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
31
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/matching.eps
31 32
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
32 33
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
33 34
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
34 35
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
35 36
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
36 37
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
38
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/planar.png ${CMAKE_CURRENT_SOURCE_DIR}/images/planar.eps
37 39
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
38 40
    COMMAND ${CMAKE_COMMAND} -E remove_directory html
41
    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox
39 42
    COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
40 43
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
41 44
  )
42 45

	
43 46
  SET_TARGET_PROPERTIES(html PROPERTIES PROJECT_LABEL BUILD_DOC)
44 47

	
45 48
  IF(UNIX)
46 49
    INSTALL(
Ignore white space 6 line context
... ...
@@ -92,17 +92,18 @@
92 92
#---------------------------------------------------------------------------
93 93
INPUT                  = "@abs_top_srcdir@/doc" \
94 94
                         "@abs_top_srcdir@/lemon" \
95 95
                         "@abs_top_srcdir@/lemon/bits" \
96 96
                         "@abs_top_srcdir@/lemon/concepts" \
97 97
                         "@abs_top_srcdir@/demo" \
98 98
                         "@abs_top_srcdir@/tools" \
99 99
                         "@abs_top_srcdir@/test/test_tools.h" \
100
                         "@abs_top_builddir@/doc/mainpage.dox"
100
                         "@abs_top_builddir@/doc/mainpage.dox" \
101
                         "@abs_top_builddir@/doc/references.dox"
101 102
INPUT_ENCODING         = UTF-8
102 103
FILE_PATTERNS          = *.h \
103 104
                         *.cc \
104 105
                         *.dox
105 106
RECURSIVE              = NO
106 107
EXCLUDE                = 
107 108
EXCLUDE_SYMLINKS       = NO
108 109
EXCLUDE_PATTERNS       = 
Ignore white space 6 line context
... ...
@@ -22,17 +22,19 @@
22 22
	nodeshape_3.eps \
23 23
	nodeshape_4.eps
24 24

	
25 25
DOC_EPS_IMAGES27 = \
26 26
	bipartite_matching.eps \
27 27
	bipartite_partitions.eps \
28 28
	connected_components.eps \
29 29
	edge_biconnected_components.eps \
30
	matching.eps \
30 31
	node_biconnected_components.eps \
32
	planar.eps \
31 33
	strongly_connected_components.eps
32 34

	
33 35
DOC_EPS_IMAGES = \
34 36
	$(DOC_EPS_IMAGES18) \
35 37
	$(DOC_EPS_IMAGES27)
36 38

	
37 39
DOC_PNG_IMAGES = \
38 40
	$(DOC_EPS_IMAGES:%.eps=doc/gen-images/%.png)
... ...
@@ -61,17 +63,29 @@
61 63
	  $(GS_COMMAND) -sDEVICE=pngalpha -r27 -sOutputFile=$@ $<; \
62 64
	else \
63 65
	  echo; \
64 66
	  echo "Ghostscript not found."; \
65 67
	  echo; \
66 68
	  exit 1; \
67 69
	fi
68 70

	
69
html-local: $(DOC_PNG_IMAGES)
71
references.dox: doc/references.bib
72
	if test ${python_found} = yes; then \
73
	  cd doc; \
74
	  python @abs_top_srcdir@/scripts/bib2dox.py @abs_top_builddir@/$< >$@; \
75
	  cd ..; \
76
	else \
77
	  echo; \
78
	  echo "Python not found."; \
79
	  echo; \
80
	  exit 1; \
81
	fi
82

	
83
html-local: $(DOC_PNG_IMAGES) references.dox
70 84
	if test ${doxygen_found} = yes; then \
71 85
	  cd doc; \
72 86
	  doxygen Doxyfile; \
73 87
	  cd ..; \
74 88
	else \
75 89
	  echo; \
76 90
	  echo "Doxygen not found."; \
77 91
	  echo; \
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -221,143 +221,203 @@
221 221
We have a length map and a maximum speed map on the arcs of a digraph.
222 222
The minimum time to pass the arc can be calculated as the division of
223 223
the two maps which can be done implicitly with the \c DivMap template
224 224
class. We use the implicit minimum time map as the length map of the
225 225
\c Dijkstra algorithm.
226 226
*/
227 227

	
228 228
/**
229
@defgroup matrices Matrices
230
@ingroup datas
231
\brief Two dimensional data storages implemented in LEMON.
232

	
233
This group contains two dimensional data storages implemented in LEMON.
234
*/
235

	
236
/**
237 229
@defgroup paths Path Structures
238 230
@ingroup datas
239 231
\brief %Path structures implemented in LEMON.
240 232

	
241 233
This group contains the path structures implemented in LEMON.
242 234

	
243 235
LEMON provides flexible data structures to work with paths.
244 236
All of them have similar interfaces and they can be copied easily with
245 237
assignment operators and copy constructors. This makes it easy and
246 238
efficient to have e.g. the Dijkstra algorithm to store its result in
247 239
any kind of path structure.
248 240

	
249
\sa lemon::concepts::Path
241
\sa \ref concepts::Path "Path concept"
242
*/
243

	
244
/**
245
@defgroup heaps Heap Structures
246
@ingroup datas
247
\brief %Heap structures implemented in LEMON.
248

	
249
This group contains the heap structures implemented in LEMON.
250

	
251
LEMON provides several heap classes. They are efficient implementations
252
of the abstract data type \e priority \e queue. They store items with
253
specified values called \e priorities in such a way that finding and
254
removing the item with minimum priority are efficient.
255
The basic operations are adding and erasing items, changing the priority
256
of an item, etc.
257

	
258
Heaps are crucial in several algorithms, such as Dijkstra and Prim.
259
The heap implementations have the same interface, thus any of them can be
260
used easily in such algorithms.
261

	
262
\sa \ref concepts::Heap "Heap concept"
263
*/
264

	
265
/**
266
@defgroup matrices Matrices
267
@ingroup datas
268
\brief Two dimensional data storages implemented in LEMON.
269

	
270
This group contains two dimensional data storages implemented in LEMON.
250 271
*/
251 272

	
252 273
/**
253 274
@defgroup auxdat Auxiliary Data Structures
254 275
@ingroup datas
255 276
\brief Auxiliary data structures implemented in LEMON.
256 277

	
257 278
This group contains some data structures implemented in LEMON in
258 279
order to make it easier to implement combinatorial algorithms.
259 280
*/
260 281

	
261 282
/**
283
@defgroup geomdat Geometric Data Structures
284
@ingroup auxdat
285
\brief Geometric data structures implemented in LEMON.
286

	
287
This group contains geometric data structures implemented in LEMON.
288

	
289
 - \ref lemon::dim2::Point "dim2::Point" implements a two dimensional
290
   vector with the usual operations.
291
 - \ref lemon::dim2::Box "dim2::Box" can be used to determine the
292
   rectangular bounding box of a set of \ref lemon::dim2::Point
293
   "dim2::Point"'s.
294
*/
295

	
296
/**
297
@defgroup matrices Matrices
298
@ingroup auxdat
299
\brief Two dimensional data storages implemented in LEMON.
300

	
301
This group contains two dimensional data storages implemented in LEMON.
302
*/
303

	
304
/**
262 305
@defgroup algs Algorithms
263 306
\brief This group contains the several algorithms
264 307
implemented in LEMON.
265 308

	
266 309
This group contains the several algorithms
267 310
implemented in LEMON.
268 311
*/
269 312

	
270 313
/**
271 314
@defgroup search Graph Search
272 315
@ingroup algs
273 316
\brief Common graph search algorithms.
274 317

	
275 318
This group contains the common graph search algorithms, namely
276
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
319
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS)
320
\ref clrs01algorithms.
277 321
*/
278 322

	
279 323
/**
280 324
@defgroup shortest_path Shortest Path Algorithms
281 325
@ingroup algs
282 326
\brief Algorithms for finding shortest paths.
283 327

	
284
This group contains the algorithms for finding shortest paths in digraphs.
328
This group contains the algorithms for finding shortest paths in digraphs
329
\ref clrs01algorithms.
285 330

	
286 331
 - \ref Dijkstra algorithm for finding shortest paths from a source node
287 332
   when all arc lengths are non-negative.
288 333
 - \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths
289 334
   from a source node when arc lenghts can be either positive or negative,
290 335
   but the digraph should not contain directed cycles with negative total
291 336
   length.
292 337
 - \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms
293 338
   for solving the \e all-pairs \e shortest \e paths \e problem when arc
294 339
   lenghts can be either positive or negative, but the digraph should
295 340
   not contain directed cycles with negative total length.
296 341
 - \ref Suurballe A successive shortest path algorithm for finding
297 342
   arc-disjoint paths between two nodes having minimum total length.
298 343
*/
299 344

	
300 345
/**
346
@defgroup spantree Minimum Spanning Tree Algorithms
347
@ingroup algs
348
\brief Algorithms for finding minimum cost spanning trees and arborescences.
349

	
350
This group contains the algorithms for finding minimum cost spanning
351
trees and arborescences \ref clrs01algorithms.
352
*/
353

	
354
/**
301 355
@defgroup max_flow Maximum Flow Algorithms
302 356
@ingroup algs
303 357
\brief Algorithms for finding maximum flows.
304 358

	
305 359
This group contains the algorithms for finding maximum flows and
306
feasible circulations.
360
feasible circulations \ref clrs01algorithms, \ref amo93networkflows.
307 361

	
308 362
The \e maximum \e flow \e problem is to find a flow of maximum value between
309 363
a single source and a single target. Formally, there is a \f$G=(V,A)\f$
310 364
digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
311 365
\f$s, t \in V\f$ source and target nodes.
312 366
A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
313 367
following optimization problem.
314 368

	
315 369
\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
316 370
\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
317 371
    \quad \forall u\in V\setminus\{s,t\} \f]
318 372
\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]
319 373

	
320 374
LEMON contains several algorithms for solving maximum flow problems:
321
- \ref EdmondsKarp Edmonds-Karp algorithm.
322
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.
323
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.
324
- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.
375
- \ref EdmondsKarp Edmonds-Karp algorithm
376
  \ref edmondskarp72theoretical.
377
- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm
378
  \ref goldberg88newapproach.
379
- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees
380
  \ref dinic70algorithm, \ref sleator83dynamic.
381
- \ref GoldbergTarjan !Preflow push-relabel algorithm with dynamic trees
382
  \ref goldberg88newapproach, \ref sleator83dynamic.
325 383

	
326
In most cases the \ref Preflow "Preflow" algorithm provides the
384
In most cases the \ref Preflow algorithm provides the
327 385
fastest method for computing a maximum flow. All implementations
328 386
also provide functions to query the minimum cut, which is the dual
329 387
problem of maximum flow.
330 388

	
331
\ref Circulation is a preflow push-relabel algorithm implemented directly 
389
\ref Circulation is a preflow push-relabel algorithm implemented directly
332 390
for finding feasible circulations, which is a somewhat different problem,
333 391
but it is strongly related to maximum flow.
334 392
For more information, see \ref Circulation.
335 393
*/
336 394

	
337 395
/**
338 396
@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms
339 397
@ingroup algs
340 398

	
341 399
\brief Algorithms for finding minimum cost flows and circulations.
342 400

	
343 401
This group contains the algorithms for finding minimum cost flows and
344
circulations. For more information about this problem and its dual
345
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
402
circulations \ref amo93networkflows. For more information about this
403
problem and its dual solution, see \ref min_cost_flow
404
"Minimum Cost Flow Problem".
346 405

	
347 406
LEMON contains several algorithms for this problem.
348 407
 - \ref NetworkSimplex Primal Network Simplex algorithm with various
349
   pivot strategies.
350
 - \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on
351
   cost scaling.
352
 - \ref CapacityScaling Successive Shortest %Path algorithm with optional
353
   capacity scaling.
354
 - \ref CancelAndTighten The Cancel and Tighten algorithm.
355
 - \ref CycleCanceling Cycle-Canceling algorithms.
408
   pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex.
409
 - \ref CostScaling Cost Scaling algorithm based on push/augment and
410
   relabel operations \ref goldberg90approximation, \ref goldberg97efficient,
411
   \ref bunnagel98efficient.
412
 - \ref CapacityScaling Capacity Scaling algorithm based on the successive
413
   shortest path method \ref edmondskarp72theoretical.
414
 - \ref CycleCanceling Cycle-Canceling algorithms, two of which are
415
   strongly polynomial \ref klein67primal, \ref goldberg89cyclecanceling.
356 416

	
357 417
In general NetworkSimplex is the most efficient implementation,
358 418
but in special cases other algorithms could be faster.
359 419
For example, if the total supply and/or capacities are rather small,
360 420
CapacityScaling is usually the fastest algorithm (without effective scaling).
361 421
*/
362 422

	
363 423
/**
... ...
@@ -370,53 +430,66 @@
370 430

	
371 431
The \e minimum \e cut \e problem is to find a non-empty and non-complete
372 432
\f$X\f$ subset of the nodes with minimum overall capacity on
373 433
outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a
374 434
\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
375 435
cut is the \f$X\f$ solution of the next optimization problem:
376 436

	
377 437
\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
378
    \sum_{uv\in A, u\in X, v\not\in X}cap(uv) \f]
438
    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
379 439

	
380 440
LEMON contains several algorithms related to minimum cut problems:
381 441

	
382 442
- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut
383 443
  in directed graphs.
384 444
- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for
385 445
  calculating minimum cut in undirected graphs.
386 446
- \ref GomoryHu "Gomory-Hu tree computation" for calculating
387 447
  all-pairs minimum cut in undirected graphs.
388 448

	
389 449
If you want to find minimum cut just between two distinict nodes,
390 450
see the \ref max_flow "maximum flow problem".
391 451
*/
392 452

	
393 453
/**
394
@defgroup graph_properties Connectivity and Other Graph Properties
454
@defgroup min_mean_cycle Minimum Mean Cycle Algorithms
395 455
@ingroup algs
396
\brief Algorithms for discovering the graph properties
456
\brief Algorithms for finding minimum mean cycles.
397 457

	
398
This group contains the algorithms for discovering the graph properties
399
like connectivity, bipartiteness, euler property, simplicity etc.
458
This group contains the algorithms for finding minimum mean cycles
459
\ref clrs01algorithms, \ref amo93networkflows.
400 460

	
401
\image html edge_biconnected_components.png
402
\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
403
*/
461
The \e minimum \e mean \e cycle \e problem is to find a directed cycle
462
of minimum mean length (cost) in a digraph.
463
The mean length of a cycle is the average length of its arcs, i.e. the
464
ratio between the total length of the cycle and the number of arcs on it.
404 465

	
405
/**
406
@defgroup planar Planarity Embedding and Drawing
407
@ingroup algs
408
\brief Algorithms for planarity checking, embedding and drawing
466
This problem has an important connection to \e conservative \e length
467
\e functions, too. A length function on the arcs of a digraph is called
468
conservative if and only if there is no directed cycle of negative total
469
length. For an arbitrary length function, the negative of the minimum
470
cycle mean is the smallest \f$\epsilon\f$ value so that increasing the
471
arc lengths uniformly by \f$\epsilon\f$ results in a conservative length
472
function.
409 473

	
410
This group contains the algorithms for planarity checking,
411
embedding and drawing.
474
LEMON contains three algorithms for solving the minimum mean cycle problem:
475
- \ref Karp "Karp"'s original algorithm \ref amo93networkflows,
476
  \ref dasdan98minmeancycle.
477
- \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved
478
  version of Karp's algorithm \ref dasdan98minmeancycle.
479
- \ref Howard "Howard"'s policy iteration algorithm
480
  \ref dasdan98minmeancycle.
412 481

	
413
\image html planar.png
414
\image latex planar.eps "Plane graph" width=\textwidth
482
In practice, the Howard algorithm proved to be by far the most efficient
483
one, though the best known theoretical bound on its running time is
484
exponential.
485
Both Karp and HartmannOrlin algorithms run in time O(ne) and use space
486
O(n<sup>2</sup>+e), but the latter one is typically faster due to the
487
applied early termination scheme.
415 488
*/
416 489

	
417 490
/**
418 491
@defgroup matching Matching Algorithms
419 492
@ingroup algs
420 493
\brief Algorithms for finding matchings in graphs and bipartite graphs.
421 494

	
422 495
This group contains the algorithms for calculating
... ...
@@ -444,65 +517,90 @@
444 517
  matching in bipartite graphs.
445 518
- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating
446 519
  maximum cardinality matching in general graphs.
447 520
- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating
448 521
  maximum weighted matching in general graphs.
449 522
- \ref MaxWeightedPerfectMatching
450 523
  Edmond's blossom shrinking algorithm for calculating maximum weighted
451 524
  perfect matching in general graphs.
525
- \ref MaxFractionalMatching Push-relabel algorithm for calculating
526
  maximum cardinality fractional matching in general graphs.
527
- \ref MaxWeightedFractionalMatching Augmenting path algorithm for calculating
528
  maximum weighted fractional matching in general graphs.
529
- \ref MaxWeightedPerfectFractionalMatching
530
  Augmenting path algorithm for calculating maximum weighted
531
  perfect fractional matching in general graphs.
452 532

	
453
\image html bipartite_matching.png
454
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
533
\image html matching.png
534
\image latex matching.eps "Min Cost Perfect Matching" width=\textwidth
455 535
*/
456 536

	
457 537
/**
458
@defgroup spantree Minimum Spanning Tree Algorithms
538
@defgroup graph_properties Connectivity and Other Graph Properties
459 539
@ingroup algs
460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
540
\brief Algorithms for discovering the graph properties
461 541

	
462
This group contains the algorithms for finding minimum cost spanning
463
trees and arborescences.
542
This group contains the algorithms for discovering the graph properties
543
like connectivity, bipartiteness, euler property, simplicity etc.
544

	
545
\image html connected_components.png
546
\image latex connected_components.eps "Connected components" width=\textwidth
547
*/
548

	
549
/**
550
@defgroup planar Planarity Embedding and Drawing
551
@ingroup algs
552
\brief Algorithms for planarity checking, embedding and drawing
553

	
554
This group contains the algorithms for planarity checking,
555
embedding and drawing.
556

	
557
\image html planar.png
558
\image latex planar.eps "Plane graph" width=\textwidth
559
*/
560

	
561
/**
562
@defgroup approx Approximation Algorithms
563
@ingroup algs
564
\brief Approximation algorithms.
565

	
566
This group contains the approximation and heuristic algorithms
567
implemented in LEMON.
464 568
*/
465 569

	
466 570
/**
467 571
@defgroup auxalg Auxiliary Algorithms
468 572
@ingroup algs
469 573
\brief Auxiliary algorithms implemented in LEMON.
470 574

	
471 575
This group contains some algorithms implemented in LEMON
472 576
in order to make it easier to implement complex algorithms.
473 577
*/
474 578

	
475 579
/**
476
@defgroup approx Approximation Algorithms
477
@ingroup algs
478
\brief Approximation algorithms.
479

	
480
This group contains the approximation and heuristic algorithms
481
implemented in LEMON.
482
*/
483

	
484
/**
485 580
@defgroup gen_opt_group General Optimization Tools
486 581
\brief This group contains some general optimization frameworks
487 582
implemented in LEMON.
488 583

	
489 584
This group contains some general optimization frameworks
490 585
implemented in LEMON.
491 586
*/
492 587

	
493 588
/**
494
@defgroup lp_group Lp and Mip Solvers
589
@defgroup lp_group LP and MIP Solvers
495 590
@ingroup gen_opt_group
496
\brief Lp and Mip solver interfaces for LEMON.
591
\brief LP and MIP solver interfaces for LEMON.
497 592

	
498
This group contains Lp and Mip solver interfaces for LEMON. The
499
various LP solvers could be used in the same manner with this
500
interface.
593
This group contains LP and MIP solver interfaces for LEMON.
594
Various LP solvers could be used in the same manner with this
595
high-level interface.
596

	
597
The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
598
\ref cplex, \ref soplex.
501 599
*/
502 600

	
503 601
/**
504 602
@defgroup lp_utils Tools for Lp and Mip Solvers
505 603
@ingroup lp_group
506 604
\brief Helper tools to the Lp and Mip solvers.
507 605

	
508 606
This group adds some helper tools to general optimization framework
... ...
@@ -582,17 +680,17 @@
582 680
@ingroup io_group
583 681
\brief General \c EPS drawer and graph exporter
584 682

	
585 683
This group contains general \c EPS drawing methods and special
586 684
graph exporting tools.
587 685
*/
588 686

	
589 687
/**
590
@defgroup dimacs_group DIMACS format
688
@defgroup dimacs_group DIMACS Format
591 689
@ingroup io_group
592 690
\brief Read and write files in DIMACS format
593 691

	
594 692
Tools to read a digraph from or write it to a file in DIMACS format data.
595 693
*/
596 694

	
597 695
/**
598 696
@defgroup nauty_group NAUTY Format
... ...
@@ -631,42 +729,42 @@
631 729
- Finally, They can serve as a skeleton of a new implementation of a concept.
632 730
*/
633 731

	
634 732
/**
635 733
@defgroup graph_concepts Graph Structure Concepts
636 734
@ingroup concept
637 735
\brief Skeleton and concept checking classes for graph structures
638 736

	
639
This group contains the skeletons and concept checking classes of LEMON's
640
graph structures and helper classes used to implement these.
737
This group contains the skeletons and concept checking classes of
738
graph structures.
641 739
*/
642 740

	
643 741
/**
644 742
@defgroup map_concepts Map Concepts
645 743
@ingroup concept
646 744
\brief Skeleton and concept checking classes for maps
647 745

	
648 746
This group contains the skeletons and concept checking classes of maps.
649 747
*/
650 748

	
651 749
/**
750
@defgroup tools Standalone Utility Applications
751

	
752
Some utility applications are listed here.
753

	
754
The standard compilation procedure (<tt>./configure;make</tt>) will compile
755
them, as well.
756
*/
757

	
758
/**
652 759
\anchor demoprograms
653 760

	
654 761
@defgroup demos Demo Programs
655 762

	
656 763
Some demo programs are listed here. Their full source codes can be found in
657 764
the \c demo subdirectory of the source tree.
658 765

	
659 766
In order to compile them, use the <tt>make demo</tt> or the
660 767
<tt>make check</tt> commands.
661 768
*/
662 769

	
663
/**
664
@defgroup tools Standalone Utility Applications
665

	
666
Some utility applications are listed here.
667

	
668
The standard compilation procedure (<tt>./configure;make</tt>) will compile
669
them, as well.
670
*/
671

	
672 770
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -16,36 +16,46 @@
16 16
 *
17 17
 */
18 18

	
19 19
/**
20 20
\mainpage @PACKAGE_NAME@ @PACKAGE_VERSION@ Documentation
21 21

	
22 22
\section intro Introduction
23 23

	
24
\subsection whatis What is LEMON
25

	
26
LEMON stands for <b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
27
and <b>O</b>ptimization in <b>N</b>etworks.
28
It is a C++ template
29
library aimed at combinatorial optimization tasks which
30
often involve in working
31
with graphs.
24
<b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling
25
and <b>O</b>ptimization in <b>N</b>etworks</i>.
26
It is a C++ template library providing efficient implementations of common
27
data structures and algorithms with focus on combinatorial optimization
28
tasks connected mainly with graphs and networks.
32 29

	
33 30
<b>
34 31
LEMON is an <a class="el" href="http://opensource.org/">open&nbsp;source</a>
35 32
project.
36 33
You are free to use it in your commercial or
37 34
non-commercial applications under very permissive
38 35
\ref license "license terms".
39 36
</b>
40 37

	
41
\subsection howtoread How to read the documentation
38
The project is maintained by the
39
<a href="http://www.cs.elte.hu/egres/">Egerv&aacute;ry Research Group on
40
Combinatorial Optimization</a> \ref egres
41
at the Operations Research Department of the
42
<a href="http://www.elte.hu/en/">E&ouml;tv&ouml;s Lor&aacute;nd University</a>,
43
Budapest, Hungary.
44
LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a>
45
initiative \ref coinor.
46

	
47
\section howtoread How to Read the Documentation
42 48

	
43 49
If you would like to get to know the library, see
44 50
<a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>.
45 51

	
52
If you are interested in starting to use the library, see the <a class="el"
53
href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation
54
Guide</a>.
55

	
46 56
If you know what you are looking for, then try to find it under the
47 57
<a class="el" href="modules.html">Modules</a> section.
48 58

	
49 59
If you are a user of the old (0.x) series of LEMON, please check out the
50 60
\ref migration "Migration Guide" for the backward incompatibilities.
51 61
*/
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -21,17 +21,17 @@
21 21
/**
22 22
\page min_cost_flow Minimum Cost Flow Problem
23 23

	
24 24
\section mcf_def Definition (GEQ form)
25 25

	
26 26
The \e minimum \e cost \e flow \e problem is to find a feasible flow of
27 27
minimum total cost from a set of supply nodes to a set of demand nodes
28 28
in a network with capacity constraints (lower and upper bounds)
29
and arc costs.
29
and arc costs \ref amo93networkflows.
30 30

	
31 31
Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
32 32
\f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and
33 33
upper bounds for the flow values on the arcs, for which
34 34
\f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$,
35 35
\f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow
36 36
on the arcs and \f$sup: V\rightarrow\mathbf{R}\f$ denotes the
37 37
signed supply values of the nodes.
... ...
@@ -73,20 +73,20 @@
73 73
if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$ node potentials
74 74
the following \e complementary \e slackness optimality conditions hold.
75 75

	
76 76
 - For all \f$uv\in A\f$ arcs:
77 77
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
78 78
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
79 79
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
80 80
 - For all \f$u\in V\f$ nodes:
81
   - \f$\pi(u)<=0\f$;
81
   - \f$\pi(u)\leq 0\f$;
82 82
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
83 83
     then \f$\pi(u)=0\f$.
84
 
84

	
85 85
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
86 86
\f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e.
87 87
\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]
88 88

	
89 89
All algorithms provide dual solution (node potentials), as well,
90 90
if an optimal flow is found.
91 91

	
92 92

	
... ...
@@ -114,17 +114,17 @@
114 114
when there are <em>"less or equal"</em> (LEQ) supply/demand constraints,
115 115
instead of the <em>"greater or equal"</em> (GEQ) constraints.
116 116

	
117 117
\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
118 118
\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq
119 119
    sup(u) \quad \forall u\in V \f]
120 120
\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]
121 121

	
122
It means that the total demand must be less or equal to the 
122
It means that the total demand must be less or equal to the
123 123
total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
124 124
positive) and all the demands have to be satisfied, but there
125 125
could be supplies that are not carried out from the supply
126 126
nodes.
127 127
The equality form is also a special case of this form, of course.
128 128

	
129 129
You could easily transform this case to the \ref mcf_def "GEQ form"
130 130
of the problem by reversing the direction of the arcs and taking the
... ...
@@ -140,14 +140,14 @@
140 140
is optimal if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$
141 141
node potentials the following conditions hold.
142 142

	
143 143
 - For all \f$uv\in A\f$ arcs:
144 144
   - if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;
145 145
   - if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;
146 146
   - if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.
147 147
 - For all \f$u\in V\f$ nodes:
148
   - \f$\pi(u)>=0\f$;
148
   - \f$\pi(u)\geq 0\f$;
149 149
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
150 150
     then \f$\pi(u)=0\f$.
151 151

	
152 152
*/
153 153
}
Ignore white space 6 line context
... ...
@@ -53,64 +53,78 @@
53 53
if HAVE_CBC
54 54
lemon_libemon_la_SOURCES += lemon/cbc.cc
55 55
endif
56 56

	
57 57
lemon_HEADERS += \
58 58
	lemon/adaptors.h \
59 59
	lemon/arg_parser.h \
60 60
	lemon/assert.h \
61
	lemon/bellman_ford.h \
61 62
	lemon/bfs.h \
62 63
	lemon/bin_heap.h \
64
	lemon/binomial_heap.h \
63 65
	lemon/bucket_heap.h \
66
	lemon/capacity_scaling.h \
64 67
	lemon/cbc.h \
65 68
	lemon/circulation.h \
66 69
	lemon/clp.h \
67 70
	lemon/color.h \
68 71
	lemon/concept_check.h \
69 72
	lemon/connectivity.h \
73
	lemon/core.h \
74
	lemon/cost_scaling.h \
70 75
	lemon/counter.h \
71
	lemon/core.h \
72 76
	lemon/cplex.h \
77
	lemon/cycle_canceling.h \
73 78
	lemon/dfs.h \
79
	lemon/dheap.h \
74 80
	lemon/dijkstra.h \
75 81
	lemon/dim2.h \
76 82
	lemon/dimacs.h \
77 83
	lemon/edge_set.h \
78 84
	lemon/elevator.h \
79 85
	lemon/error.h \
80 86
	lemon/euler.h \
81 87
	lemon/fib_heap.h \
88
	lemon/fractional_matching.h \
82 89
	lemon/full_graph.h \
83 90
	lemon/glpk.h \
84 91
	lemon/gomory_hu.h \
85 92
	lemon/graph_to_eps.h \
86 93
	lemon/grid_graph.h \
94
	lemon/hartmann_orlin_mmc.h \
95
	lemon/howard_mmc.h \
87 96
	lemon/hypercube_graph.h \
97
	lemon/karp_mmc.h \
88 98
	lemon/kruskal.h \
89 99
	lemon/hao_orlin.h \
90 100
	lemon/lgf_reader.h \
91 101
	lemon/lgf_writer.h \
92 102
	lemon/list_graph.h \
93 103
	lemon/lp.h \
94 104
	lemon/lp_base.h \
95 105
	lemon/lp_skeleton.h \
96 106
	lemon/maps.h \
97 107
	lemon/matching.h \
98 108
	lemon/math.h \
99 109
	lemon/min_cost_arborescence.h \
100 110
	lemon/nauty_reader.h \
101 111
	lemon/network_simplex.h \
112
	lemon/pairing_heap.h \
102 113
	lemon/path.h \
114
	lemon/planarity.h \
103 115
	lemon/preflow.h \
116
	lemon/quad_heap.h \
104 117
	lemon/radix_heap.h \
105 118
	lemon/radix_sort.h \
106 119
	lemon/random.h \
107 120
	lemon/smart_graph.h \
108 121
	lemon/soplex.h \
122
	lemon/static_graph.h \
109 123
	lemon/suurballe.h \
110 124
	lemon/time_measure.h \
111 125
	lemon/tolerance.h \
112 126
	lemon/unionfind.h \
113 127
	lemon/bits/windows.h
114 128

	
115 129
bits_HEADERS += \
116 130
	lemon/bits/alteration_notifier.h \
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -355,16 +355,19 @@
355 355
  ///
356 356
  /// ReverseDigraph can be used for reversing the arcs in a digraph.
357 357
  /// It conforms to the \ref concepts::Digraph "Digraph" concept.
358 358
  ///
359 359
  /// The adapted digraph can also be modified through this adaptor
360 360
  /// by adding or removing nodes or arcs, unless the \c GR template
361 361
  /// parameter is set to be \c const.
362 362
  ///
363
  /// This class provides item counting in the same time as the adapted
364
  /// digraph structure.
365
  ///
363 366
  /// \tparam DGR The type of the adapted digraph.
364 367
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
365 368
  /// It can also be specified to be \c const.
366 369
  ///
367 370
  /// \note The \c Node and \c Arc types of this adaptor and the adapted
368 371
  /// digraph are convertible to each other.
369 372
  template<typename DGR>
370 373
#ifdef DOXYGEN
... ...
@@ -413,17 +416,17 @@
413 416
    NF* _node_filter;
414 417
    AF* _arc_filter;
415 418
    SubDigraphBase()
416 419
      : Parent(), _node_filter(0), _arc_filter(0) { }
417 420

	
418 421
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
419 422
      Parent::initialize(digraph);
420 423
      _node_filter = &node_filter;
421
      _arc_filter = &arc_filter;      
424
      _arc_filter = &arc_filter;
422 425
    }
423 426

	
424 427
  public:
425 428

	
426 429
    typedef typename Parent::Node Node;
427 430
    typedef typename Parent::Arc Arc;
428 431

	
429 432
    void first(Node& i) const {
... ...
@@ -500,21 +503,21 @@
500 503
        arc = Parent::findArc(source, target, arc);
501 504
      }
502 505
      return arc;
503 506
    }
504 507

	
505 508
  public:
506 509

	
507 510
    template <typename V>
508
    class NodeMap 
509
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 
510
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511
    class NodeMap
512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
513
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511 514
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
512
	LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
515
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
513 516

	
514 517
    public:
515 518
      typedef V Value;
516 519

	
517 520
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
518 521
        : Parent(adaptor) {}
519 522
      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
520 523
        : Parent(adaptor, value) {}
... ...
@@ -527,19 +530,19 @@
527 530
      template <typename CMap>
528 531
      NodeMap& operator=(const CMap& cmap) {
529 532
        Parent::operator=(cmap);
530 533
        return *this;
531 534
      }
532 535
    };
533 536

	
534 537
    template <typename V>
535
    class ArcMap 
538
    class ArcMap
536 539
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
537
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
540
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
538 541
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
539 542
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
540 543

	
541 544
    public:
542 545
      typedef V Value;
543 546

	
544 547
      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
545 548
        : Parent(adaptor) {}
... ...
@@ -574,17 +577,17 @@
574 577
    NF* _node_filter;
575 578
    AF* _arc_filter;
576 579
    SubDigraphBase()
577 580
      : Parent(), _node_filter(0), _arc_filter(0) { }
578 581

	
579 582
    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
580 583
      Parent::initialize(digraph);
581 584
      _node_filter = &node_filter;
582
      _arc_filter = &arc_filter;      
585
      _arc_filter = &arc_filter;
583 586
    }
584 587

	
585 588
  public:
586 589

	
587 590
    typedef typename Parent::Node Node;
588 591
    typedef typename Parent::Arc Arc;
589 592

	
590 593
    void first(Node& i) const {
... ...
@@ -643,20 +646,20 @@
643 646
      Arc arc = Parent::findArc(source, target, prev);
644 647
      while (arc != INVALID && !(*_arc_filter)[arc]) {
645 648
        arc = Parent::findArc(source, target, arc);
646 649
      }
647 650
      return arc;
648 651
    }
649 652

	
650 653
    template <typename V>
651
    class NodeMap 
654
    class NodeMap
652 655
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
653 656
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
654
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
655 658
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
656 659

	
657 660
    public:
658 661
      typedef V Value;
659 662

	
660 663
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
661 664
        : Parent(adaptor) {}
662 665
      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
... ...
@@ -670,17 +673,17 @@
670 673
      template <typename CMap>
671 674
      NodeMap& operator=(const CMap& cmap) {
672 675
        Parent::operator=(cmap);
673 676
        return *this;
674 677
      }
675 678
    };
676 679

	
677 680
    template <typename V>
678
    class ArcMap 
681
    class ArcMap
679 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
680 683
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
681 684
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
682 685
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
683 686

	
684 687
    public:
685 688
      typedef V Value;
686 689

	
... ...
@@ -714,16 +717,18 @@
714 717
  /// shown in the subdigraph. The arcs that are incident to hidden
715 718
  /// nodes are also filtered out.
716 719
  /// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.
717 720
  ///
718 721
  /// The adapted digraph can also be modified through this adaptor
719 722
  /// by adding or removing nodes or arcs, unless the \c GR template
720 723
  /// parameter is set to be \c const.
721 724
  ///
725
  /// This class provides only linear time counting for nodes and arcs.
726
  ///
722 727
  /// \tparam DGR The type of the adapted digraph.
723 728
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
724 729
  /// It can also be specified to be \c const.
725 730
  /// \tparam NF The type of the node filter map.
726 731
  /// It must be a \c bool (or convertible) node map of the
727 732
  /// adapted digraph. The default type is
728 733
  /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
729 734
  /// \tparam AF The type of the arc filter map.
... ...
@@ -1011,20 +1016,20 @@
1011 1016
      Edge edge = Parent::findEdge(u, v, prev);
1012 1017
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1013 1018
        edge = Parent::findEdge(u, v, edge);
1014 1019
      }
1015 1020
      return edge;
1016 1021
    }
1017 1022

	
1018 1023
    template <typename V>
1019
    class NodeMap 
1024
    class NodeMap
1020 1025
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1021 1026
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1022
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1023 1028
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1024 1029

	
1025 1030
    public:
1026 1031
      typedef V Value;
1027 1032

	
1028 1033
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1029 1034
        : Parent(adaptor) {}
1030 1035
      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
... ...
@@ -1038,20 +1043,20 @@
1038 1043
      template <typename CMap>
1039 1044
      NodeMap& operator=(const CMap& cmap) {
1040 1045
        Parent::operator=(cmap);
1041 1046
        return *this;
1042 1047
      }
1043 1048
    };
1044 1049

	
1045 1050
    template <typename V>
1046
    class ArcMap 
1051
    class ArcMap
1047 1052
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1048 1053
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1049
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1050 1055
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1051 1056

	
1052 1057
    public:
1053 1058
      typedef V Value;
1054 1059

	
1055 1060
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1056 1061
        : Parent(adaptor) {}
1057 1062
      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
... ...
@@ -1065,20 +1070,20 @@
1065 1070
      template <typename CMap>
1066 1071
      ArcMap& operator=(const CMap& cmap) {
1067 1072
        Parent::operator=(cmap);
1068 1073
        return *this;
1069 1074
      }
1070 1075
    };
1071 1076

	
1072 1077
    template <typename V>
1073
    class EdgeMap 
1078
    class EdgeMap
1074 1079
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1075 1080
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1076
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1077 1082
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1078 1083

	
1079 1084
    public:
1080 1085
      typedef V Value;
1081 1086

	
1082 1087
      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1083 1088
        : Parent(adaptor) {}
1084 1089

	
... ...
@@ -1107,18 +1112,18 @@
1107 1112
    typedef GR Graph;
1108 1113
    typedef NF NodeFilterMap;
1109 1114
    typedef EF EdgeFilterMap;
1110 1115

	
1111 1116
    typedef SubGraphBase Adaptor;
1112 1117
  protected:
1113 1118
    NF* _node_filter;
1114 1119
    EF* _edge_filter;
1115
    SubGraphBase() 
1116
	  : Parent(), _node_filter(0), _edge_filter(0) { }
1120
    SubGraphBase()
1121
          : Parent(), _node_filter(0), _edge_filter(0) { }
1117 1122

	
1118 1123
    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1119 1124
      Parent::initialize(graph);
1120 1125
      _node_filter = &node_filter;
1121 1126
      _edge_filter = &edge_filter;
1122 1127
    }
1123 1128

	
1124 1129
  public:
... ...
@@ -1209,20 +1214,20 @@
1209 1214
      Edge edge = Parent::findEdge(u, v, prev);
1210 1215
      while (edge != INVALID && !(*_edge_filter)[edge]) {
1211 1216
        edge = Parent::findEdge(u, v, edge);
1212 1217
      }
1213 1218
      return edge;
1214 1219
    }
1215 1220

	
1216 1221
    template <typename V>
1217
    class NodeMap 
1222
    class NodeMap
1218 1223
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1219 1224
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1220
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1221 1226
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1222 1227

	
1223 1228
    public:
1224 1229
      typedef V Value;
1225 1230

	
1226 1231
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1227 1232
        : Parent(adaptor) {}
1228 1233
      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
... ...
@@ -1236,20 +1241,20 @@
1236 1241
      template <typename CMap>
1237 1242
      NodeMap& operator=(const CMap& cmap) {
1238 1243
        Parent::operator=(cmap);
1239 1244
        return *this;
1240 1245
      }
1241 1246
    };
1242 1247

	
1243 1248
    template <typename V>
1244
    class ArcMap 
1249
    class ArcMap
1245 1250
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1246 1251
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1247
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1248 1253
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1249 1254

	
1250 1255
    public:
1251 1256
      typedef V Value;
1252 1257

	
1253 1258
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1254 1259
        : Parent(adaptor) {}
1255 1260
      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
... ...
@@ -1263,21 +1268,21 @@
1263 1268
      template <typename CMap>
1264 1269
      ArcMap& operator=(const CMap& cmap) {
1265 1270
        Parent::operator=(cmap);
1266 1271
        return *this;
1267 1272
      }
1268 1273
    };
1269 1274

	
1270 1275
    template <typename V>
1271
    class EdgeMap 
1276
    class EdgeMap
1272 1277
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1273 1278
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1274
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1275
	LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1280
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1276 1281

	
1277 1282
    public:
1278 1283
      typedef V Value;
1279 1284

	
1280 1285
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1281 1286
        : Parent(adaptor) {}
1282 1287

	
1283 1288
      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
... ...
@@ -1309,16 +1314,18 @@
1309 1314
  /// shown in the subgraph. The edges that are incident to hidden
1310 1315
  /// nodes are also filtered out.
1311 1316
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
1312 1317
  ///
1313 1318
  /// The adapted graph can also be modified through this adaptor
1314 1319
  /// by adding or removing nodes or edges, unless the \c GR template
1315 1320
  /// parameter is set to be \c const.
1316 1321
  ///
1322
  /// This class provides only linear time counting for nodes, edges and arcs.
1323
  ///
1317 1324
  /// \tparam GR The type of the adapted graph.
1318 1325
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1319 1326
  /// It can also be specified to be \c const.
1320 1327
  /// \tparam NF The type of the node filter map.
1321 1328
  /// It must be a \c bool (or convertible) node map of the
1322 1329
  /// adapted graph. The default type is
1323 1330
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
1324 1331
  /// \tparam EF The type of the edge filter map.
... ...
@@ -1466,16 +1473,18 @@
1466 1473
  /// in the subgraph. This adaptor conforms to the \ref concepts::Digraph
1467 1474
  /// "Digraph" concept or the \ref concepts::Graph "Graph" concept
1468 1475
  /// depending on the \c GR template parameter.
1469 1476
  ///
1470 1477
  /// The adapted (di)graph can also be modified through this adaptor
1471 1478
  /// by adding or removing nodes or arcs/edges, unless the \c GR template
1472 1479
  /// parameter is set to be \c const.
1473 1480
  ///
1481
  /// This class provides only linear time item counting.
1482
  ///
1474 1483
  /// \tparam GR The type of the adapted digraph or graph.
1475 1484
  /// It must conform to the \ref concepts::Digraph "Digraph" concept
1476 1485
  /// or the \ref concepts::Graph "Graph" concept.
1477 1486
  /// It can also be specified to be \c const.
1478 1487
  /// \tparam NF The type of the node filter map.
1479 1488
  /// It must be a \c bool (or convertible) node map of the
1480 1489
  /// adapted (di)graph. The default type is
1481 1490
  /// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".
... ...
@@ -1490,17 +1499,17 @@
1490 1499
           typename NF = typename GR::template NodeMap<bool>,
1491 1500
           typename Enable = void>
1492 1501
  class FilterNodes :
1493 1502
    public DigraphAdaptorExtender<
1494 1503
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1495 1504
                     true> > {
1496 1505
#endif
1497 1506
    typedef DigraphAdaptorExtender<
1498
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1499 1508
                     true> > Parent;
1500 1509

	
1501 1510
  public:
1502 1511

	
1503 1512
    typedef GR Digraph;
1504 1513
    typedef NF NodeFilterMap;
1505 1514

	
1506 1515
    typedef typename Parent::Node Node;
... ...
@@ -1511,17 +1520,17 @@
1511 1520
    FilterNodes() : const_true_map() {}
1512 1521

	
1513 1522
  public:
1514 1523

	
1515 1524
    /// \brief Constructor
1516 1525
    ///
1517 1526
    /// Creates a subgraph for the given digraph or graph with the
1518 1527
    /// given node filter map.
1519
    FilterNodes(GR& graph, NF& node_filter) 
1528
    FilterNodes(GR& graph, NF& node_filter)
1520 1529
      : Parent(), const_true_map()
1521 1530
    {
1522 1531
      Parent::initialize(graph, node_filter, const_true_map);
1523 1532
    }
1524 1533

	
1525 1534
    /// \brief Sets the status of the given node
1526 1535
    ///
1527 1536
    /// This function sets the status of the given node.
... ...
@@ -1549,21 +1558,21 @@
1549 1558
    void enable(const Node& n) const { Parent::status(n, true); }
1550 1559

	
1551 1560
  };
1552 1561

	
1553 1562
  template<typename GR, typename NF>
1554 1563
  class FilterNodes<GR, NF,
1555 1564
                    typename enable_if<UndirectedTagIndicator<GR> >::type> :
1556 1565
    public GraphAdaptorExtender<
1557
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1558 1567
                   true> > {
1559 1568

	
1560 1569
    typedef GraphAdaptorExtender<
1561
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1562 1571
                   true> > Parent;
1563 1572

	
1564 1573
  public:
1565 1574

	
1566 1575
    typedef GR Graph;
1567 1576
    typedef NF NodeFilterMap;
1568 1577

	
1569 1578
    typedef typename Parent::Node Node;
... ...
@@ -1614,16 +1623,18 @@
1614 1623
  /// the arcs. Only the arcs with \c true filter value are shown in the
1615 1624
  /// subdigraph. This adaptor conforms to the \ref concepts::Digraph
1616 1625
  /// "Digraph" concept.
1617 1626
  ///
1618 1627
  /// The adapted digraph can also be modified through this adaptor
1619 1628
  /// by adding or removing nodes or arcs, unless the \c GR template
1620 1629
  /// parameter is set to be \c const.
1621 1630
  ///
1631
  /// This class provides only linear time counting for nodes and arcs.
1632
  ///
1622 1633
  /// \tparam DGR The type of the adapted digraph.
1623 1634
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1624 1635
  /// It can also be specified to be \c const.
1625 1636
  /// \tparam AF The type of the arc filter map.
1626 1637
  /// It must be a \c bool (or convertible) arc map of the
1627 1638
  /// adapted digraph. The default type is
1628 1639
  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1629 1640
  ///
... ...
@@ -1637,17 +1648,17 @@
1637 1648
  template<typename DGR,
1638 1649
           typename AF = typename DGR::template ArcMap<bool> >
1639 1650
  class FilterArcs :
1640 1651
    public DigraphAdaptorExtender<
1641 1652
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1642 1653
                     AF, false> > {
1643 1654
#endif
1644 1655
    typedef DigraphAdaptorExtender<
1645
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1646 1657
                     AF, false> > Parent;
1647 1658

	
1648 1659
  public:
1649 1660

	
1650 1661
    /// The type of the adapted digraph.
1651 1662
    typedef DGR Digraph;
1652 1663
    /// The type of the arc filter map.
1653 1664
    typedef AF ArcFilterMap;
... ...
@@ -1724,16 +1735,18 @@
1724 1735
  /// the edges. Only the edges with \c true filter value are shown in the
1725 1736
  /// subgraph. This adaptor conforms to the \ref concepts::Graph
1726 1737
  /// "Graph" concept.
1727 1738
  ///
1728 1739
  /// The adapted graph can also be modified through this adaptor
1729 1740
  /// by adding or removing nodes or edges, unless the \c GR template
1730 1741
  /// parameter is set to be \c const.
1731 1742
  ///
1743
  /// This class provides only linear time counting for nodes, edges and arcs.
1744
  ///
1732 1745
  /// \tparam GR The type of the adapted graph.
1733 1746
  /// It must conform to the \ref concepts::Graph "Graph" concept.
1734 1747
  /// It can also be specified to be \c const.
1735 1748
  /// \tparam EF The type of the edge filter map.
1736 1749
  /// It must be a \c bool (or convertible) edge map of the
1737 1750
  /// adapted graph. The default type is
1738 1751
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
1739 1752
  ///
... ...
@@ -1743,21 +1756,21 @@
1743 1756
  template<typename GR,
1744 1757
           typename EF>
1745 1758
  class FilterEdges {
1746 1759
#else
1747 1760
  template<typename GR,
1748 1761
           typename EF = typename GR::template EdgeMap<bool> >
1749 1762
  class FilterEdges :
1750 1763
    public GraphAdaptorExtender<
1751
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1752 1765
                   EF, false> > {
1753 1766
#endif
1754 1767
    typedef GraphAdaptorExtender<
1755
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1756 1769
                   EF, false> > Parent;
1757 1770

	
1758 1771
  public:
1759 1772

	
1760 1773
    /// The type of the adapted graph.
1761 1774
    typedef GR Graph;
1762 1775
    /// The type of the edge filter map.
1763 1776
    typedef EF EdgeFilterMap;
... ...
@@ -1772,17 +1785,17 @@
1772 1785
    }
1773 1786

	
1774 1787
  public:
1775 1788

	
1776 1789
    /// \brief Constructor
1777 1790
    ///
1778 1791
    /// Creates a subgraph for the given graph with the given edge
1779 1792
    /// filter map.
1780
    FilterEdges(GR& graph, EF& edge_filter) 
1793
    FilterEdges(GR& graph, EF& edge_filter)
1781 1794
      : Parent(), const_true_map() {
1782 1795
      Parent::initialize(graph, const_true_map, edge_filter);
1783 1796
    }
1784 1797

	
1785 1798
    /// \brief Sets the status of the given edge
1786 1799
    ///
1787 1800
    /// This function sets the status of the given edge.
1788 1801
    /// It is done by simply setting the assigned value of \c e
... ...
@@ -1840,17 +1853,17 @@
1840 1853
    typedef typename Digraph::Node Node;
1841 1854

	
1842 1855
    class Arc {
1843 1856
      friend class UndirectorBase;
1844 1857
    protected:
1845 1858
      Edge _edge;
1846 1859
      bool _forward;
1847 1860

	
1848
      Arc(const Edge& edge, bool forward) 
1861
      Arc(const Edge& edge, bool forward)
1849 1862
        : _edge(edge), _forward(forward) {}
1850 1863

	
1851 1864
    public:
1852 1865
      Arc() {}
1853 1866

	
1854 1867
      Arc(Invalid) : _edge(INVALID), _forward(true) {}
1855 1868

	
1856 1869
      operator const Edge&() const { return _edge; }
... ...
@@ -2080,17 +2093,17 @@
2080 2093
      typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
2081 2094
      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
2082 2095
      typedef typename MapTraits<MapImpl>::ReturnValue Reference;
2083 2096

	
2084 2097
      ArcMapBase(const UndirectorBase<DGR>& adaptor) :
2085 2098
        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
2086 2099

	
2087 2100
      ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
2088
        : _forward(*adaptor._digraph, value), 
2101
        : _forward(*adaptor._digraph, value),
2089 2102
          _backward(*adaptor._digraph, value) {}
2090 2103

	
2091 2104
      void set(const Arc& a, const V& value) {
2092 2105
        if (direction(a)) {
2093 2106
          _forward.set(a, value);
2094 2107
        } else {
2095 2108
          _backward.set(a, value);
2096 2109
        }
... ...
@@ -2198,17 +2211,17 @@
2198 2211

	
2199 2212
    };
2200 2213

	
2201 2214
    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
2202 2215
    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
2203 2216

	
2204 2217
    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
2205 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2206
    
2219

	
2207 2220
    typedef EdgeNotifier ArcNotifier;
2208 2221
    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
2209 2222

	
2210 2223
  protected:
2211 2224

	
2212 2225
    UndirectorBase() : _digraph(0) {}
2213 2226

	
2214 2227
    DGR* _digraph;
... ...
@@ -2227,16 +2240,19 @@
2227 2240
  /// graph. All arcs of the underlying digraph are showed in the
2228 2241
  /// adaptor as an edge (and also as a pair of arcs, of course).
2229 2242
  /// This adaptor conforms to the \ref concepts::Graph "Graph" concept.
2230 2243
  ///
2231 2244
  /// The adapted digraph can also be modified through this adaptor
2232 2245
  /// by adding or removing nodes or edges, unless the \c GR template
2233 2246
  /// parameter is set to be \c const.
2234 2247
  ///
2248
  /// This class provides item counting in the same time as the adapted
2249
  /// digraph structure.
2250
  ///
2235 2251
  /// \tparam DGR The type of the adapted digraph.
2236 2252
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2237 2253
  /// It can also be specified to be \c const.
2238 2254
  ///
2239 2255
  /// \note The \c Node type of this adaptor and the adapted digraph are
2240 2256
  /// convertible to each other, moreover the \c Edge type of the adaptor
2241 2257
  /// and the \c Arc type of the adapted digraph are also convertible to
2242 2258
  /// each other.
... ...
@@ -2530,16 +2546,19 @@
2530 2546
  /// The arcs can be easily reversed by the \c reverseArc() member function
2531 2547
  /// of the adaptor.
2532 2548
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2533 2549
  ///
2534 2550
  /// The adapted graph can also be modified through this adaptor
2535 2551
  /// by adding or removing nodes or arcs, unless the \c GR template
2536 2552
  /// parameter is set to be \c const.
2537 2553
  ///
2554
  /// This class provides item counting in the same time as the adapted
2555
  /// graph structure.
2556
  ///
2538 2557
  /// \tparam GR The type of the adapted graph.
2539 2558
  /// It must conform to the \ref concepts::Graph "Graph" concept.
2540 2559
  /// It can also be specified to be \c const.
2541 2560
  /// \tparam DM The type of the direction map.
2542 2561
  /// It must be a \c bool (or convertible) edge map of the
2543 2562
  /// adapted graph. The default type is
2544 2563
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".
2545 2564
  ///
... ...
@@ -2673,16 +2692,18 @@
2673 2692
  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
2674 2693
  /// called residual digraph.
2675 2694
  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
2676 2695
  /// multiplicities are counted, i.e. the adaptor has exactly
2677 2696
  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
2678 2697
  /// arcs).
2679 2698
  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
2680 2699
  ///
2700
  /// This class provides only linear time counting for nodes and arcs.
2701
  ///
2681 2702
  /// \tparam DGR The type of the adapted digraph.
2682 2703
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
2683 2704
  /// It is implicitly \c const.
2684 2705
  /// \tparam CM The type of the capacity map.
2685 2706
  /// It must be an arc map of some numerical type, which defines
2686 2707
  /// the capacities in the flow problem. It is implicitly \c const.
2687 2708
  /// The default type is
2688 2709
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
... ...
@@ -2702,17 +2723,17 @@
2702 2723
#ifdef DOXYGEN
2703 2724
  template<typename DGR, typename CM, typename FM, typename TL>
2704 2725
  class ResidualDigraph
2705 2726
#else
2706 2727
  template<typename DGR,
2707 2728
           typename CM = typename DGR::template ArcMap<int>,
2708 2729
           typename FM = CM,
2709 2730
           typename TL = Tolerance<typename CM::Value> >
2710
  class ResidualDigraph 
2731
  class ResidualDigraph
2711 2732
    : public SubDigraph<
2712 2733
        Undirector<const DGR>,
2713 2734
        ConstMap<typename DGR::Node, Const<bool, true> >,
2714 2735
        typename Undirector<const DGR>::template CombinedArcMap<
2715 2736
          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
2716 2737
          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
2717 2738
#endif
2718 2739
  {
... ...
@@ -2759,17 +2780,17 @@
2759 2780
  public:
2760 2781

	
2761 2782
    /// \brief Constructor
2762 2783
    ///
2763 2784
    /// Constructor of the residual digraph adaptor. The parameters are the
2764 2785
    /// digraph, the capacity map, the flow map, and a tolerance object.
2765 2786
    ResidualDigraph(const DGR& digraph, const CM& capacity,
2766 2787
                    FM& flow, const TL& tolerance = Tolerance())
2767
      : Parent(), _capacity(&capacity), _flow(&flow), 
2788
      : Parent(), _capacity(&capacity), _flow(&flow),
2768 2789
        _graph(digraph), _node_filter(),
2769 2790
        _forward_filter(capacity, flow, tolerance),
2770 2791
        _backward_filter(capacity, flow, tolerance),
2771 2792
        _arc_filter(_forward_filter, _backward_filter)
2772 2793
    {
2773 2794
      Parent::initialize(_graph, _node_filter, _arc_filter);
2774 2795
    }
2775 2796

	
... ...
@@ -2841,17 +2862,17 @@
2841 2862
      const Adaptor* _adaptor;
2842 2863
    public:
2843 2864
      /// The key type of the map
2844 2865
      typedef Arc Key;
2845 2866
      /// The value type of the map
2846 2867
      typedef typename CapacityMap::Value Value;
2847 2868

	
2848 2869
      /// Constructor
2849
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 
2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
2850 2871
        : _adaptor(&adaptor) {}
2851 2872

	
2852 2873
      /// Returns the value associated with the given residual arc
2853 2874
      Value operator[](const Arc& a) const {
2854 2875
        return _adaptor->residualCapacity(a);
2855 2876
      }
2856 2877

	
2857 2878
    };
... ...
@@ -3320,16 +3341,19 @@
3320 3341
  ///
3321 3342
  /// The aim of this class is running an algorithm with respect to node
3322 3343
  /// costs or capacities if the algorithm considers only arc costs or
3323 3344
  /// capacities directly.
3324 3345
  /// In this case you can use \c SplitNodes adaptor, and set the node
3325 3346
  /// costs/capacities of the original digraph to the \e bind \e arcs
3326 3347
  /// in the adaptor.
3327 3348
  ///
3349
  /// This class provides item counting in the same time as the adapted
3350
  /// digraph structure.
3351
  ///
3328 3352
  /// \tparam DGR The type of the adapted digraph.
3329 3353
  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
3330 3354
  /// It is implicitly \c const.
3331 3355
  ///
3332 3356
  /// \note The \c Node type of this adaptor is converible to the \c Node
3333 3357
  /// type of the adapted digraph.
3334 3358
  template <typename DGR>
3335 3359
#ifdef DOXYGEN
... ...
@@ -3418,17 +3442,17 @@
3418 3442
      return Parent::arc(a);
3419 3443
    }
3420 3444

	
3421 3445
    /// \brief Node map combined from two original node maps
3422 3446
    ///
3423 3447
    /// This map adaptor class adapts two node maps of the original digraph
3424 3448
    /// to get a node map of the split digraph.
3425 3449
    /// Its value type is inherited from the first node map type (\c IN).
3426
    /// \tparam IN The type of the node map for the in-nodes. 
3450
    /// \tparam IN The type of the node map for the in-nodes.
3427 3451
    /// \tparam OUT The type of the node map for the out-nodes.
3428 3452
    template <typename IN, typename OUT>
3429 3453
    class CombinedNodeMap {
3430 3454
    public:
3431 3455

	
3432 3456
      /// The key type of the map
3433 3457
      typedef Node Key;
3434 3458
      /// The value type of the map
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -15,24 +15,33 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/arg_parser.h>
20 20

	
21 21
namespace lemon {
22 22

	
23
  void ArgParser::_terminate(ArgParserException::Reason reason) const
24
  {
25
    if(_exit_on_problems)
26
      exit(1);
27
    else throw(ArgParserException(reason));
28
  }
29

	
30

	
23 31
  void ArgParser::_showHelp(void *p)
24 32
  {
25 33
    (static_cast<ArgParser*>(p))->showHelp();
26
    exit(1);
34
    (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP);
27 35
  }
28 36

	
29 37
  ArgParser::ArgParser(int argc, const char * const *argv)
30
    :_argc(argc), _argv(argv), _command_name(argv[0]) {
38
    :_argc(argc), _argv(argv), _command_name(argv[0]),
39
    _exit_on_problems(true) {
31 40
    funcOption("-help","Print a short help message",_showHelp,this);
32 41
    synonym("help","-help");
33 42
    synonym("h","-help");
34 43
  }
35 44

	
36 45
  ArgParser::~ArgParser()
37 46
  {
38 47
    for(Opts::iterator i=_opts.begin();i!=_opts.end();++i)
... ...
@@ -337,26 +346,26 @@
337 346

	
338 347
  void ArgParser::showHelp() const
339 348
  {
340 349
    shortHelp();
341 350
    std::cerr << "Where:\n";
342 351
    for(std::vector<OtherArg>::const_iterator i=_others_help.begin();
343 352
        i!=_others_help.end();++i) showHelp(i);
344 353
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
345
    exit(1);
354
    _terminate(ArgParserException::HELP);
346 355
  }
347 356

	
348 357

	
349 358
  void ArgParser::unknownOpt(std::string arg) const
350 359
  {
351 360
    std::cerr << "\nUnknown option: " << arg << "\n";
352 361
    std::cerr << "\nType '" << _command_name <<
353 362
      " --help' to obtain a short summary on the usage.\n\n";
354
    exit(1);
363
    _terminate(ArgParserException::UNKNOWN_OPT);
355 364
  }
356 365

	
357 366
  void ArgParser::requiresValue(std::string arg, OptType t) const
358 367
  {
359 368
    std::cerr << "Argument '" << arg << "' requires a";
360 369
    switch(t) {
361 370
    case STRING:
362 371
      std::cerr << " string";
... ...
@@ -409,17 +418,17 @@
409 418
            for(GroupData::Opts::const_iterator o=i->second.opts.begin();
410 419
                o!=i->second.opts.end();++o)
411 420
              showHelp(_opts.find(*o));
412 421
          }
413 422
        }
414 423
    if(!ok) {
415 424
      std::cerr << "\nType '" << _command_name <<
416 425
        " --help' to obtain a short summary on the usage.\n\n";
417
      exit(1);
426
      _terminate(ArgParserException::INVALID_OPT);
418 427
    }
419 428
  }
420 429

	
421 430
  ArgParser &ArgParser::parse()
422 431
  {
423 432
    for(int ar=1; ar<_argc; ++ar) {
424 433
      std::string arg(_argv[ar]);
425 434
      if (arg[0] != '-' || arg.size() == 1) {
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -29,16 +29,54 @@
29 29
#include <lemon/assert.h>
30 30

	
31 31
///\ingroup misc
32 32
///\file
33 33
///\brief A tool to parse command line arguments.
34 34

	
35 35
namespace lemon {
36 36

	
37
  ///Exception used by ArgParser
38
  class ArgParserException : public Exception {
39
  public:
40
    enum Reason {
41
      HELP,         /// <tt>--help</tt> option was given
42
      UNKNOWN_OPT,  /// Unknown option was given
43
      INVALID_OPT   /// Invalid combination of options
44
    };
45

	
46
  private:
47
    Reason _reason;
48

	
49
  public:
50
    ///Constructor
51
    ArgParserException(Reason r) throw() : _reason(r) {}
52
    ///Virtual destructor
53
    virtual ~ArgParserException() throw() {}
54
    ///A short description of the exception
55
    virtual const char* what() const throw() {
56
      switch(_reason)
57
        {
58
        case HELP:
59
          return "lemon::ArgParseException: ask for help";
60
          break;
61
        case UNKNOWN_OPT:
62
          return "lemon::ArgParseException: unknown option";
63
          break;
64
        case INVALID_OPT:
65
          return "lemon::ArgParseException: invalid combination of options";
66
          break;
67
        }
68
      return "";
69
    }
70
    ///Return the reason for the failure
71
    Reason reason() const {return _reason; }
72
  };
73

	
74

	
37 75
  ///Command line arguments parser
38 76

	
39 77
  ///\ingroup misc
40 78
  ///Command line arguments parser.
41 79
  ///
42 80
  ///For a complete example see the \ref arg_parser_demo.cc demo file.
43 81
  class ArgParser {
44 82

	
... ...
@@ -111,16 +149,20 @@
111 149
    //\param help A help string.
112 150
    //\retval func The function to be called when the option is given. It
113 151
    //  must be of type "void f(void *)"
114 152
    //\param data Data to be passed to \c func
115 153
    ArgParser &funcOption(const std::string &name,
116 154
                    const std::string &help,
117 155
                    void (*func)(void *),void *data);
118 156

	
157
    bool _exit_on_problems;
158

	
159
    void _terminate(ArgParserException::Reason reason) const;
160

	
119 161
  public:
120 162

	
121 163
    ///Constructor
122 164
    ArgParser(int argc, const char * const *argv);
123 165

	
124 166
    ~ArgParser();
125 167

	
126 168
    ///\name Options
... ...
@@ -375,12 +417,17 @@
375 417
    }
376 418

	
377 419
    ///Give back the non-option type arguments.
378 420

	
379 421
    ///Give back a reference to a vector consisting of the program arguments
380 422
    ///not starting with a '-' character.
381 423
    const std::vector<std::string> &files() const { return _file_args; }
382 424

	
425
    ///Throw instead of exit in case of problems
426
    void throwOnProblems()
427
    {
428
      _exit_on_problems=false;
429
    }
383 430
  };
384 431
}
385 432

	
386 433
#endif // LEMON_ARG_PARSER_H
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -42,32 +42,33 @@
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default, it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
... ...
@@ -76,32 +77,33 @@
76 77
#endif
77 78
    {
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to
86
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 88
    ///Instantiates a \c ReachedMap.
87 89

	
88 90
    ///This function instantiates a \ref ReachedMap.
89 91
    ///\param g is the digraph, to which
90 92
    ///we would like to define the \ref ReachedMap.
91 93
    static ReachedMap *createReachedMap(const Digraph &g)
92 94
    {
93 95
      return new ReachedMap(g);
94 96
    }
95 97

	
96 98
    ///The type of the map that stores the distances of the nodes.
97 99

	
98 100
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 102
    typedef typename Digraph::template NodeMap<int> DistMap;
101 103
    ///Instantiates a \c DistMap.
102 104

	
103 105
    ///This function instantiates a \ref DistMap.
104 106
    ///\param g is the digraph, to which we would like to define the
105 107
    ///\ref DistMap.
106 108
    static DistMap *createDistMap(const Digraph &g)
107 109
    {
... ...
@@ -115,16 +117,21 @@
115 117
  ///This class provides an efficient implementation of the %BFS algorithm.
116 118
  ///
117 119
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 120
  ///algorithm, which is convenient in the simplier cases and it can be
119 121
  ///used easier.
120 122
  ///
121 123
  ///\tparam GR The type of the digraph the algorithm runs on.
122 124
  ///The default type is \ref ListDigraph.
125
  ///\tparam TR The traits class that defines various types used by the
126
  ///algorithm. By default, it is \ref BfsDefaultTraits
127
  ///"BfsDefaultTraits<GR>".
128
  ///In most cases, this parameter should not be set directly,
129
  ///consider to use the named template parameters instead.
123 130
#ifdef DOXYGEN
124 131
  template <typename GR,
125 132
            typename TR>
126 133
#else
127 134
  template <typename GR=ListDigraph,
128 135
            typename TR=BfsDefaultTraits<GR> >
129 136
#endif
130 137
  class Bfs {
... ...
@@ -220,17 +227,17 @@
220 227
        return 0; // ignore warnings
221 228
      }
222 229
    };
223 230
    ///\brief \ref named-templ-param "Named parameter" for setting
224 231
    ///\c PredMap type.
225 232
    ///
226 233
    ///\ref named-templ-param "Named parameter" for setting
227 234
    ///\c PredMap type.
228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
235
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 236
    template <class T>
230 237
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 238
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 239
    };
233 240

	
234 241
    template <class T>
235 242
    struct SetDistMapTraits : public Traits {
236 243
      typedef T DistMap;
... ...
@@ -240,17 +247,17 @@
240 247
        return 0; // ignore warnings
241 248
      }
242 249
    };
243 250
    ///\brief \ref named-templ-param "Named parameter" for setting
244 251
    ///\c DistMap type.
245 252
    ///
246 253
    ///\ref named-templ-param "Named parameter" for setting
247 254
    ///\c DistMap type.
248
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
255
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 256
    template <class T>
250 257
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
251 258
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
252 259
    };
253 260

	
254 261
    template <class T>
255 262
    struct SetReachedMapTraits : public Traits {
256 263
      typedef T ReachedMap;
... ...
@@ -260,17 +267,18 @@
260 267
        return 0; // ignore warnings
261 268
      }
262 269
    };
263 270
    ///\brief \ref named-templ-param "Named parameter" for setting
264 271
    ///\c ReachedMap type.
265 272
    ///
266 273
    ///\ref named-templ-param "Named parameter" for setting
267 274
    ///\c ReachedMap type.
268
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
275
    ///It must conform to
276
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 277
    template <class T>
270 278
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
271 279
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
272 280
    };
273 281

	
274 282
    template <class T>
275 283
    struct SetProcessedMapTraits : public Traits {
276 284
      typedef T ProcessedMap;
... ...
@@ -280,17 +288,17 @@
280 288
        return 0; // ignore warnings
281 289
      }
282 290
    };
283 291
    ///\brief \ref named-templ-param "Named parameter" for setting
284 292
    ///\c ProcessedMap type.
285 293
    ///
286 294
    ///\ref named-templ-param "Named parameter" for setting
287 295
    ///\c ProcessedMap type.
288
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
296
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 297
    template <class T>
290 298
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
291 299
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
292 300
    };
293 301

	
294 302
    struct SetStandardProcessedMapTraits : public Traits {
295 303
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
296 304
      static ProcessedMap *createProcessedMap(const Digraph &g)
... ...
@@ -408,18 +416,18 @@
408 416
      return *this;
409 417
    }
410 418

	
411 419
  public:
412 420

	
413 421
    ///\name Execution Control
414 422
    ///The simplest way to execute the BFS algorithm is to use one of the
415 423
    ///member functions called \ref run(Node) "run()".\n
416
    ///If you need more control on the execution, first you have to call
417
    ///\ref init(), then you can add several source nodes with
424
    ///If you need better control on the execution, you have to call
425
    ///\ref init() first, then you can add several source nodes with
418 426
    ///\ref addSource(). Finally the actual path computation can be
419 427
    ///performed with one of the \ref start() functions.
420 428

	
421 429
    ///@{
422 430

	
423 431
    ///\brief Initializes the internal data structures.
424 432
    ///
425 433
    ///Initializes the internal data structures.
... ...
@@ -695,22 +703,18 @@
695 703
      init();
696 704
      addSource(s);
697 705
      start(t);
698 706
      return reached(t);
699 707
    }
700 708

	
701 709
    ///Runs the algorithm to visit all nodes in the digraph.
702 710

	
703
    ///This method runs the %BFS algorithm in order to
704
    ///compute the shortest path to each node.
705
    ///
706
    ///The algorithm computes
707
    ///- the shortest path tree (forest),
708
    ///- the distance of each node from the root(s).
711
    ///This method runs the %BFS algorithm in order to visit all nodes
712
    ///in the digraph.
709 713
    ///
710 714
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
711 715
    ///\code
712 716
    ///  b.init();
713 717
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
714 718
    ///    if (!b.reached(n)) {
715 719
    ///      b.addSource(n);
716 720
    ///      b.start();
... ...
@@ -732,60 +736,62 @@
732 736
    ///\name Query Functions
733 737
    ///The results of the BFS algorithm can be obtained using these
734 738
    ///functions.\n
735 739
    ///Either \ref run(Node) "run()" or \ref start() should be called
736 740
    ///before using them.
737 741

	
738 742
    ///@{
739 743

	
740
    ///The shortest path to a node.
744
    ///The shortest path to the given node.
741 745

	
742
    ///Returns the shortest path to a node.
746
    ///Returns the shortest path to the given node from the root(s).
743 747
    ///
744 748
    ///\warning \c t should be reached from the root(s).
745 749
    ///
746 750
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 751
    ///must be called before using this function.
748 752
    Path path(Node t) const { return Path(*G, *_pred, t); }
749 753

	
750
    ///The distance of a node from the root(s).
754
    ///The distance of the given node from the root(s).
751 755

	
752
    ///Returns the distance of a node from the root(s).
756
    ///Returns the distance of the given node from the root(s).
753 757
    ///
754 758
    ///\warning If node \c v is not reached from the root(s), then
755 759
    ///the return value of this function is undefined.
756 760
    ///
757 761
    ///\pre Either \ref run(Node) "run()" or \ref init()
758 762
    ///must be called before using this function.
759 763
    int dist(Node v) const { return (*_dist)[v]; }
760 764

	
761
    ///Returns the 'previous arc' of the shortest path tree for a node.
762

	
765
    ///\brief Returns the 'previous arc' of the shortest path tree for
766
    ///the given node.
767
    ///
763 768
    ///This function returns the 'previous arc' of the shortest path
764 769
    ///tree for the node \c v, i.e. it returns the last arc of a
765 770
    ///shortest path from a root to \c v. It is \c INVALID if \c v
766 771
    ///is not reached from the root(s) or if \c v is a root.
767 772
    ///
768 773
    ///The shortest path tree used here is equal to the shortest path
769
    ///tree used in \ref predNode().
774
    ///tree used in \ref predNode() and \ref predMap().
770 775
    ///
771 776
    ///\pre Either \ref run(Node) "run()" or \ref init()
772 777
    ///must be called before using this function.
773 778
    Arc predArc(Node v) const { return (*_pred)[v];}
774 779

	
775
    ///Returns the 'previous node' of the shortest path tree for a node.
776

	
780
    ///\brief Returns the 'previous node' of the shortest path tree for
781
    ///the given node.
782
    ///
777 783
    ///This function returns the 'previous node' of the shortest path
778 784
    ///tree for the node \c v, i.e. it returns the last but one node
779
    ///from a shortest path from a root to \c v. It is \c INVALID
785
    ///of a shortest path from a root to \c v. It is \c INVALID
780 786
    ///if \c v is not reached from the root(s) or if \c v is a root.
781 787
    ///
782 788
    ///The shortest path tree used here is equal to the shortest path
783
    ///tree used in \ref predArc().
789
    ///tree used in \ref predArc() and \ref predMap().
784 790
    ///
785 791
    ///\pre Either \ref run(Node) "run()" or \ref init()
786 792
    ///must be called before using this function.
787 793
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
788 794
                                  G->source((*_pred)[v]); }
789 795

	
790 796
    ///\brief Returns a const reference to the node map that stores the
791 797
    /// distances of the nodes.
... ...
@@ -796,23 +802,23 @@
796 802
    ///\pre Either \ref run(Node) "run()" or \ref init()
797 803
    ///must be called before using this function.
798 804
    const DistMap &distMap() const { return *_dist;}
799 805

	
800 806
    ///\brief Returns a const reference to the node map that stores the
801 807
    ///predecessor arcs.
802 808
    ///
803 809
    ///Returns a const reference to the node map that stores the predecessor
804
    ///arcs, which form the shortest path tree.
810
    ///arcs, which form the shortest path tree (forest).
805 811
    ///
806 812
    ///\pre Either \ref run(Node) "run()" or \ref init()
807 813
    ///must be called before using this function.
808 814
    const PredMap &predMap() const { return *_pred;}
809 815

	
810
    ///Checks if a node is reached from the root(s).
816
    ///Checks if the given node is reached from the root(s).
811 817

	
812 818
    ///Returns \c true if \c v is reached from the root(s).
813 819
    ///
814 820
    ///\pre Either \ref run(Node) "run()" or \ref init()
815 821
    ///must be called before using this function.
816 822
    bool reached(Node v) const { return (*_reached)[v]; }
817 823

	
818 824
    ///@}
... ...
@@ -828,33 +834,33 @@
828 834
    ///The type of the digraph the algorithm runs on.
829 835
    typedef GR Digraph;
830 836

	
831 837
    ///\brief The type of the map that stores the predecessor
832 838
    ///arcs of the shortest paths.
833 839
    ///
834 840
    ///The type of the map that stores the predecessor
835 841
    ///arcs of the shortest paths.
836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
842
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
837 843
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838 844
    ///Instantiates a PredMap.
839 845

	
840 846
    ///This function instantiates a PredMap.
841 847
    ///\param g is the digraph, to which we would like to define the
842 848
    ///PredMap.
843 849
    static PredMap *createPredMap(const Digraph &g)
844 850
    {
845 851
      return new PredMap(g);
846 852
    }
847 853

	
848 854
    ///The type of the map that indicates which nodes are processed.
849 855

	
850 856
    ///The type of the map that indicates which nodes are processed.
851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
852
    ///By default it is a NullMap.
857
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
858
    ///By default, it is a NullMap.
853 859
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854 860
    ///Instantiates a ProcessedMap.
855 861

	
856 862
    ///This function instantiates a ProcessedMap.
857 863
    ///\param g is the digraph, to which
858 864
    ///we would like to define the ProcessedMap.
859 865
#ifdef DOXYGEN
860 866
    static ProcessedMap *createProcessedMap(const Digraph &g)
... ...
@@ -863,58 +869,55 @@
863 869
#endif
864 870
    {
865 871
      return new ProcessedMap();
866 872
    }
867 873

	
868 874
    ///The type of the map that indicates which nodes are reached.
869 875

	
870 876
    ///The type of the map that indicates which nodes are reached.
871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
877
    ///It must conform to
878
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 879
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
873 880
    ///Instantiates a ReachedMap.
874 881

	
875 882
    ///This function instantiates a ReachedMap.
876 883
    ///\param g is the digraph, to which
877 884
    ///we would like to define the ReachedMap.
878 885
    static ReachedMap *createReachedMap(const Digraph &g)
879 886
    {
880 887
      return new ReachedMap(g);
881 888
    }
882 889

	
883 890
    ///The type of the map that stores the distances of the nodes.
884 891

	
885 892
    ///The type of the map that stores the distances of the nodes.
886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
893
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
887 894
    typedef typename Digraph::template NodeMap<int> DistMap;
888 895
    ///Instantiates a DistMap.
889 896

	
890 897
    ///This function instantiates a DistMap.
891 898
    ///\param g is the digraph, to which we would like to define
892 899
    ///the DistMap
893 900
    static DistMap *createDistMap(const Digraph &g)
894 901
    {
895 902
      return new DistMap(g);
896 903
    }
897 904

	
898 905
    ///The type of the shortest paths.
899 906

	
900 907
    ///The type of the shortest paths.
901
    ///It must meet the \ref concepts::Path "Path" concept.
908
    ///It must conform to the \ref concepts::Path "Path" concept.
902 909
    typedef lemon::Path<Digraph> Path;
903 910
  };
904 911

	
905 912
  /// Default traits class used by BfsWizard
906 913

	
907
  /// To make it easier to use Bfs algorithm
908
  /// we have created a wizard class.
909
  /// This \ref BfsWizard class needs default traits,
910
  /// as well as the \ref Bfs class.
911
  /// The \ref BfsWizardBase is a class to be the default traits of the
912
  /// \ref BfsWizard class.
914
  /// Default traits class used by BfsWizard.
915
  /// \tparam GR The type of the digraph.
913 916
  template<class GR>
914 917
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 918
  {
916 919

	
917 920
    typedef BfsWizardDefaultTraits<GR> Base;
918 921
  protected:
919 922
    //The type of the nodes in the digraph.
920 923
    typedef typename Base::Digraph::Node Node;
... ...
@@ -932,17 +935,17 @@
932 935
    //Pointer to the shortest path to the target node.
933 936
    void *_path;
934 937
    //Pointer to the distance of the target node.
935 938
    int *_di;
936 939

	
937 940
    public:
938 941
    /// Constructor.
939 942

	
940
    /// This constructor does not require parameters, therefore it initiates
943
    /// This constructor does not require parameters, it initiates
941 944
    /// all of the attributes to \c 0.
942 945
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 946
                      _dist(0), _path(0), _di(0) {}
944 947

	
945 948
    /// Constructor.
946 949

	
947 950
    /// This constructor requires one parameter,
948 951
    /// others are initiated to \c 0.
... ...
@@ -957,39 +960,35 @@
957 960

	
958 961
  /// This auxiliary class is created to implement the
959 962
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 963
  /// It does not have own \ref run(Node) "run()" method, it uses the
961 964
  /// functions and features of the plain \ref Bfs.
962 965
  ///
963 966
  /// This class should only be used through the \ref bfs() function,
964 967
  /// which makes it easier to use the algorithm.
968
  ///
969
  /// \tparam TR The traits class that defines various types used by the
970
  /// algorithm.
965 971
  template<class TR>
966 972
  class BfsWizard : public TR
967 973
  {
968 974
    typedef TR Base;
969 975

	
970
    ///The type of the digraph the algorithm runs on.
971 976
    typedef typename TR::Digraph Digraph;
972 977

	
973 978
    typedef typename Digraph::Node Node;
974 979
    typedef typename Digraph::NodeIt NodeIt;
975 980
    typedef typename Digraph::Arc Arc;
976 981
    typedef typename Digraph::OutArcIt OutArcIt;
977 982

	
978
    ///\brief The type of the map that stores the predecessor
979
    ///arcs of the shortest paths.
980 983
    typedef typename TR::PredMap PredMap;
981
    ///\brief The type of the map that stores the distances of the nodes.
982 984
    typedef typename TR::DistMap DistMap;
983
    ///\brief The type of the map that indicates which nodes are reached.
984 985
    typedef typename TR::ReachedMap ReachedMap;
985
    ///\brief The type of the map that indicates which nodes are processed.
986 986
    typedef typename TR::ProcessedMap ProcessedMap;
987
    ///The type of the shortest paths
988 987
    typedef typename TR::Path Path;
989 988

	
990 989
  public:
991 990

	
992 991
    /// Constructor.
993 992
    BfsWizard() : TR() {}
994 993

	
995 994
    /// Constructor that requires parameters.
... ...
@@ -1049,88 +1048,93 @@
1049 1048
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1050 1049
      if (Base::_di)
1051 1050
        *Base::_di = alg.dist(t);
1052 1051
      return alg.reached(t);
1053 1052
    }
1054 1053

	
1055 1054
    ///Runs BFS algorithm to visit all nodes in the digraph.
1056 1055

	
1057
    ///This method runs BFS algorithm in order to compute
1058
    ///the shortest path to each node.
1056
    ///This method runs BFS algorithm in order to visit all nodes
1057
    ///in the digraph.
1059 1058
    void run()
1060 1059
    {
1061 1060
      run(INVALID);
1062 1061
    }
1063 1062

	
1064 1063
    template<class T>
1065 1064
    struct SetPredMapBase : public Base {
1066 1065
      typedef T PredMap;
1067 1066
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1067
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1068
    };
1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting PredMap object.
1069

	
1070
    ///\brief \ref named-templ-param "Named parameter" for setting
1071
    ///the predecessor map.
1072 1072
    ///
1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting PredMap object.
1073
    ///\ref named-templ-param "Named parameter" function for setting
1074
    ///the map that stores the predecessor arcs of the nodes.
1075 1075
    template<class T>
1076 1076
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 1077
    {
1078 1078
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1079
      return BfsWizard<SetPredMapBase<T> >(*this);
1080 1080
    }
1081 1081

	
1082 1082
    template<class T>
1083 1083
    struct SetReachedMapBase : public Base {
1084 1084
      typedef T ReachedMap;
1085 1085
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1086 1086
      SetReachedMapBase(const TR &b) : TR(b) {}
1087 1087
    };
1088
    ///\brief \ref named-func-param "Named parameter"
1089
    ///for setting ReachedMap object.
1088

	
1089
    ///\brief \ref named-templ-param "Named parameter" for setting
1090
    ///the reached map.
1090 1091
    ///
1091
    /// \ref named-func-param "Named parameter"
1092
    ///for setting ReachedMap object.
1092
    ///\ref named-templ-param "Named parameter" function for setting
1093
    ///the map that indicates which nodes are reached.
1093 1094
    template<class T>
1094 1095
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1095 1096
    {
1096 1097
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1097 1098
      return BfsWizard<SetReachedMapBase<T> >(*this);
1098 1099
    }
1099 1100

	
1100 1101
    template<class T>
1101 1102
    struct SetDistMapBase : public Base {
1102 1103
      typedef T DistMap;
1103 1104
      static DistMap *createDistMap(const Digraph &) { return 0; };
1104 1105
      SetDistMapBase(const TR &b) : TR(b) {}
1105 1106
    };
1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting DistMap object.
1107

	
1108
    ///\brief \ref named-templ-param "Named parameter" for setting
1109
    ///the distance map.
1108 1110
    ///
1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting DistMap object.
1111
    ///\ref named-templ-param "Named parameter" function for setting
1112
    ///the map that stores the distances of the nodes calculated
1113
    ///by the algorithm.
1111 1114
    template<class T>
1112 1115
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1116
    {
1114 1117
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1118
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1119
    }
1117 1120

	
1118 1121
    template<class T>
1119 1122
    struct SetProcessedMapBase : public Base {
1120 1123
      typedef T ProcessedMap;
1121 1124
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1125
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1126
    };
1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting ProcessedMap object.
1127

	
1128
    ///\brief \ref named-func-param "Named parameter" for setting
1129
    ///the processed map.
1126 1130
    ///
1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting ProcessedMap object.
1131
    ///\ref named-templ-param "Named parameter" function for setting
1132
    ///the map that indicates which nodes are processed.
1129 1133
    template<class T>
1130 1134
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 1135
    {
1132 1136
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 1137
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1134 1138
    }
1135 1139

	
1136 1140
    template<class T>
... ...
@@ -1259,17 +1263,18 @@
1259 1263
  struct BfsVisitDefaultTraits {
1260 1264

	
1261 1265
    /// \brief The type of the digraph the algorithm runs on.
1262 1266
    typedef GR Digraph;
1263 1267

	
1264 1268
    /// \brief The type of the map that indicates which nodes are reached.
1265 1269
    ///
1266 1270
    /// The type of the map that indicates which nodes are reached.
1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1271
    /// It must conform to
1272
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1273
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 1274

	
1270 1275
    /// \brief Instantiates a ReachedMap.
1271 1276
    ///
1272 1277
    /// This function instantiates a ReachedMap.
1273 1278
    /// \param digraph is the digraph, to which
1274 1279
    /// we would like to define the ReachedMap.
1275 1280
    static ReachedMap *createReachedMap(const Digraph &digraph) {
... ...
@@ -1297,21 +1302,21 @@
1297 1302
  /// \tparam GR The type of the digraph the algorithm runs on.
1298 1303
  /// The default type is \ref ListDigraph.
1299 1304
  /// The value of GR is not used directly by \ref BfsVisit,
1300 1305
  /// it is only passed to \ref BfsVisitDefaultTraits.
1301 1306
  /// \tparam VS The Visitor type that is used by the algorithm.
1302 1307
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1303 1308
  /// does not observe the BFS events. If you want to observe the BFS
1304 1309
  /// events, you should implement your own visitor class.
1305
  /// \tparam TR Traits class to set various data types used by the
1306
  /// algorithm. The default traits class is
1307
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1308
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309
  /// a BFS visit traits class.
1310
  /// \tparam TR The traits class that defines various types used by the
1311
  /// algorithm. By default, it is \ref BfsVisitDefaultTraits
1312
  /// "BfsVisitDefaultTraits<GR>".
1313
  /// In most cases, this parameter should not be set directly,
1314
  /// consider to use the named template parameters instead.
1310 1315
#ifdef DOXYGEN
1311 1316
  template <typename GR, typename VS, typename TR>
1312 1317
#else
1313 1318
  template <typename GR = ListDigraph,
1314 1319
            typename VS = BfsVisitor<GR>,
1315 1320
            typename TR = BfsVisitDefaultTraits<GR> >
1316 1321
#endif
1317 1322
  class BfsVisit {
... ...
@@ -1420,18 +1425,18 @@
1420 1425
      return *this;
1421 1426
    }
1422 1427

	
1423 1428
  public:
1424 1429

	
1425 1430
    /// \name Execution Control
1426 1431
    /// The simplest way to execute the BFS algorithm is to use one of the
1427 1432
    /// member functions called \ref run(Node) "run()".\n
1428
    /// If you need more control on the execution, first you have to call
1429
    /// \ref init(), then you can add several source nodes with
1433
    /// If you need better control on the execution, you have to call
1434
    /// \ref init() first, then you can add several source nodes with
1430 1435
    /// \ref addSource(). Finally the actual path computation can be
1431 1436
    /// performed with one of the \ref start() functions.
1432 1437

	
1433 1438
    /// @{
1434 1439

	
1435 1440
    /// \brief Initializes the internal data structures.
1436 1441
    ///
1437 1442
    /// Initializes the internal data structures.
... ...
@@ -1693,22 +1698,18 @@
1693 1698
      init();
1694 1699
      addSource(s);
1695 1700
      start(t);
1696 1701
      return reached(t);
1697 1702
    }
1698 1703

	
1699 1704
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1700 1705
    ///
1701
    /// This method runs the %BFS algorithm in order to
1702
    /// compute the shortest path to each node.
1703
    ///
1704
    /// The algorithm computes
1705
    /// - the shortest path tree (forest),
1706
    /// - the distance of each node from the root(s).
1706
    /// This method runs the %BFS algorithm in order to visit all nodes
1707
    /// in the digraph.
1707 1708
    ///
1708 1709
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1709 1710
    ///\code
1710 1711
    ///  b.init();
1711 1712
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1712 1713
    ///    if (!b.reached(n)) {
1713 1714
    ///      b.addSource(n);
1714 1715
    ///      b.start();
... ...
@@ -1730,17 +1731,17 @@
1730 1731
    /// \name Query Functions
1731 1732
    /// The results of the BFS algorithm can be obtained using these
1732 1733
    /// functions.\n
1733 1734
    /// Either \ref run(Node) "run()" or \ref start() should be called
1734 1735
    /// before using them.
1735 1736

	
1736 1737
    ///@{
1737 1738

	
1738
    /// \brief Checks if a node is reached from the root(s).
1739
    /// \brief Checks if the given node is reached from the root(s).
1739 1740
    ///
1740 1741
    /// Returns \c true if \c v is reached from the root(s).
1741 1742
    ///
1742 1743
    /// \pre Either \ref run(Node) "run()" or \ref init()
1743 1744
    /// must be called before using this function.
1744 1745
    bool reached(Node v) const { return (*_reached)[v]; }
1745 1746

	
1746 1747
    ///@}
Ignore white space 6 line context
... ...
@@ -14,151 +14,148 @@
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BIN_HEAP_H
20 20
#define LEMON_BIN_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Binary Heap implementation.
24
///\brief Binary heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
31 31

	
32
  ///\ingroup auxdat
32
  /// \ingroup heaps
33 33
  ///
34
  ///\brief A Binary Heap implementation.
34
  /// \brief Binary heap data structure.
35 35
  ///
36
  ///This class implements the \e binary \e heap data structure.
36
  /// This class implements the \e binary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
37 38
  ///
38
  ///A \e heap is a data structure for storing items with specified values
39
  ///called \e priorities in such a way that finding the item with minimum
40
  ///priority is efficient. \c CMP specifies the ordering of the priorities.
41
  ///In a heap one can change the priority of an item, add or erase an
42
  ///item, etc.
43
  ///
44
  ///\tparam PR Type of the priority of the items.
45
  ///\tparam IM A read and writable item map with int values, used internally
46
  ///to handle the cross references.
47
  ///\tparam CMP A functor class for the ordering of the priorities.
48
  ///The default is \c std::less<PR>.
49
  ///
50
  ///\sa FibHeap
51
  ///\sa Dijkstra
39
  /// \tparam PR Type of the priorities of the items.
40
  /// \tparam IM A read-writable item map with \c int values, used
41
  /// internally to handle the cross references.
42
  /// \tparam CMP A functor class for comparing the priorities.
43
  /// The default is \c std::less<PR>.
44
#ifdef DOXYGEN
45
  template <typename PR, typename IM, typename CMP>
46
#else
52 47
  template <typename PR, typename IM, typename CMP = std::less<PR> >
48
#endif
53 49
  class BinHeap {
50
  public:
54 51

	
55
  public:
56
    ///\e
52
    /// Type of the item-int map.
57 53
    typedef IM ItemIntMap;
58
    ///\e
54
    /// Type of the priorities.
59 55
    typedef PR Prio;
60
    ///\e
56
    /// Type of the items stored in the heap.
61 57
    typedef typename ItemIntMap::Key Item;
62
    ///\e
58
    /// Type of the item-priority pairs.
63 59
    typedef std::pair<Item,Prio> Pair;
64
    ///\e
60
    /// Functor type for comparing the priorities.
65 61
    typedef CMP Compare;
66 62

	
67
    /// \brief Type to represent the items states.
63
    /// \brief Type to represent the states of the items.
68 64
    ///
69
    /// Each Item element have a state associated to it. It may be "in heap",
70
    /// "pre heap" or "post heap". The latter two are indifferent from the
65
    /// Each item has a state associated to it. It can be "in heap",
66
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71 67
    /// heap's point of view, but may be useful to the user.
72 68
    ///
73 69
    /// The item-int map must be initialized in such way that it assigns
74 70
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
75 71
    enum State {
76 72
      IN_HEAP = 0,    ///< = 0.
77 73
      PRE_HEAP = -1,  ///< = -1.
78 74
      POST_HEAP = -2  ///< = -2.
79 75
    };
80 76

	
81 77
  private:
82 78
    std::vector<Pair> _data;
83 79
    Compare _comp;
84 80
    ItemIntMap &_iim;
85 81

	
86 82
  public:
87
    /// \brief The constructor.
83

	
84
    /// \brief Constructor.
88 85
    ///
89
    /// The constructor.
90
    /// \param map should be given to the constructor, since it is used
91
    /// internally to handle the cross references. The value of the map
92
    /// must be \c PRE_HEAP (<tt>-1</tt>) for every item.
86
    /// Constructor.
87
    /// \param map A map that assigns \c int values to the items.
88
    /// It is used internally to handle the cross references.
89
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
93 90
    explicit BinHeap(ItemIntMap &map) : _iim(map) {}
94 91

	
95
    /// \brief The constructor.
92
    /// \brief Constructor.
96 93
    ///
97
    /// The constructor.
98
    /// \param map should be given to the constructor, since it is used
99
    /// internally to handle the cross references. The value of the map
100
    /// should be PRE_HEAP (-1) for each element.
101
    ///
102
    /// \param comp The comparator function object.
94
    /// Constructor.
95
    /// \param map A map that assigns \c int values to the items.
96
    /// It is used internally to handle the cross references.
97
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
98
    /// \param comp The function object used for comparing the priorities.
103 99
    BinHeap(ItemIntMap &map, const Compare &comp)
104 100
      : _iim(map), _comp(comp) {}
105 101

	
106 102

	
107
    /// The number of items stored in the heap.
103
    /// \brief The number of items stored in the heap.
108 104
    ///
109
    /// \brief Returns the number of items stored in the heap.
105
    /// This function returns the number of items stored in the heap.
110 106
    int size() const { return _data.size(); }
111 107

	
112
    /// \brief Checks if the heap stores no items.
108
    /// \brief Check if the heap is empty.
113 109
    ///
114
    /// Returns \c true if and only if the heap stores no items.
110
    /// This function returns \c true if the heap is empty.
115 111
    bool empty() const { return _data.empty(); }
116 112

	
117
    /// \brief Make empty this heap.
113
    /// \brief Make the heap empty.
118 114
    ///
119
    /// Make empty this heap. It does not change the cross reference map.
120
    /// If you want to reuse what is not surely empty you should first clear
121
    /// the heap and after that you should set the cross reference map for
122
    /// each item to \c PRE_HEAP.
115
    /// This functon makes the heap empty.
116
    /// It does not change the cross reference map. If you want to reuse
117
    /// a heap that is not surely empty, you should first clear it and
118
    /// then you should set the cross reference map to \c PRE_HEAP
119
    /// for each item.
123 120
    void clear() {
124 121
      _data.clear();
125 122
    }
126 123

	
127 124
  private:
128 125
    static int parent(int i) { return (i-1)/2; }
129 126

	
130
    static int second_child(int i) { return 2*i+2; }
127
    static int secondChild(int i) { return 2*i+2; }
131 128
    bool less(const Pair &p1, const Pair &p2) const {
132 129
      return _comp(p1.second, p2.second);
133 130
    }
134 131

	
135
    int bubble_up(int hole, Pair p) {
132
    int bubbleUp(int hole, Pair p) {
136 133
      int par = parent(hole);
137 134
      while( hole>0 && less(p,_data[par]) ) {
138 135
        move(_data[par],hole);
139 136
        hole = par;
140 137
        par = parent(hole);
141 138
      }
142 139
      move(p, hole);
143 140
      return hole;
144 141
    }
145 142

	
146
    int bubble_down(int hole, Pair p, int length) {
147
      int child = second_child(hole);
143
    int bubbleDown(int hole, Pair p, int length) {
144
      int child = secondChild(hole);
148 145
      while(child < length) {
149 146
        if( less(_data[child-1], _data[child]) ) {
150 147
          --child;
151 148
        }
152 149
        if( !less(_data[child], p) )
153 150
          goto ok;
154 151
        move(_data[child], hole);
155 152
        hole = child;
156
        child = second_child(hole);
153
        child = secondChild(hole);
157 154
      }
158 155
      child--;
159 156
      if( child<length && less(_data[child], p) ) {
160 157
        move(_data[child], hole);
161 158
        hole=child;
162 159
      }
163 160
    ok:
164 161
      move(p, hole);
... ...
@@ -166,178 +163,181 @@
166 163
    }
167 164

	
168 165
    void move(const Pair &p, int i) {
169 166
      _data[i] = p;
170 167
      _iim.set(p.first, i);
171 168
    }
172 169

	
173 170
  public:
171

	
174 172
    /// \brief Insert a pair of item and priority into the heap.
175 173
    ///
176
    /// Adds \c p.first to the heap with priority \c p.second.
174
    /// This function inserts \c p.first to the heap with priority
175
    /// \c p.second.
177 176
    /// \param p The pair to insert.
177
    /// \pre \c p.first must not be stored in the heap.
178 178
    void push(const Pair &p) {
179 179
      int n = _data.size();
180 180
      _data.resize(n+1);
181
      bubble_up(n, p);
181
      bubbleUp(n, p);
182 182
    }
183 183

	
184
    /// \brief Insert an item into the heap with the given heap.
184
    /// \brief Insert an item into the heap with the given priority.
185 185
    ///
186
    /// Adds \c i to the heap with priority \c p.
186
    /// This function inserts the given item into the heap with the
187
    /// given priority.
187 188
    /// \param i The item to insert.
188 189
    /// \param p The priority of the item.
190
    /// \pre \e i must not be stored in the heap.
189 191
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
190 192

	
191
    /// \brief Returns the item with minimum priority relative to \c Compare.
193
    /// \brief Return the item having minimum priority.
192 194
    ///
193
    /// This method returns the item with minimum priority relative to \c
194
    /// Compare.
195
    /// \pre The heap must be nonempty.
195
    /// This function returns the item having minimum priority.
196
    /// \pre The heap must be non-empty.
196 197
    Item top() const {
197 198
      return _data[0].first;
198 199
    }
199 200

	
200
    /// \brief Returns the minimum priority relative to \c Compare.
201
    /// \brief The minimum priority.
201 202
    ///
202
    /// It returns the minimum priority relative to \c Compare.
203
    /// \pre The heap must be nonempty.
203
    /// This function returns the minimum priority.
204
    /// \pre The heap must be non-empty.
204 205
    Prio prio() const {
205 206
      return _data[0].second;
206 207
    }
207 208

	
208
    /// \brief Deletes the item with minimum priority relative to \c Compare.
209
    /// \brief Remove the item having minimum priority.
209 210
    ///
210
    /// This method deletes the item with minimum priority relative to \c
211
    /// Compare from the heap.
211
    /// This function removes the item having minimum priority.
212 212
    /// \pre The heap must be non-empty.
213 213
    void pop() {
214 214
      int n = _data.size()-1;
215 215
      _iim.set(_data[0].first, POST_HEAP);
216 216
      if (n > 0) {
217
        bubble_down(0, _data[n], n);
217
        bubbleDown(0, _data[n], n);
218 218
      }
219 219
      _data.pop_back();
220 220
    }
221 221

	
222
    /// \brief Deletes \c i from the heap.
222
    /// \brief Remove the given item from the heap.
223 223
    ///
224
    /// This method deletes item \c i from the heap.
225
    /// \param i The item to erase.
226
    /// \pre The item should be in the heap.
224
    /// This function removes the given item from the heap if it is
225
    /// already stored.
226
    /// \param i The item to delete.
227
    /// \pre \e i must be in the heap.
227 228
    void erase(const Item &i) {
228 229
      int h = _iim[i];
229 230
      int n = _data.size()-1;
230 231
      _iim.set(_data[h].first, POST_HEAP);
231 232
      if( h < n ) {
232
        if ( bubble_up(h, _data[n]) == h) {
233
          bubble_down(h, _data[n], n);
233
        if ( bubbleUp(h, _data[n]) == h) {
234
          bubbleDown(h, _data[n], n);
234 235
        }
235 236
      }
236 237
      _data.pop_back();
237 238
    }
238 239

	
239

	
240
    /// \brief Returns the priority of \c i.
240
    /// \brief The priority of the given item.
241 241
    ///
242
    /// This function returns the priority of item \c i.
242
    /// This function returns the priority of the given item.
243 243
    /// \param i The item.
244
    /// \pre \c i must be in the heap.
244
    /// \pre \e i must be in the heap.
245 245
    Prio operator[](const Item &i) const {
246 246
      int idx = _iim[i];
247 247
      return _data[idx].second;
248 248
    }
249 249

	
250
    /// \brief \c i gets to the heap with priority \c p independently
251
    /// if \c i was already there.
250
    /// \brief Set the priority of an item or insert it, if it is
251
    /// not stored in the heap.
252 252
    ///
253
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
254
    /// in the heap and sets the priority of \c i to \c p otherwise.
253
    /// This method sets the priority of the given item if it is
254
    /// already stored in the heap. Otherwise it inserts the given
255
    /// item into the heap with the given priority.
255 256
    /// \param i The item.
256 257
    /// \param p The priority.
257 258
    void set(const Item &i, const Prio &p) {
258 259
      int idx = _iim[i];
259 260
      if( idx < 0 ) {
260 261
        push(i,p);
261 262
      }
262 263
      else if( _comp(p, _data[idx].second) ) {
263
        bubble_up(idx, Pair(i,p));
264
        bubbleUp(idx, Pair(i,p));
264 265
      }
265 266
      else {
266
        bubble_down(idx, Pair(i,p), _data.size());
267
        bubbleDown(idx, Pair(i,p), _data.size());
267 268
      }
268 269
    }
269 270

	
270
    /// \brief Decreases the priority of \c i to \c p.
271
    /// \brief Decrease the priority of an item to the given value.
271 272
    ///
272
    /// This method decreases the priority of item \c i to \c p.
273
    /// This function decreases the priority of an item to the given value.
273 274
    /// \param i The item.
274 275
    /// \param p The priority.
275
    /// \pre \c i must be stored in the heap with priority at least \c
276
    /// p relative to \c Compare.
276
    /// \pre \e i must be stored in the heap with priority at least \e p.
277 277
    void decrease(const Item &i, const Prio &p) {
278 278
      int idx = _iim[i];
279
      bubble_up(idx, Pair(i,p));
279
      bubbleUp(idx, Pair(i,p));
280 280
    }
281 281

	
282
    /// \brief Increases the priority of \c i to \c p.
282
    /// \brief Increase the priority of an item to the given value.
283 283
    ///
284
    /// This method sets the priority of item \c i to \c p.
284
    /// This function increases the priority of an item to the given value.
285 285
    /// \param i The item.
286 286
    /// \param p The priority.
287
    /// \pre \c i must be stored in the heap with priority at most \c
288
    /// p relative to \c Compare.
287
    /// \pre \e i must be stored in the heap with priority at most \e p.
289 288
    void increase(const Item &i, const Prio &p) {
290 289
      int idx = _iim[i];
291
      bubble_down(idx, Pair(i,p), _data.size());
290
      bubbleDown(idx, Pair(i,p), _data.size());
292 291
    }
293 292

	
294
    /// \brief Returns if \c item is in, has already been in, or has
295
    /// never been in the heap.
293
    /// \brief Return the state of an item.
296 294
    ///
297
    /// This method returns PRE_HEAP if \c item has never been in the
298
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
299
    /// otherwise. In the latter case it is possible that \c item will
300
    /// get back to the heap again.
295
    /// This method returns \c PRE_HEAP if the given item has never
296
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
297
    /// and \c POST_HEAP otherwise.
298
    /// In the latter case it is possible that the item will get back
299
    /// to the heap again.
301 300
    /// \param i The item.
302 301
    State state(const Item &i) const {
303 302
      int s = _iim[i];
304 303
      if( s>=0 )
305 304
        s=0;
306 305
      return State(s);
307 306
    }
308 307

	
309
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
310 309
    ///
311
    /// Sets the state of the \c item in the heap. It can be used to
312
    /// manually clear the heap when it is important to achive the
313
    /// better time complexity.
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
314 313
    /// \param i The item.
315 314
    /// \param st The state. It should not be \c IN_HEAP.
316 315
    void state(const Item& i, State st) {
317 316
      switch (st) {
318 317
      case POST_HEAP:
319 318
      case PRE_HEAP:
320 319
        if (state(i) == IN_HEAP) {
321 320
          erase(i);
322 321
        }
323 322
        _iim[i] = st;
324 323
        break;
325 324
      case IN_HEAP:
326 325
        break;
327 326
      }
328 327
    }
329 328

	
330
    /// \brief Replaces an item in the heap.
329
    /// \brief Replace an item in the heap.
331 330
    ///
332
    /// The \c i item is replaced with \c j item. The \c i item should
333
    /// be in the heap, while the \c j should be out of the heap. The
334
    /// \c i item will out of the heap and \c j will be in the heap
335
    /// with the same prioriority as prevoiusly the \c i item.
331
    /// This function replaces item \c i with item \c j.
332
    /// Item \c i must be in the heap, while \c j must be out of the heap.
333
    /// After calling this method, item \c i will be out of the
334
    /// heap and \c j will be in the heap with the same prioriority
335
    /// as item \c i had before.
336 336
    void replace(const Item& i, const Item& j) {
337 337
      int idx = _iim[i];
338 338
      _iim.set(i, _iim[j]);
339 339
      _iim.set(j, idx);
340 340
      _data[idx].first = j;
341 341
    }
342 342

	
343 343
  }; // class BinHeap
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -65,17 +65,17 @@
65 65

	
66 66
    // The map type.
67 67
    typedef ArrayMap Map;
68 68

	
69 69
    // The notifier type.
70 70
    typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;
71 71

	
72 72
  private:
73
  
73

	
74 74
    // The MapBase of the Map which imlements the core regisitry function.
75 75
    typedef typename Notifier::ObserverBase Parent;
76 76

	
77 77
    typedef std::allocator<Value> Allocator;
78 78

	
79 79
  public:
80 80

	
81 81
    // \brief Graph initialized map constructor.
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -152,17 +152,17 @@
152 152
  // DefaultMap class
153 153
  template <typename _Graph, typename _Item, typename _Value>
154 154
  class DefaultMap
155 155
    : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
156 156
    typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
157 157

	
158 158
  public:
159 159
    typedef DefaultMap<_Graph, _Item, _Value> Map;
160
    
160

	
161 161
    typedef typename Parent::GraphType GraphType;
162 162
    typedef typename Parent::Value Value;
163 163

	
164 164
    explicit DefaultMap(const GraphType& graph) : Parent(graph) {}
165 165
    DefaultMap(const GraphType& graph, const Value& value)
166 166
      : Parent(graph, value) {}
167 167

	
168 168
    DefaultMap& operator=(const DefaultMap& cmap) {
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -58,21 +58,21 @@
58 58
    }
59 59

	
60 60
    Arc fromId(int id, Arc) const {
61 61
      return Parent::arcFromId(id);
62 62
    }
63 63

	
64 64
    Node oppositeNode(const Node &n, const Arc &e) const {
65 65
      if (n == Parent::source(e))
66
	return Parent::target(e);
66
        return Parent::target(e);
67 67
      else if(n==Parent::target(e))
68
	return Parent::source(e);
68
        return Parent::source(e);
69 69
      else
70
	return INVALID;
70
        return INVALID;
71 71
    }
72 72

	
73 73

	
74 74
    // Alteration notifier extensions
75 75

	
76 76
    // The arc observer registry.
77 77
    typedef AlterationNotifier<ArcSetExtender, Arc> ArcNotifier;
78 78

	
... ...
@@ -86,105 +86,105 @@
86 86

	
87 87
    // Gives back the arc alteration notifier.
88 88
    ArcNotifier& notifier(Arc) const {
89 89
      return arc_notifier;
90 90
    }
91 91

	
92 92
    // Iterable extensions
93 93

	
94
    class NodeIt : public Node { 
94
    class NodeIt : public Node {
95 95
      const Digraph* digraph;
96 96
    public:
97 97

	
98 98
      NodeIt() {}
99 99

	
100 100
      NodeIt(Invalid i) : Node(i) { }
101 101

	
102 102
      explicit NodeIt(const Digraph& _graph) : digraph(&_graph) {
103
	_graph.first(static_cast<Node&>(*this));
103
        _graph.first(static_cast<Node&>(*this));
104 104
      }
105 105

	
106
      NodeIt(const Digraph& _graph, const Node& node) 
107
	: Node(node), digraph(&_graph) {}
106
      NodeIt(const Digraph& _graph, const Node& node)
107
        : Node(node), digraph(&_graph) {}
108 108

	
109
      NodeIt& operator++() { 
110
	digraph->next(*this);
111
	return *this; 
109
      NodeIt& operator++() {
110
        digraph->next(*this);
111
        return *this;
112 112
      }
113 113

	
114 114
    };
115 115

	
116 116

	
117
    class ArcIt : public Arc { 
117
    class ArcIt : public Arc {
118 118
      const Digraph* digraph;
119 119
    public:
120 120

	
121 121
      ArcIt() { }
122 122

	
123 123
      ArcIt(Invalid i) : Arc(i) { }
124 124

	
125 125
      explicit ArcIt(const Digraph& _graph) : digraph(&_graph) {
126
	_graph.first(static_cast<Arc&>(*this));
126
        _graph.first(static_cast<Arc&>(*this));
127 127
      }
128 128

	
129
      ArcIt(const Digraph& _graph, const Arc& e) : 
130
	Arc(e), digraph(&_graph) { }
129
      ArcIt(const Digraph& _graph, const Arc& e) :
130
        Arc(e), digraph(&_graph) { }
131 131

	
132
      ArcIt& operator++() { 
133
	digraph->next(*this);
134
	return *this; 
132
      ArcIt& operator++() {
133
        digraph->next(*this);
134
        return *this;
135 135
      }
136 136

	
137 137
    };
138 138

	
139 139

	
140
    class OutArcIt : public Arc { 
140
    class OutArcIt : public Arc {
141 141
      const Digraph* digraph;
142 142
    public:
143 143

	
144 144
      OutArcIt() { }
145 145

	
146 146
      OutArcIt(Invalid i) : Arc(i) { }
147 147

	
148
      OutArcIt(const Digraph& _graph, const Node& node) 
149
	: digraph(&_graph) {
150
	_graph.firstOut(*this, node);
148
      OutArcIt(const Digraph& _graph, const Node& node)
149
        : digraph(&_graph) {
150
        _graph.firstOut(*this, node);
151 151
      }
152 152

	
153
      OutArcIt(const Digraph& _graph, const Arc& arc) 
154
	: Arc(arc), digraph(&_graph) {}
153
      OutArcIt(const Digraph& _graph, const Arc& arc)
154
        : Arc(arc), digraph(&_graph) {}
155 155

	
156
      OutArcIt& operator++() { 
157
	digraph->nextOut(*this);
158
	return *this; 
156
      OutArcIt& operator++() {
157
        digraph->nextOut(*this);
158
        return *this;
159 159
      }
160 160

	
161 161
    };
162 162

	
163 163

	
164
    class InArcIt : public Arc { 
164
    class InArcIt : public Arc {
165 165
      const Digraph* digraph;
166 166
    public:
167 167

	
168 168
      InArcIt() { }
169 169

	
170 170
      InArcIt(Invalid i) : Arc(i) { }
171 171

	
172
      InArcIt(const Digraph& _graph, const Node& node) 
173
	: digraph(&_graph) {
174
	_graph.firstIn(*this, node);
172
      InArcIt(const Digraph& _graph, const Node& node)
173
        : digraph(&_graph) {
174
        _graph.firstIn(*this, node);
175 175
      }
176 176

	
177
      InArcIt(const Digraph& _graph, const Arc& arc) : 
178
	Arc(arc), digraph(&_graph) {}
177
      InArcIt(const Digraph& _graph, const Arc& arc) :
178
        Arc(arc), digraph(&_graph) {}
179 179

	
180
      InArcIt& operator++() { 
181
	digraph->nextIn(*this);
182
	return *this; 
180
      InArcIt& operator++() {
181
        digraph->nextIn(*this);
182
        return *this;
183 183
      }
184 184

	
185 185
    };
186 186

	
187 187
    // \brief Base node of the iterator
188 188
    //
189 189
    // Returns the base node (ie. the source in this case) of the iterator
190 190
    Node baseNode(const OutArcIt &e) const {
... ...
@@ -210,49 +210,49 @@
210 210
    // iterator
211 211
    Node runningNode(const InArcIt &e) const {
212 212
      return Parent::source(static_cast<const Arc&>(e));
213 213
    }
214 214

	
215 215
    using Parent::first;
216 216

	
217 217
    // Mappable extension
218
    
218

	
219 219
    template <typename _Value>
220
    class ArcMap 
220
    class ArcMap
221 221
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
222 222
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
223 223

	
224 224
    public:
225
      explicit ArcMap(const Digraph& _g) 
226
	: Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v) 
228
	: Parent(_g, _v) {}
225
      explicit ArcMap(const Digraph& _g)
226
        : Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v)
228
        : Parent(_g, _v) {}
229 229

	
230 230
      ArcMap& operator=(const ArcMap& cmap) {
231
	return operator=<ArcMap>(cmap);
231
        return operator=<ArcMap>(cmap);
232 232
      }
233 233

	
234 234
      template <typename CMap>
235 235
      ArcMap& operator=(const CMap& cmap) {
236 236
        Parent::operator=(cmap);
237
	return *this;
237
        return *this;
238 238
      }
239 239

	
240 240
    };
241 241

	
242 242

	
243 243
    // Alteration extension
244 244

	
245 245
    Arc addArc(const Node& from, const Node& to) {
246 246
      Arc arc = Parent::addArc(from, to);
247 247
      notifier(Arc()).add(arc);
248 248
      return arc;
249 249
    }
250
    
250

	
251 251
    void clear() {
252 252
      notifier(Arc()).clear();
253 253
      Parent::clear();
254 254
    }
255 255

	
256 256
    void erase(const Arc& arc) {
257 257
      notifier(Arc()).erase(arc);
258 258
      Parent::erase(arc);
... ...
@@ -307,21 +307,21 @@
307 307
    }
308 308

	
309 309
    Edge fromId(int id, Edge) const {
310 310
      return Parent::edgeFromId(id);
311 311
    }
312 312

	
313 313
    Node oppositeNode(const Node &n, const Edge &e) const {
314 314
      if( n == Parent::u(e))
315
	return Parent::v(e);
315
        return Parent::v(e);
316 316
      else if( n == Parent::v(e))
317
	return Parent::u(e);
317
        return Parent::u(e);
318 318
      else
319
	return INVALID;
319
        return INVALID;
320 320
    }
321 321

	
322 322
    Arc oppositeArc(const Arc &e) const {
323 323
      return Parent::direct(e, !Parent::direction(e));
324 324
    }
325 325

	
326 326
    using Parent::direct;
327 327
    Arc direct(const Edge &e, const Node &s) const {
... ...
@@ -335,164 +335,164 @@
335 335
  protected:
336 336

	
337 337
    mutable ArcNotifier arc_notifier;
338 338
    mutable EdgeNotifier edge_notifier;
339 339

	
340 340
  public:
341 341

	
342 342
    using Parent::notifier;
343
    
343

	
344 344
    ArcNotifier& notifier(Arc) const {
345 345
      return arc_notifier;
346 346
    }
347 347

	
348 348
    EdgeNotifier& notifier(Edge) const {
349 349
      return edge_notifier;
350 350
    }
351 351

	
352 352

	
353
    class NodeIt : public Node { 
353
    class NodeIt : public Node {
354 354
      const Graph* graph;
355 355
    public:
356 356

	
357 357
      NodeIt() {}
358 358

	
359 359
      NodeIt(Invalid i) : Node(i) { }
360 360

	
361 361
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
362
	_graph.first(static_cast<Node&>(*this));
362
        _graph.first(static_cast<Node&>(*this));
363 363
      }
364 364

	
365
      NodeIt(const Graph& _graph, const Node& node) 
366
	: Node(node), graph(&_graph) {}
365
      NodeIt(const Graph& _graph, const Node& node)
366
        : Node(node), graph(&_graph) {}
367 367

	
368
      NodeIt& operator++() { 
369
	graph->next(*this);
370
	return *this; 
368
      NodeIt& operator++() {
369
        graph->next(*this);
370
        return *this;
371 371
      }
372 372

	
373 373
    };
374 374

	
375 375

	
376
    class ArcIt : public Arc { 
376
    class ArcIt : public Arc {
377 377
      const Graph* graph;
378 378
    public:
379 379

	
380 380
      ArcIt() { }
381 381

	
382 382
      ArcIt(Invalid i) : Arc(i) { }
383 383

	
384 384
      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
385
	_graph.first(static_cast<Arc&>(*this));
385
        _graph.first(static_cast<Arc&>(*this));
386 386
      }
387 387

	
388
      ArcIt(const Graph& _graph, const Arc& e) : 
389
	Arc(e), graph(&_graph) { }
388
      ArcIt(const Graph& _graph, const Arc& e) :
389
        Arc(e), graph(&_graph) { }
390 390

	
391
      ArcIt& operator++() { 
392
	graph->next(*this);
393
	return *this; 
391
      ArcIt& operator++() {
392
        graph->next(*this);
393
        return *this;
394 394
      }
395 395

	
396 396
    };
397 397

	
398 398

	
399
    class OutArcIt : public Arc { 
399
    class OutArcIt : public Arc {
400 400
      const Graph* graph;
401 401
    public:
402 402

	
403 403
      OutArcIt() { }
404 404

	
405 405
      OutArcIt(Invalid i) : Arc(i) { }
406 406

	
407
      OutArcIt(const Graph& _graph, const Node& node) 
408
	: graph(&_graph) {
409
	_graph.firstOut(*this, node);
407
      OutArcIt(const Graph& _graph, const Node& node)
408
        : graph(&_graph) {
409
        _graph.firstOut(*this, node);
410 410
      }
411 411

	
412
      OutArcIt(const Graph& _graph, const Arc& arc) 
413
	: Arc(arc), graph(&_graph) {}
412
      OutArcIt(const Graph& _graph, const Arc& arc)
413
        : Arc(arc), graph(&_graph) {}
414 414

	
415
      OutArcIt& operator++() { 
416
	graph->nextOut(*this);
417
	return *this; 
415
      OutArcIt& operator++() {
416
        graph->nextOut(*this);
417
        return *this;
418 418
      }
419 419

	
420 420
    };
421 421

	
422 422

	
423
    class InArcIt : public Arc { 
423
    class InArcIt : public Arc {
424 424
      const Graph* graph;
425 425
    public:
426 426

	
427 427
      InArcIt() { }
428 428

	
429 429
      InArcIt(Invalid i) : Arc(i) { }
430 430

	
431
      InArcIt(const Graph& _graph, const Node& node) 
432
	: graph(&_graph) {
433
	_graph.firstIn(*this, node);
431
      InArcIt(const Graph& _graph, const Node& node)
432
        : graph(&_graph) {
433
        _graph.firstIn(*this, node);
434 434
      }
435 435

	
436
      InArcIt(const Graph& _graph, const Arc& arc) : 
437
	Arc(arc), graph(&_graph) {}
436
      InArcIt(const Graph& _graph, const Arc& arc) :
437
        Arc(arc), graph(&_graph) {}
438 438

	
439
      InArcIt& operator++() { 
440
	graph->nextIn(*this);
441
	return *this; 
439
      InArcIt& operator++() {
440
        graph->nextIn(*this);
441
        return *this;
442 442
      }
443 443

	
444 444
    };
445 445

	
446 446

	
447
    class EdgeIt : public Parent::Edge { 
447
    class EdgeIt : public Parent::Edge {
448 448
      const Graph* graph;
449 449
    public:
450 450

	
451 451
      EdgeIt() { }
452 452

	
453 453
      EdgeIt(Invalid i) : Edge(i) { }
454 454

	
455 455
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
456
	_graph.first(static_cast<Edge&>(*this));
456
        _graph.first(static_cast<Edge&>(*this));
457 457
      }
458 458

	
459
      EdgeIt(const Graph& _graph, const Edge& e) : 
460
	Edge(e), graph(&_graph) { }
459
      EdgeIt(const Graph& _graph, const Edge& e) :
460
        Edge(e), graph(&_graph) { }
461 461

	
462
      EdgeIt& operator++() { 
463
	graph->next(*this);
464
	return *this; 
462
      EdgeIt& operator++() {
463
        graph->next(*this);
464
        return *this;
465 465
      }
466 466

	
467 467
    };
468 468

	
469 469
    class IncEdgeIt : public Parent::Edge {
470 470
      friend class EdgeSetExtender;
471 471
      const Graph* graph;
472 472
      bool direction;
473 473
    public:
474 474

	
475 475
      IncEdgeIt() { }
476 476

	
477 477
      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
478 478

	
479 479
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
480
	_graph.firstInc(*this, direction, n);
480
        _graph.firstInc(*this, direction, n);
481 481
      }
482 482

	
483 483
      IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)
484
	: graph(&_graph), Edge(ue) {
485
	direction = (_graph.source(ue) == n);
484
        : graph(&_graph), Edge(ue) {
485
        direction = (_graph.source(ue) == n);
486 486
      }
487 487

	
488 488
      IncEdgeIt& operator++() {
489
	graph->nextInc(*this, direction);
490
	return *this; 
489
        graph->nextInc(*this, direction);
490
        return *this;
491 491
      }
492 492
    };
493 493

	
494 494
    // \brief Base node of the iterator
495 495
    //
496 496
    // Returns the base node (ie. the source in this case) of the iterator
497 497
    Node baseNode(const OutArcIt &e) const {
498 498
      return Parent::source(static_cast<const Arc&>(e));
... ...
@@ -529,76 +529,76 @@
529 529
    //
530 530
    // Returns the running node of the iterator
531 531
    Node runningNode(const IncEdgeIt &e) const {
532 532
      return e.direction ? v(e) : u(e);
533 533
    }
534 534

	
535 535

	
536 536
    template <typename _Value>
537
    class ArcMap 
537
    class ArcMap
538 538
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
539 539
      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
540 540

	
541 541
    public:
542
      explicit ArcMap(const Graph& _g) 
543
	: Parent(_g) {}
544
      ArcMap(const Graph& _g, const _Value& _v) 
545
	: Parent(_g, _v) {}
542
      explicit ArcMap(const Graph& _g)
543
        : Parent(_g) {}
544
      ArcMap(const Graph& _g, const _Value& _v)
545
        : Parent(_g, _v) {}
546 546

	
547 547
      ArcMap& operator=(const ArcMap& cmap) {
548
	return operator=<ArcMap>(cmap);
548
        return operator=<ArcMap>(cmap);
549 549
      }
550 550

	
551 551
      template <typename CMap>
552 552
      ArcMap& operator=(const CMap& cmap) {
553 553
        Parent::operator=(cmap);
554
	return *this;
554
        return *this;
555 555
      }
556 556

	
557 557
    };
558 558

	
559 559

	
560 560
    template <typename _Value>
561
    class EdgeMap 
561
    class EdgeMap
562 562
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
563 563
      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
564 564

	
565 565
    public:
566
      explicit EdgeMap(const Graph& _g) 
567
	: Parent(_g) {}
566
      explicit EdgeMap(const Graph& _g)
567
        : Parent(_g) {}
568 568

	
569
      EdgeMap(const Graph& _g, const _Value& _v) 
570
	: Parent(_g, _v) {}
569
      EdgeMap(const Graph& _g, const _Value& _v)
570
        : Parent(_g, _v) {}
571 571

	
572 572
      EdgeMap& operator=(const EdgeMap& cmap) {
573
	return operator=<EdgeMap>(cmap);
573
        return operator=<EdgeMap>(cmap);
574 574
      }
575 575

	
576 576
      template <typename CMap>
577 577
      EdgeMap& operator=(const CMap& cmap) {
578 578
        Parent::operator=(cmap);
579
	return *this;
579
        return *this;
580 580
      }
581 581

	
582 582
    };
583 583

	
584 584

	
585 585
    // Alteration extension
586 586

	
587 587
    Edge addEdge(const Node& from, const Node& to) {
588 588
      Edge edge = Parent::addEdge(from, to);
589 589
      notifier(Edge()).add(edge);
590 590
      std::vector<Arc> arcs;
591 591
      arcs.push_back(Parent::direct(edge, true));
592 592
      arcs.push_back(Parent::direct(edge, false));
593 593
      notifier(Arc()).add(arcs);
594 594
      return edge;
595 595
    }
596
    
596

	
597 597
    void clear() {
598 598
      notifier(Arc()).clear();
599 599
      notifier(Edge()).clear();
600 600
      Parent::clear();
601 601
    }
602 602

	
603 603
    void erase(const Edge& edge) {
604 604
      std::vector<Arc> arcs;
... ...
@@ -614,14 +614,14 @@
614 614
      arc_notifier.setContainer(*this);
615 615
      edge_notifier.setContainer(*this);
616 616
    }
617 617

	
618 618
    ~EdgeSetExtender() {
619 619
      edge_notifier.clear();
620 620
      arc_notifier.clear();
621 621
    }
622
    
622

	
623 623
  };
624 624

	
625 625
}
626 626

	
627 627
#endif
Ignore white space 16 line context
... ...
@@ -51,21 +51,21 @@
51 51
    int maxId(Node) const {
52 52
      return Parent::maxNodeId();
53 53
    }
54 54

	
55 55
    int maxId(Arc) const {
56 56
      return Parent::maxArcId();
57 57
    }
58 58

	
59
    Node fromId(int id, Node) const {
59
    static Node fromId(int id, Node) {
60 60
      return Parent::nodeFromId(id);
61 61
    }
62 62

	
63
    Arc fromId(int id, Arc) const {
63
    static Arc fromId(int id, Arc) {
64 64
      return Parent::arcFromId(id);
65 65
    }
66 66

	
67 67
    Node oppositeNode(const Node &node, const Arc &arc) const {
68 68
      if (node == Parent::source(arc))
69 69
        return Parent::target(arc);
70 70
      else if(node == Parent::target(arc))
71 71
        return Parent::source(arc);
... ...
@@ -350,25 +350,25 @@
350 350
    int maxId(Arc) const {
351 351
      return Parent::maxArcId();
352 352
    }
353 353

	
354 354
    int maxId(Edge) const {
355 355
      return Parent::maxEdgeId();
356 356
    }
357 357

	
358
    Node fromId(int id, Node) const {
358
    static Node fromId(int id, Node) {
359 359
      return Parent::nodeFromId(id);
360 360
    }
361 361

	
362
    Arc fromId(int id, Arc) const {
362
    static Arc fromId(int id, Arc) {
363 363
      return Parent::arcFromId(id);
364 364
    }
365 365

	
366
    Edge fromId(int id, Edge) const {
366
    static Edge fromId(int id, Edge) {
367 367
      return Parent::edgeFromId(id);
368 368
    }
369 369

	
370 370
    Node oppositeNode(const Node &n, const Edge &e) const {
371 371
      if( n == Parent::u(e))
372 372
        return Parent::v(e);
373 373
      else if( n == Parent::v(e))
374 374
        return Parent::u(e);
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
... ...
@@ -93,17 +93,17 @@
93 93

	
94 94
    std::string getWinFormattedDate()
95 95
    {
96 96
      std::ostringstream os;
97 97
#ifdef WIN32
98 98
      SYSTEMTIME time;
99 99
      GetSystemTime(&time);
100 100
      char buf1[11], buf2[9], buf3[5];
101
	  if (GetDateFormat(MY_LOCALE, 0, &time,
101
          if (GetDateFormat(MY_LOCALE, 0, &time,
102 102
                        ("ddd MMM dd"), buf1, 11) &&
103 103
          GetTimeFormat(MY_LOCALE, 0, &time,
104 104
                        ("HH':'mm':'ss"), buf2, 9) &&
105 105
          GetDateFormat(MY_LOCALE, 0, &time,
106 106
                        ("yyyy"), buf3, 5)) {
107 107
        os << buf1 << ' ' << buf2 << ' ' << buf3;
108 108
      }
109 109
      else os << "unknown";
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BUCKET_HEAP_H
20 20
#define LEMON_BUCKET_HEAP_H
21 21

	
22
///\ingroup auxdat
22
///\ingroup heaps
23 23
///\file
24
///\brief Bucket Heap implementation.
24
///\brief Bucket heap implementation.
25 25

	
26 26
#include <vector>
27 27
#include <utility>
28 28
#include <functional>
29 29

	
30 30
namespace lemon {
31 31

	
32 32
  namespace _bucket_heap_bits {
... ...
@@ -48,98 +48,106 @@
48 48
      }
49 49
      static void increase(int& value) {
50 50
        --value;
51 51
      }
52 52
    };
53 53

	
54 54
  }
55 55

	
56
  /// \ingroup auxdat
56
  /// \ingroup heaps
57 57
  ///
58
  /// \brief A Bucket Heap implementation.
58
  /// \brief Bucket heap data structure.
59 59
  ///
60
  /// This class implements the \e bucket \e heap data structure. A \e heap
61
  /// is a data structure for storing items with specified values called \e
62
  /// priorities in such a way that finding the item with minimum priority is
63
  /// efficient. The bucket heap is very simple implementation, it can store
64
  /// only integer priorities and it stores for each priority in the
65
  /// \f$ [0..C) \f$ range a list of items. So it should be used only when
66
  /// the priorities are small. It is not intended to use as dijkstra heap.
60
  /// This class implements the \e bucket \e heap data structure.
61
  /// It practically conforms to the \ref concepts::Heap "heap concept",
62
  /// but it has some limitations.
67 63
  ///
68
  /// \param IM A read and write Item int map, used internally
69
  /// to handle the cross references.
70
  /// \param MIN If the given parameter is false then instead of the
71
  /// minimum value the maximum can be retrivied with the top() and
72
  /// prio() member functions.
64
  /// The bucket heap is a very simple structure. It can store only
65
  /// \c int priorities and it maintains a list of items for each priority
66
  /// in the range <tt>[0..C)</tt>. So it should only be used when the
67
  /// priorities are small. It is not intended to use as a Dijkstra heap.
68
  ///
69
  /// \tparam IM A read-writable item map with \c int values, used
70
  /// internally to handle the cross references.
71
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
72
  /// The default is \e min-heap. If this parameter is set to \c false,
73
  /// then the comparison is reversed, so the top(), prio() and pop()
74
  /// functions deal with the item having maximum priority instead of the
75
  /// minimum.
76
  ///
77
  /// \sa SimpleBucketHeap
73 78
  template <typename IM, bool MIN = true>
74 79
  class BucketHeap {
75 80

	
76 81
  public:
77
    /// \e
78
    typedef typename IM::Key Item;
79
    /// \e
82

	
83
    /// Type of the item-int map.
84
    typedef IM ItemIntMap;
85
    /// Type of the priorities.
80 86
    typedef int Prio;
81
    /// \e
82
    typedef std::pair<Item, Prio> Pair;
83
    /// \e
84
    typedef IM ItemIntMap;
87
    /// Type of the items stored in the heap.
88
    typedef typename ItemIntMap::Key Item;
89
    /// Type of the item-priority pairs.
90
    typedef std::pair<Item,Prio> Pair;
85 91

	
86 92
  private:
87 93

	
88 94
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
89 95

	
90 96
  public:
91 97

	
92
    /// \brief Type to represent the items states.
98
    /// \brief Type to represent the states of the items.
93 99
    ///
94
    /// Each Item element have a state associated to it. It may be "in heap",
95
    /// "pre heap" or "post heap". The latter two are indifferent from the
100
    /// Each item has a state associated to it. It can be "in heap",
101
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
96 102
    /// heap's point of view, but may be useful to the user.
97 103
    ///
98 104
    /// The item-int map must be initialized in such way that it assigns
99 105
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
100 106
    enum State {
101 107
      IN_HEAP = 0,    ///< = 0.
102 108
      PRE_HEAP = -1,  ///< = -1.
103 109
      POST_HEAP = -2  ///< = -2.
104 110
    };
105 111

	
106 112
  public:
107
    /// \brief The constructor.
113

	
114
    /// \brief Constructor.
108 115
    ///
109
    /// The constructor.
110
    /// \param map should be given to the constructor, since it is used
111
    /// internally to handle the cross references. The value of the map
112
    /// should be PRE_HEAP (-1) for each element.
116
    /// Constructor.
117
    /// \param map A map that assigns \c int values to the items.
118
    /// It is used internally to handle the cross references.
119
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
113 120
    explicit BucketHeap(ItemIntMap &map) : _iim(map), _minimum(0) {}
114 121

	
115
    /// The number of items stored in the heap.
122
    /// \brief The number of items stored in the heap.
116 123
    ///
117
    /// \brief Returns the number of items stored in the heap.
124
    /// This function returns the number of items stored in the heap.
118 125
    int size() const { return _data.size(); }
119 126

	
120
    /// \brief Checks if the heap stores no items.
127
    /// \brief Check if the heap is empty.
121 128
    ///
122
    /// Returns \c true if and only if the heap stores no items.
129
    /// This function returns \c true if the heap is empty.
123 130
    bool empty() const { return _data.empty(); }
124 131

	
125
    /// \brief Make empty this heap.
132
    /// \brief Make the heap empty.
126 133
    ///
127
    /// Make empty this heap. It does not change the cross reference
128
    /// map.  If you want to reuse a heap what is not surely empty you
129
    /// should first clear the heap and after that you should set the
130
    /// cross reference map for each item to \c PRE_HEAP.
134
    /// This functon makes the heap empty.
135
    /// It does not change the cross reference map. If you want to reuse
136
    /// a heap that is not surely empty, you should first clear it and
137
    /// then you should set the cross reference map to \c PRE_HEAP
138
    /// for each item.
131 139
    void clear() {
132 140
      _data.clear(); _first.clear(); _minimum = 0;
133 141
    }
134 142

	
135 143
  private:
136 144

	
137
    void relocate_last(int idx) {
145
    void relocateLast(int idx) {
138 146
      if (idx + 1 < int(_data.size())) {
139 147
        _data[idx] = _data.back();
140 148
        if (_data[idx].prev != -1) {
141 149
          _data[_data[idx].prev].next = idx;
142 150
        } else {
143 151
          _first[_data[idx].value] = idx;
144 152
        }
145 153
        if (_data[idx].next != -1) {
... ...
@@ -169,166 +177,170 @@
169 177
      if (_data[idx].next != -1) {
170 178
        _data[_data[idx].next].prev = idx;
171 179
      }
172 180
      _first[_data[idx].value] = idx;
173 181
      _data[idx].prev = -1;
174 182
    }
175 183

	
176 184
  public:
185

	
177 186
    /// \brief Insert a pair of item and priority into the heap.
178 187
    ///
179
    /// Adds \c p.first to the heap with priority \c p.second.
188
    /// This function inserts \c p.first to the heap with priority
189
    /// \c p.second.
180 190
    /// \param p The pair to insert.
191
    /// \pre \c p.first must not be stored in the heap.
181 192
    void push(const Pair& p) {
182 193
      push(p.first, p.second);
183 194
    }
184 195

	
185 196
    /// \brief Insert an item into the heap with the given priority.
186 197
    ///
187
    /// Adds \c i to the heap with priority \c p.
198
    /// This function inserts the given item into the heap with the
199
    /// given priority.
188 200
    /// \param i The item to insert.
189 201
    /// \param p The priority of the item.
202
    /// \pre \e i must not be stored in the heap.
190 203
    void push(const Item &i, const Prio &p) {
191 204
      int idx = _data.size();
192 205
      _iim[i] = idx;
193 206
      _data.push_back(BucketItem(i, p));
194 207
      lace(idx);
195 208
      if (Direction::less(p, _minimum)) {
196 209
        _minimum = p;
197 210
      }
198 211
    }
199 212

	
200
    /// \brief Returns the item with minimum priority.
213
    /// \brief Return the item having minimum priority.
201 214
    ///
202
    /// This method returns the item with minimum priority.
203
    /// \pre The heap must be nonempty.
215
    /// This function returns the item having minimum priority.
216
    /// \pre The heap must be non-empty.
204 217
    Item top() const {
205 218
      while (_first[_minimum] == -1) {
206 219
        Direction::increase(_minimum);
207 220
      }
208 221
      return _data[_first[_minimum]].item;
209 222
    }
210 223

	
211
    /// \brief Returns the minimum priority.
224
    /// \brief The minimum priority.
212 225
    ///
213
    /// It returns the minimum priority.
214
    /// \pre The heap must be nonempty.
226
    /// This function returns the minimum priority.
227
    /// \pre The heap must be non-empty.
215 228
    Prio prio() const {
216 229
      while (_first[_minimum] == -1) {
217 230
        Direction::increase(_minimum);
218 231
      }
219 232
      return _minimum;
220 233
    }
221 234

	
222
    /// \brief Deletes the item with minimum priority.
235
    /// \brief Remove the item having minimum priority.
223 236
    ///
224
    /// This method deletes the item with minimum priority from the heap.
237
    /// This function removes the item having minimum priority.
225 238
    /// \pre The heap must be non-empty.
226 239
    void pop() {
227 240
      while (_first[_minimum] == -1) {
228 241
        Direction::increase(_minimum);
229 242
      }
230 243
      int idx = _first[_minimum];
231 244
      _iim[_data[idx].item] = -2;
232 245
      unlace(idx);
233
      relocate_last(idx);
246
      relocateLast(idx);
234 247
    }
235 248

	
236
    /// \brief Deletes \c i from the heap.
249
    /// \brief Remove the given item from the heap.
237 250
    ///
238
    /// This method deletes item \c i from the heap, if \c i was
239
    /// already stored in the heap.
240
    /// \param i The item to erase.
251
    /// This function removes the given item from the heap if it is
252
    /// already stored.
253
    /// \param i The item to delete.
254
    /// \pre \e i must be in the heap.
241 255
    void erase(const Item &i) {
242 256
      int idx = _iim[i];
243 257
      _iim[_data[idx].item] = -2;
244 258
      unlace(idx);
245
      relocate_last(idx);
259
      relocateLast(idx);
246 260
    }
247 261

	
248

	
249
    /// \brief Returns the priority of \c i.
262
    /// \brief The priority of the given item.
250 263
    ///
251
    /// This function returns the priority of item \c i.
252
    /// \pre \c i must be in the heap.
264
    /// This function returns the priority of the given item.
253 265
    /// \param i The item.
266
    /// \pre \e i must be in the heap.
254 267
    Prio operator[](const Item &i) const {
255 268
      int idx = _iim[i];
256 269
      return _data[idx].value;
257 270
    }
258 271

	
259
    /// \brief \c i gets to the heap with priority \c p independently
260
    /// if \c i was already there.
272
    /// \brief Set the priority of an item or insert it, if it is
273
    /// not stored in the heap.
261 274
    ///
262
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
263
    /// in the heap and sets the priority of \c i to \c p otherwise.
275
    /// This method sets the priority of the given item if it is
276
    /// already stored in the heap. Otherwise it inserts the given
277
    /// item into the heap with the given priority.
264 278
    /// \param i The item.
265 279
    /// \param p The priority.
266 280
    void set(const Item &i, const Prio &p) {
267 281
      int idx = _iim[i];
268 282
      if (idx < 0) {
269 283
        push(i, p);
270 284
      } else if (Direction::less(p, _data[idx].value)) {
271 285
        decrease(i, p);
272 286
      } else {
273 287
        increase(i, p);
274 288
      }
275 289
    }
276 290

	
277
    /// \brief Decreases the priority of \c i to \c p.
291
    /// \brief Decrease the priority of an item to the given value.
278 292
    ///
279
    /// This method decreases the priority of item \c i to \c p.
280
    /// \pre \c i must be stored in the heap with priority at least \c
281
    /// p relative to \c Compare.
293
    /// This function decreases the priority of an item to the given value.
282 294
    /// \param i The item.
283 295
    /// \param p The priority.
296
    /// \pre \e i must be stored in the heap with priority at least \e p.
284 297
    void decrease(const Item &i, const Prio &p) {
285 298
      int idx = _iim[i];
286 299
      unlace(idx);
287 300
      _data[idx].value = p;
288 301
      if (Direction::less(p, _minimum)) {
289 302
        _minimum = p;
290 303
      }
291 304
      lace(idx);
292 305
    }
293 306

	
294
    /// \brief Increases the priority of \c i to \c p.
307
    /// \brief Increase the priority of an item to the given value.
295 308
    ///
296
    /// This method sets the priority of item \c i to \c p.
297
    /// \pre \c i must be stored in the heap with priority at most \c
298
    /// p relative to \c Compare.
309
    /// This function increases the priority of an item to the given value.
299 310
    /// \param i The item.
300 311
    /// \param p The priority.
312
    /// \pre \e i must be stored in the heap with priority at most \e p.
301 313
    void increase(const Item &i, const Prio &p) {
302 314
      int idx = _iim[i];
303 315
      unlace(idx);
304 316
      _data[idx].value = p;
305 317
      lace(idx);
306 318
    }
307 319

	
308
    /// \brief Returns if \c item is in, has already been in, or has
309
    /// never been in the heap.
320
    /// \brief Return the state of an item.
310 321
    ///
311
    /// This method returns PRE_HEAP if \c item has never been in the
312
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
313
    /// otherwise. In the latter case it is possible that \c item will
314
    /// get back to the heap again.
322
    /// This method returns \c PRE_HEAP if the given item has never
323
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
324
    /// and \c POST_HEAP otherwise.
325
    /// In the latter case it is possible that the item will get back
326
    /// to the heap again.
315 327
    /// \param i The item.
316 328
    State state(const Item &i) const {
317 329
      int idx = _iim[i];
318 330
      if (idx >= 0) idx = 0;
319 331
      return State(idx);
320 332
    }
321 333

	
322
    /// \brief Sets the state of the \c item in the heap.
334
    /// \brief Set the state of an item in the heap.
323 335
    ///
324
    /// Sets the state of the \c item in the heap. It can be used to
325
    /// manually clear the heap when it is important to achive the
326
    /// better time complexity.
336
    /// This function sets the state of the given item in the heap.
337
    /// It can be used to manually clear the heap when it is important
338
    /// to achive better time complexity.
327 339
    /// \param i The item.
328 340
    /// \param st The state. It should not be \c IN_HEAP.
329 341
    void state(const Item& i, State st) {
330 342
      switch (st) {
331 343
      case POST_HEAP:
332 344
      case PRE_HEAP:
333 345
        if (state(i) == IN_HEAP) {
334 346
          erase(i);
... ...
@@ -354,108 +366,124 @@
354 366

	
355 367
    ItemIntMap& _iim;
356 368
    std::vector<int> _first;
357 369
    std::vector<BucketItem> _data;
358 370
    mutable int _minimum;
359 371

	
360 372
  }; // class BucketHeap
361 373

	
362
  /// \ingroup auxdat
374
  /// \ingroup heaps
363 375
  ///
364
  /// \brief A Simplified Bucket Heap implementation.
376
  /// \brief Simplified bucket heap data structure.
365 377
  ///
366 378
  /// This class implements a simplified \e bucket \e heap data
367
  /// structure.  It does not provide some functionality but it faster
368
  /// and simplier data structure than the BucketHeap. The main
369
  /// difference is that the BucketHeap stores for every key a double
370
  /// linked list while this class stores just simple lists. In the
371
  /// other way it does not support erasing each elements just the
372
  /// minimal and it does not supports key increasing, decreasing.
379
  /// structure. It does not provide some functionality, but it is
380
  /// faster and simpler than BucketHeap. The main difference is
381
  /// that BucketHeap stores a doubly-linked list for each key while
382
  /// this class stores only simply-linked lists. It supports erasing
383
  /// only for the item having minimum priority and it does not support
384
  /// key increasing and decreasing.
373 385
  ///
374
  /// \param IM A read and write Item int map, used internally
375
  /// to handle the cross references.
376
  /// \param MIN If the given parameter is false then instead of the
377
  /// minimum value the maximum can be retrivied with the top() and
378
  /// prio() member functions.
386
  /// Note that this implementation does not conform to the
387
  /// \ref concepts::Heap "heap concept" due to the lack of some
388
  /// functionality.
389
  ///
390
  /// \tparam IM A read-writable item map with \c int values, used
391
  /// internally to handle the cross references.
392
  /// \tparam MIN Indicate if the heap is a \e min-heap or a \e max-heap.
393
  /// The default is \e min-heap. If this parameter is set to \c false,
394
  /// then the comparison is reversed, so the top(), prio() and pop()
395
  /// functions deal with the item having maximum priority instead of the
396
  /// minimum.
379 397
  ///
380 398
  /// \sa BucketHeap
381 399
  template <typename IM, bool MIN = true >
382 400
  class SimpleBucketHeap {
383 401

	
384 402
  public:
385
    typedef typename IM::Key Item;
403

	
404
    /// Type of the item-int map.
405
    typedef IM ItemIntMap;
406
    /// Type of the priorities.
386 407
    typedef int Prio;
387
    typedef std::pair<Item, Prio> Pair;
388
    typedef IM ItemIntMap;
408
    /// Type of the items stored in the heap.
409
    typedef typename ItemIntMap::Key Item;
410
    /// Type of the item-priority pairs.
411
    typedef std::pair<Item,Prio> Pair;
389 412

	
390 413
  private:
391 414

	
392 415
    typedef _bucket_heap_bits::DirectionTraits<MIN> Direction;
393 416

	
394 417
  public:
395 418

	
396
    /// \brief Type to represent the items states.
419
    /// \brief Type to represent the states of the items.
397 420
    ///
398
    /// Each Item element have a state associated to it. It may be "in heap",
399
    /// "pre heap" or "post heap". The latter two are indifferent from the
421
    /// Each item has a state associated to it. It can be "in heap",
422
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
400 423
    /// heap's point of view, but may be useful to the user.
401 424
    ///
402 425
    /// The item-int map must be initialized in such way that it assigns
403 426
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
404 427
    enum State {
405 428
      IN_HEAP = 0,    ///< = 0.
406 429
      PRE_HEAP = -1,  ///< = -1.
407 430
      POST_HEAP = -2  ///< = -2.
408 431
    };
409 432

	
410 433
  public:
411 434

	
412
    /// \brief The constructor.
435
    /// \brief Constructor.
413 436
    ///
414
    /// The constructor.
415
    /// \param map should be given to the constructor, since it is used
416
    /// internally to handle the cross references. The value of the map
417
    /// should be PRE_HEAP (-1) for each element.
437
    /// Constructor.
438
    /// \param map A map that assigns \c int values to the items.
439
    /// It is used internally to handle the cross references.
440
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
418 441
    explicit SimpleBucketHeap(ItemIntMap &map)
419 442
      : _iim(map), _free(-1), _num(0), _minimum(0) {}
420 443

	
421
    /// \brief Returns the number of items stored in the heap.
444
    /// \brief The number of items stored in the heap.
422 445
    ///
423
    /// The number of items stored in the heap.
446
    /// This function returns the number of items stored in the heap.
424 447
    int size() const { return _num; }
425 448

	
426
    /// \brief Checks if the heap stores no items.
449
    /// \brief Check if the heap is empty.
427 450
    ///
428
    /// Returns \c true if and only if the heap stores no items.
451
    /// This function returns \c true if the heap is empty.
429 452
    bool empty() const { return _num == 0; }
430 453

	
431
    /// \brief Make empty this heap.
454
    /// \brief Make the heap empty.
432 455
    ///
433
    /// Make empty this heap. It does not change the cross reference
434
    /// map.  If you want to reuse a heap what is not surely empty you
435
    /// should first clear the heap and after that you should set the
436
    /// cross reference map for each item to \c PRE_HEAP.
456
    /// This functon makes the heap empty.
457
    /// It does not change the cross reference map. If you want to reuse
458
    /// a heap that is not surely empty, you should first clear it and
459
    /// then you should set the cross reference map to \c PRE_HEAP
460
    /// for each item.
437 461
    void clear() {
438 462
      _data.clear(); _first.clear(); _free = -1; _num = 0; _minimum = 0;
439 463
    }
440 464

	
441 465
    /// \brief Insert a pair of item and priority into the heap.
442 466
    ///
443
    /// Adds \c p.first to the heap with priority \c p.second.
467
    /// This function inserts \c p.first to the heap with priority
468
    /// \c p.second.
444 469
    /// \param p The pair to insert.
470
    /// \pre \c p.first must not be stored in the heap.
445 471
    void push(const Pair& p) {
446 472
      push(p.first, p.second);
447 473
    }
448 474

	
449 475
    /// \brief Insert an item into the heap with the given priority.
450 476
    ///
451
    /// Adds \c i to the heap with priority \c p.
477
    /// This function inserts the given item into the heap with the
478
    /// given priority.
452 479
    /// \param i The item to insert.
453 480
    /// \param p The priority of the item.
481
    /// \pre \e i must not be stored in the heap.
454 482
    void push(const Item &i, const Prio &p) {
455 483
      int idx;
456 484
      if (_free == -1) {
457 485
        idx = _data.size();
458 486
        _data.push_back(BucketItem(i));
459 487
      } else {
460 488
        idx = _free;
461 489
        _free = _data[idx].next;
... ...
@@ -466,82 +494,81 @@
466 494
      _data[idx].next = _first[p];
467 495
      _first[p] = idx;
468 496
      if (Direction::less(p, _minimum)) {
469 497
        _minimum = p;
470 498
      }
471 499
      ++_num;
472 500
    }
473 501

	
474
    /// \brief Returns the item with minimum priority.
502
    /// \brief Return the item having minimum priority.
475 503
    ///
476
    /// This method returns the item with minimum priority.
477
    /// \pre The heap must be nonempty.
504
    /// This function returns the item having minimum priority.
505
    /// \pre The heap must be non-empty.
478 506
    Item top() const {
479 507
      while (_first[_minimum] == -1) {
480 508
        Direction::increase(_minimum);
481 509
      }
482 510
      return _data[_first[_minimum]].item;
483 511
    }
484 512

	
485
    /// \brief Returns the minimum priority.
513
    /// \brief The minimum priority.
486 514
    ///
487
    /// It returns the minimum priority.
488
    /// \pre The heap must be nonempty.
515
    /// This function returns the minimum priority.
516
    /// \pre The heap must be non-empty.
489 517
    Prio prio() const {
490 518
      while (_first[_minimum] == -1) {
491 519
        Direction::increase(_minimum);
492 520
      }
493 521
      return _minimum;
494 522
    }
495 523

	
496
    /// \brief Deletes the item with minimum priority.
524
    /// \brief Remove the item having minimum priority.
497 525
    ///
498
    /// This method deletes the item with minimum priority from the heap.
526
    /// This function removes the item having minimum priority.
499 527
    /// \pre The heap must be non-empty.
500 528
    void pop() {
501 529
      while (_first[_minimum] == -1) {
502 530
        Direction::increase(_minimum);
503 531
      }
504 532
      int idx = _first[_minimum];
505 533
      _iim[_data[idx].item] = -2;
506 534
      _first[_minimum] = _data[idx].next;
507 535
      _data[idx].next = _free;
508 536
      _free = idx;
509 537
      --_num;
510 538
    }
511 539

	
512
    /// \brief Returns the priority of \c i.
540
    /// \brief The priority of the given item.
513 541
    ///
514
    /// This function returns the priority of item \c i.
515
    /// \warning This operator is not a constant time function
516
    /// because it scans the whole data structure to find the proper
517
    /// value.
518
    /// \pre \c i must be in the heap.
542
    /// This function returns the priority of the given item.
519 543
    /// \param i The item.
544
    /// \pre \e i must be in the heap.
545
    /// \warning This operator is not a constant time function because
546
    /// it scans the whole data structure to find the proper value.
520 547
    Prio operator[](const Item &i) const {
521
      for (int k = 0; k < _first.size(); ++k) {
548
      for (int k = 0; k < int(_first.size()); ++k) {
522 549
        int idx = _first[k];
523 550
        while (idx != -1) {
524 551
          if (_data[idx].item == i) {
525 552
            return k;
526 553
          }
527 554
          idx = _data[idx].next;
528 555
        }
529 556
      }
530 557
      return -1;
531 558
    }
532 559

	
533
    /// \brief Returns if \c item is in, has already been in, or has
534
    /// never been in the heap.
560
    /// \brief Return the state of an item.
535 561
    ///
536
    /// This method returns PRE_HEAP if \c item has never been in the
537
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
538
    /// otherwise. In the latter case it is possible that \c item will
539
    /// get back to the heap again.
562
    /// This method returns \c PRE_HEAP if the given item has never
563
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
564
    /// and \c POST_HEAP otherwise.
565
    /// In the latter case it is possible that the item will get back
566
    /// to the heap again.
540 567
    /// \param i The item.
541 568
    State state(const Item &i) const {
542 569
      int idx = _iim[i];
543 570
      if (idx >= 0) idx = 0;
544 571
      return State(idx);
545 572
    }
546 573

	
547 574
  private:

Changeset was too big and was cut off... Show full diff

0 comments (0 inline)