↑ 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
}
Show 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
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_CAPACITY_SCALING_H
20
#define LEMON_CAPACITY_SCALING_H
21

	
22
/// \ingroup min_cost_flow_algs
23
///
24
/// \file
25
/// \brief Capacity Scaling algorithm for finding a minimum cost flow.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/bin_heap.h>
31

	
32
namespace lemon {
33

	
34
  /// \brief Default traits class of CapacityScaling algorithm.
35
  ///
36
  /// Default traits class of CapacityScaling algorithm.
37
  /// \tparam GR Digraph type.
38
  /// \tparam V The number type used for flow amounts, capacity bounds
39
  /// and supply values. By default it is \c int.
40
  /// \tparam C The number type used for costs and potentials.
41
  /// By default it is the same as \c V.
42
  template <typename GR, typename V = int, typename C = V>
43
  struct CapacityScalingDefaultTraits
44
  {
45
    /// The type of the digraph
46
    typedef GR Digraph;
47
    /// The type of the flow amounts, capacity bounds and supply values
48
    typedef V Value;
49
    /// The type of the arc costs
50
    typedef C Cost;
51

	
52
    /// \brief The type of the heap used for internal Dijkstra computations.
53
    ///
54
    /// The type of the heap used for internal Dijkstra computations.
55
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
56
    /// its priority type must be \c Cost and its cross reference type
57
    /// must be \ref RangeMap "RangeMap<int>".
58
    typedef BinHeap<Cost, RangeMap<int> > Heap;
59
  };
60

	
61
  /// \addtogroup min_cost_flow_algs
62
  /// @{
63

	
64
  /// \brief Implementation of the Capacity Scaling algorithm for
65
  /// finding a \ref min_cost_flow "minimum cost flow".
66
  ///
67
  /// \ref CapacityScaling implements the capacity scaling version
68
  /// of the successive shortest path algorithm for finding a
69
  /// \ref min_cost_flow "minimum cost flow" \ref amo93networkflows,
70
  /// \ref edmondskarp72theoretical. It is an efficient dual
71
  /// solution method.
72
  ///
73
  /// Most of the parameters of the problem (except for the digraph)
74
  /// can be given using separate functions, and the algorithm can be
75
  /// executed using the \ref run() function. If some parameters are not
76
  /// specified, then default values will be used.
77
  ///
78
  /// \tparam GR The digraph type the algorithm runs on.
79
  /// \tparam V The number type used for flow amounts, capacity bounds
80
  /// and supply values in the algorithm. By default, it is \c int.
81
  /// \tparam C The number type used for costs and potentials in the
82
  /// algorithm. By default, it is the same as \c V.
83
  /// \tparam TR The traits class that defines various types used by the
84
  /// algorithm. By default, it is \ref CapacityScalingDefaultTraits
85
  /// "CapacityScalingDefaultTraits<GR, V, C>".
86
  /// In most cases, this parameter should not be set directly,
87
  /// consider to use the named template parameters instead.
88
  ///
89
  /// \warning Both number types must be signed and all input data must
90
  /// be integer.
91
  /// \warning This algorithm does not support negative costs for such
92
  /// arcs that have infinite upper bound.
93
#ifdef DOXYGEN
94
  template <typename GR, typename V, typename C, typename TR>
95
#else
96
  template < typename GR, typename V = int, typename C = V,
97
             typename TR = CapacityScalingDefaultTraits<GR, V, C> >
98
#endif
99
  class CapacityScaling
100
  {
101
  public:
102

	
103
    /// The type of the digraph
104
    typedef typename TR::Digraph Digraph;
105
    /// The type of the flow amounts, capacity bounds and supply values
106
    typedef typename TR::Value Value;
107
    /// The type of the arc costs
108
    typedef typename TR::Cost Cost;
109

	
110
    /// The type of the heap used for internal Dijkstra computations
111
    typedef typename TR::Heap Heap;
112

	
113
    /// The \ref CapacityScalingDefaultTraits "traits class" of the algorithm
114
    typedef TR Traits;
115

	
116
  public:
117

	
118
    /// \brief Problem type constants for the \c run() function.
119
    ///
120
    /// Enum type containing the problem type constants that can be
121
    /// returned by the \ref run() function of the algorithm.
122
    enum ProblemType {
123
      /// The problem has no feasible solution (flow).
124
      INFEASIBLE,
125
      /// The problem has optimal solution (i.e. it is feasible and
126
      /// bounded), and the algorithm has found optimal flow and node
127
      /// potentials (primal and dual solutions).
128
      OPTIMAL,
129
      /// The digraph contains an arc of negative cost and infinite
130
      /// upper bound. It means that the objective function is unbounded
131
      /// on that arc, however, note that it could actually be bounded
132
      /// over the feasible flows, but this algroithm cannot handle
133
      /// these cases.
134
      UNBOUNDED
135
    };
136

	
137
  private:
138

	
139
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
140

	
141
    typedef std::vector<int> IntVector;
142
    typedef std::vector<Value> ValueVector;
143
    typedef std::vector<Cost> CostVector;
144
    typedef std::vector<char> BoolVector;
145
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
146

	
147
  private:
148

	
149
    // Data related to the underlying digraph
150
    const GR &_graph;
151
    int _node_num;
152
    int _arc_num;
153
    int _res_arc_num;
154
    int _root;
155

	
156
    // Parameters of the problem
157
    bool _have_lower;
158
    Value _sum_supply;
159

	
160
    // Data structures for storing the digraph
161
    IntNodeMap _node_id;
162
    IntArcMap _arc_idf;
163
    IntArcMap _arc_idb;
164
    IntVector _first_out;
165
    BoolVector _forward;
166
    IntVector _source;
167
    IntVector _target;
168
    IntVector _reverse;
169

	
170
    // Node and arc data
171
    ValueVector _lower;
172
    ValueVector _upper;
173
    CostVector _cost;
174
    ValueVector _supply;
175

	
176
    ValueVector _res_cap;
177
    CostVector _pi;
178
    ValueVector _excess;
179
    IntVector _excess_nodes;
180
    IntVector _deficit_nodes;
181

	
182
    Value _delta;
183
    int _factor;
184
    IntVector _pred;
185

	
186
  public:
187

	
188
    /// \brief Constant for infinite upper bounds (capacities).
189
    ///
190
    /// Constant for infinite upper bounds (capacities).
191
    /// It is \c std::numeric_limits<Value>::infinity() if available,
192
    /// \c std::numeric_limits<Value>::max() otherwise.
193
    const Value INF;
194

	
195
  private:
196

	
197
    // Special implementation of the Dijkstra algorithm for finding
198
    // shortest paths in the residual network of the digraph with
199
    // respect to the reduced arc costs and modifying the node
200
    // potentials according to the found distance labels.
201
    class ResidualDijkstra
202
    {
203
    private:
204

	
205
      int _node_num;
206
      bool _geq;
207
      const IntVector &_first_out;
208
      const IntVector &_target;
209
      const CostVector &_cost;
210
      const ValueVector &_res_cap;
211
      const ValueVector &_excess;
212
      CostVector &_pi;
213
      IntVector &_pred;
214

	
215
      IntVector _proc_nodes;
216
      CostVector _dist;
217

	
218
    public:
219

	
220
      ResidualDijkstra(CapacityScaling& cs) :
221
        _node_num(cs._node_num), _geq(cs._sum_supply < 0),
222
        _first_out(cs._first_out), _target(cs._target), _cost(cs._cost),
223
        _res_cap(cs._res_cap), _excess(cs._excess), _pi(cs._pi),
224
        _pred(cs._pred), _dist(cs._node_num)
225
      {}
226

	
227
      int run(int s, Value delta = 1) {
228
        RangeMap<int> heap_cross_ref(_node_num, Heap::PRE_HEAP);
229
        Heap heap(heap_cross_ref);
230
        heap.push(s, 0);
231
        _pred[s] = -1;
232
        _proc_nodes.clear();
233

	
234
        // Process nodes
235
        while (!heap.empty() && _excess[heap.top()] > -delta) {
236
          int u = heap.top(), v;
237
          Cost d = heap.prio() + _pi[u], dn;
238
          _dist[u] = heap.prio();
239
          _proc_nodes.push_back(u);
240
          heap.pop();
241

	
242
          // Traverse outgoing residual arcs
243
          int last_out = _geq ? _first_out[u+1] : _first_out[u+1] - 1;
244
          for (int a = _first_out[u]; a != last_out; ++a) {
245
            if (_res_cap[a] < delta) continue;
246
            v = _target[a];
247
            switch (heap.state(v)) {
248
              case Heap::PRE_HEAP:
249
                heap.push(v, d + _cost[a] - _pi[v]);
250
                _pred[v] = a;
251
                break;
252
              case Heap::IN_HEAP:
253
                dn = d + _cost[a] - _pi[v];
254
                if (dn < heap[v]) {
255
                  heap.decrease(v, dn);
256
                  _pred[v] = a;
257
                }
258
                break;
259
              case Heap::POST_HEAP:
260
                break;
261
            }
262
          }
263
        }
264
        if (heap.empty()) return -1;
265

	
266
        // Update potentials of processed nodes
267
        int t = heap.top();
268
        Cost dt = heap.prio();
269
        for (int i = 0; i < int(_proc_nodes.size()); ++i) {
270
          _pi[_proc_nodes[i]] += _dist[_proc_nodes[i]] - dt;
271
        }
272

	
273
        return t;
274
      }
275

	
276
    }; //class ResidualDijkstra
277

	
278
  public:
279

	
280
    /// \name Named Template Parameters
281
    /// @{
282

	
283
    template <typename T>
284
    struct SetHeapTraits : public Traits {
285
      typedef T Heap;
286
    };
287

	
288
    /// \brief \ref named-templ-param "Named parameter" for setting
289
    /// \c Heap type.
290
    ///
291
    /// \ref named-templ-param "Named parameter" for setting \c Heap
292
    /// type, which is used for internal Dijkstra computations.
293
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept,
294
    /// its priority type must be \c Cost and its cross reference type
295
    /// must be \ref RangeMap "RangeMap<int>".
296
    template <typename T>
297
    struct SetHeap
298
      : public CapacityScaling<GR, V, C, SetHeapTraits<T> > {
299
      typedef  CapacityScaling<GR, V, C, SetHeapTraits<T> > Create;
300
    };
301

	
302
    /// @}
303

	
304
  protected:
305

	
306
    CapacityScaling() {}
307

	
308
  public:
309

	
310
    /// \brief Constructor.
311
    ///
312
    /// The constructor of the class.
313
    ///
314
    /// \param graph The digraph the algorithm runs on.
315
    CapacityScaling(const GR& graph) :
316
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
317
      INF(std::numeric_limits<Value>::has_infinity ?
318
          std::numeric_limits<Value>::infinity() :
319
          std::numeric_limits<Value>::max())
320
    {
321
      // Check the number types
322
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
323
        "The flow type of CapacityScaling must be signed");
324
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
325
        "The cost type of CapacityScaling must be signed");
326

	
327
      // Reset data structures
328
      reset();
329
    }
330

	
331
    /// \name Parameters
332
    /// The parameters of the algorithm can be specified using these
333
    /// functions.
334

	
335
    /// @{
336

	
337
    /// \brief Set the lower bounds on the arcs.
338
    ///
339
    /// This function sets the lower bounds on the arcs.
340
    /// If it is not used before calling \ref run(), the lower bounds
341
    /// will be set to zero on all arcs.
342
    ///
343
    /// \param map An arc map storing the lower bounds.
344
    /// Its \c Value type must be convertible to the \c Value type
345
    /// of the algorithm.
346
    ///
347
    /// \return <tt>(*this)</tt>
348
    template <typename LowerMap>
349
    CapacityScaling& lowerMap(const LowerMap& map) {
350
      _have_lower = true;
351
      for (ArcIt a(_graph); a != INVALID; ++a) {
352
        _lower[_arc_idf[a]] = map[a];
353
        _lower[_arc_idb[a]] = map[a];
354
      }
355
      return *this;
356
    }
357

	
358
    /// \brief Set the upper bounds (capacities) on the arcs.
359
    ///
360
    /// This function sets the upper bounds (capacities) on the arcs.
361
    /// If it is not used before calling \ref run(), the upper bounds
362
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
363
    /// unbounded from above).
364
    ///
365
    /// \param map An arc map storing the upper bounds.
366
    /// Its \c Value type must be convertible to the \c Value type
367
    /// of the algorithm.
368
    ///
369
    /// \return <tt>(*this)</tt>
370
    template<typename UpperMap>
371
    CapacityScaling& upperMap(const UpperMap& map) {
372
      for (ArcIt a(_graph); a != INVALID; ++a) {
373
        _upper[_arc_idf[a]] = map[a];
374
      }
375
      return *this;
376
    }
377

	
378
    /// \brief Set the costs of the arcs.
379
    ///
380
    /// This function sets the costs of the arcs.
381
    /// If it is not used before calling \ref run(), the costs
382
    /// will be set to \c 1 on all arcs.
383
    ///
384
    /// \param map An arc map storing the costs.
385
    /// Its \c Value type must be convertible to the \c Cost type
386
    /// of the algorithm.
387
    ///
388
    /// \return <tt>(*this)</tt>
389
    template<typename CostMap>
390
    CapacityScaling& costMap(const CostMap& map) {
391
      for (ArcIt a(_graph); a != INVALID; ++a) {
392
        _cost[_arc_idf[a]] =  map[a];
393
        _cost[_arc_idb[a]] = -map[a];
394
      }
395
      return *this;
396
    }
397

	
398
    /// \brief Set the supply values of the nodes.
399
    ///
400
    /// This function sets the supply values of the nodes.
401
    /// If neither this function nor \ref stSupply() is used before
402
    /// calling \ref run(), the supply of each node will be set to zero.
403
    ///
404
    /// \param map A node map storing the supply values.
405
    /// Its \c Value type must be convertible to the \c Value type
406
    /// of the algorithm.
407
    ///
408
    /// \return <tt>(*this)</tt>
409
    template<typename SupplyMap>
410
    CapacityScaling& supplyMap(const SupplyMap& map) {
411
      for (NodeIt n(_graph); n != INVALID; ++n) {
412
        _supply[_node_id[n]] = map[n];
413
      }
414
      return *this;
415
    }
416

	
417
    /// \brief Set single source and target nodes and a supply value.
418
    ///
419
    /// This function sets a single source node and a single target node
420
    /// and the required flow value.
421
    /// If neither this function nor \ref supplyMap() is used before
422
    /// calling \ref run(), the supply of each node will be set to zero.
423
    ///
424
    /// Using this function has the same effect as using \ref supplyMap()
425
    /// with such a map in which \c k is assigned to \c s, \c -k is
426
    /// assigned to \c t and all other nodes have zero supply value.
427
    ///
428
    /// \param s The source node.
429
    /// \param t The target node.
430
    /// \param k The required amount of flow from node \c s to node \c t
431
    /// (i.e. the supply of \c s and the demand of \c t).
432
    ///
433
    /// \return <tt>(*this)</tt>
434
    CapacityScaling& stSupply(const Node& s, const Node& t, Value k) {
435
      for (int i = 0; i != _node_num; ++i) {
436
        _supply[i] = 0;
437
      }
438
      _supply[_node_id[s]] =  k;
439
      _supply[_node_id[t]] = -k;
440
      return *this;
441
    }
442

	
443
    /// @}
444

	
445
    /// \name Execution control
446
    /// The algorithm can be executed using \ref run().
447

	
448
    /// @{
449

	
450
    /// \brief Run the algorithm.
451
    ///
452
    /// This function runs the algorithm.
453
    /// The paramters can be specified using functions \ref lowerMap(),
454
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
455
    /// For example,
456
    /// \code
457
    ///   CapacityScaling<ListDigraph> cs(graph);
458
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
459
    ///     .supplyMap(sup).run();
460
    /// \endcode
461
    ///
462
    /// This function can be called more than once. All the given parameters
463
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
464
    /// is used, thus only the modified parameters have to be set again.
465
    /// If the underlying digraph was also modified after the construction
466
    /// of the class (or the last \ref reset() call), then the \ref reset()
467
    /// function must be called.
468
    ///
469
    /// \param factor The capacity scaling factor. It must be larger than
470
    /// one to use scaling. If it is less or equal to one, then scaling
471
    /// will be disabled.
472
    ///
473
    /// \return \c INFEASIBLE if no feasible flow exists,
474
    /// \n \c OPTIMAL if the problem has optimal solution
475
    /// (i.e. it is feasible and bounded), and the algorithm has found
476
    /// optimal flow and node potentials (primal and dual solutions),
477
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
478
    /// and infinite upper bound. It means that the objective function
479
    /// is unbounded on that arc, however, note that it could actually be
480
    /// bounded over the feasible flows, but this algroithm cannot handle
481
    /// these cases.
482
    ///
483
    /// \see ProblemType
484
    /// \see resetParams(), reset()
485
    ProblemType run(int factor = 4) {
486
      _factor = factor;
487
      ProblemType pt = init();
488
      if (pt != OPTIMAL) return pt;
489
      return start();
490
    }
491

	
492
    /// \brief Reset all the parameters that have been given before.
493
    ///
494
    /// This function resets all the paramaters that have been given
495
    /// before using functions \ref lowerMap(), \ref upperMap(),
496
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
497
    ///
498
    /// It is useful for multiple \ref run() calls. Basically, all the given
499
    /// parameters are kept for the next \ref run() call, unless
500
    /// \ref resetParams() or \ref reset() is used.
501
    /// If the underlying digraph was also modified after the construction
502
    /// of the class or the last \ref reset() call, then the \ref reset()
503
    /// function must be used, otherwise \ref resetParams() is sufficient.
504
    ///
505
    /// For example,
506
    /// \code
507
    ///   CapacityScaling<ListDigraph> cs(graph);
508
    ///
509
    ///   // First run
510
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
511
    ///     .supplyMap(sup).run();
512
    ///
513
    ///   // Run again with modified cost map (resetParams() is not called,
514
    ///   // so only the cost map have to be set again)
515
    ///   cost[e] += 100;
516
    ///   cs.costMap(cost).run();
517
    ///
518
    ///   // Run again from scratch using resetParams()
519
    ///   // (the lower bounds will be set to zero on all arcs)
520
    ///   cs.resetParams();
521
    ///   cs.upperMap(capacity).costMap(cost)
522
    ///     .supplyMap(sup).run();
523
    /// \endcode
524
    ///
525
    /// \return <tt>(*this)</tt>
526
    ///
527
    /// \see reset(), run()
528
    CapacityScaling& resetParams() {
529
      for (int i = 0; i != _node_num; ++i) {
530
        _supply[i] = 0;
531
      }
532
      for (int j = 0; j != _res_arc_num; ++j) {
533
        _lower[j] = 0;
534
        _upper[j] = INF;
535
        _cost[j] = _forward[j] ? 1 : -1;
536
      }
537
      _have_lower = false;
538
      return *this;
539
    }
540

	
541
    /// \brief Reset the internal data structures and all the parameters
542
    /// that have been given before.
543
    ///
544
    /// This function resets the internal data structures and all the
545
    /// paramaters that have been given before using functions \ref lowerMap(),
546
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
547
    ///
548
    /// It is useful for multiple \ref run() calls. Basically, all the given
549
    /// parameters are kept for the next \ref run() call, unless
550
    /// \ref resetParams() or \ref reset() is used.
551
    /// If the underlying digraph was also modified after the construction
552
    /// of the class or the last \ref reset() call, then the \ref reset()
553
    /// function must be used, otherwise \ref resetParams() is sufficient.
554
    ///
555
    /// See \ref resetParams() for examples.
556
    ///
557
    /// \return <tt>(*this)</tt>
558
    ///
559
    /// \see resetParams(), run()
560
    CapacityScaling& reset() {
561
      // Resize vectors
562
      _node_num = countNodes(_graph);
563
      _arc_num = countArcs(_graph);
564
      _res_arc_num = 2 * (_arc_num + _node_num);
565
      _root = _node_num;
566
      ++_node_num;
567

	
568
      _first_out.resize(_node_num + 1);
569
      _forward.resize(_res_arc_num);
570
      _source.resize(_res_arc_num);
571
      _target.resize(_res_arc_num);
572
      _reverse.resize(_res_arc_num);
573

	
574
      _lower.resize(_res_arc_num);
575
      _upper.resize(_res_arc_num);
576
      _cost.resize(_res_arc_num);
577
      _supply.resize(_node_num);
578

	
579
      _res_cap.resize(_res_arc_num);
580
      _pi.resize(_node_num);
581
      _excess.resize(_node_num);
582
      _pred.resize(_node_num);
583

	
584
      // Copy the graph
585
      int i = 0, j = 0, k = 2 * _arc_num + _node_num - 1;
586
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
587
        _node_id[n] = i;
588
      }
589
      i = 0;
590
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
591
        _first_out[i] = j;
592
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
593
          _arc_idf[a] = j;
594
          _forward[j] = true;
595
          _source[j] = i;
596
          _target[j] = _node_id[_graph.runningNode(a)];
597
        }
598
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
599
          _arc_idb[a] = j;
600
          _forward[j] = false;
601
          _source[j] = i;
602
          _target[j] = _node_id[_graph.runningNode(a)];
603
        }
604
        _forward[j] = false;
605
        _source[j] = i;
606
        _target[j] = _root;
607
        _reverse[j] = k;
608
        _forward[k] = true;
609
        _source[k] = _root;
610
        _target[k] = i;
611
        _reverse[k] = j;
612
        ++j; ++k;
613
      }
614
      _first_out[i] = j;
615
      _first_out[_node_num] = k;
616
      for (ArcIt a(_graph); a != INVALID; ++a) {
617
        int fi = _arc_idf[a];
618
        int bi = _arc_idb[a];
619
        _reverse[fi] = bi;
620
        _reverse[bi] = fi;
621
      }
622

	
623
      // Reset parameters
624
      resetParams();
625
      return *this;
626
    }
627

	
628
    /// @}
629

	
630
    /// \name Query Functions
631
    /// The results of the algorithm can be obtained using these
632
    /// functions.\n
633
    /// The \ref run() function must be called before using them.
634

	
635
    /// @{
636

	
637
    /// \brief Return the total cost of the found flow.
638
    ///
639
    /// This function returns the total cost of the found flow.
640
    /// Its complexity is O(e).
641
    ///
642
    /// \note The return type of the function can be specified as a
643
    /// template parameter. For example,
644
    /// \code
645
    ///   cs.totalCost<double>();
646
    /// \endcode
647
    /// It is useful if the total cost cannot be stored in the \c Cost
648
    /// type of the algorithm, which is the default return type of the
649
    /// function.
650
    ///
651
    /// \pre \ref run() must be called before using this function.
652
    template <typename Number>
653
    Number totalCost() const {
654
      Number c = 0;
655
      for (ArcIt a(_graph); a != INVALID; ++a) {
656
        int i = _arc_idb[a];
657
        c += static_cast<Number>(_res_cap[i]) *
658
             (-static_cast<Number>(_cost[i]));
659
      }
660
      return c;
661
    }
662

	
663
#ifndef DOXYGEN
664
    Cost totalCost() const {
665
      return totalCost<Cost>();
666
    }
667
#endif
668

	
669
    /// \brief Return the flow on the given arc.
670
    ///
671
    /// This function returns the flow on the given arc.
672
    ///
673
    /// \pre \ref run() must be called before using this function.
674
    Value flow(const Arc& a) const {
675
      return _res_cap[_arc_idb[a]];
676
    }
677

	
678
    /// \brief Return the flow map (the primal solution).
679
    ///
680
    /// This function copies the flow value on each arc into the given
681
    /// map. The \c Value type of the algorithm must be convertible to
682
    /// the \c Value type of the map.
683
    ///
684
    /// \pre \ref run() must be called before using this function.
685
    template <typename FlowMap>
686
    void flowMap(FlowMap &map) const {
687
      for (ArcIt a(_graph); a != INVALID; ++a) {
688
        map.set(a, _res_cap[_arc_idb[a]]);
689
      }
690
    }
691

	
692
    /// \brief Return the potential (dual value) of the given node.
693
    ///
694
    /// This function returns the potential (dual value) of the
695
    /// given node.
696
    ///
697
    /// \pre \ref run() must be called before using this function.
698
    Cost potential(const Node& n) const {
699
      return _pi[_node_id[n]];
700
    }
701

	
702
    /// \brief Return the potential map (the dual solution).
703
    ///
704
    /// This function copies the potential (dual value) of each node
705
    /// into the given map.
706
    /// The \c Cost type of the algorithm must be convertible to the
707
    /// \c Value type of the map.
708
    ///
709
    /// \pre \ref run() must be called before using this function.
710
    template <typename PotentialMap>
711
    void potentialMap(PotentialMap &map) const {
712
      for (NodeIt n(_graph); n != INVALID; ++n) {
713
        map.set(n, _pi[_node_id[n]]);
714
      }
715
    }
716

	
717
    /// @}
718

	
719
  private:
720

	
721
    // Initialize the algorithm
722
    ProblemType init() {
723
      if (_node_num <= 1) return INFEASIBLE;
724

	
725
      // Check the sum of supply values
726
      _sum_supply = 0;
727
      for (int i = 0; i != _root; ++i) {
728
        _sum_supply += _supply[i];
729
      }
730
      if (_sum_supply > 0) return INFEASIBLE;
731

	
732
      // Initialize vectors
733
      for (int i = 0; i != _root; ++i) {
734
        _pi[i] = 0;
735
        _excess[i] = _supply[i];
736
      }
737

	
738
      // Remove non-zero lower bounds
739
      const Value MAX = std::numeric_limits<Value>::max();
740
      int last_out;
741
      if (_have_lower) {
742
        for (int i = 0; i != _root; ++i) {
743
          last_out = _first_out[i+1];
744
          for (int j = _first_out[i]; j != last_out; ++j) {
745
            if (_forward[j]) {
746
              Value c = _lower[j];
747
              if (c >= 0) {
748
                _res_cap[j] = _upper[j] < MAX ? _upper[j] - c : INF;
749
              } else {
750
                _res_cap[j] = _upper[j] < MAX + c ? _upper[j] - c : INF;
751
              }
752
              _excess[i] -= c;
753
              _excess[_target[j]] += c;
754
            } else {
755
              _res_cap[j] = 0;
756
            }
757
          }
758
        }
759
      } else {
760
        for (int j = 0; j != _res_arc_num; ++j) {
761
          _res_cap[j] = _forward[j] ? _upper[j] : 0;
762
        }
763
      }
764

	
765
      // Handle negative costs
766
      for (int i = 0; i != _root; ++i) {
767
        last_out = _first_out[i+1] - 1;
768
        for (int j = _first_out[i]; j != last_out; ++j) {
769
          Value rc = _res_cap[j];
770
          if (_cost[j] < 0 && rc > 0) {
771
            if (rc >= MAX) return UNBOUNDED;
772
            _excess[i] -= rc;
773
            _excess[_target[j]] += rc;
774
            _res_cap[j] = 0;
775
            _res_cap[_reverse[j]] += rc;
776
          }
777
        }
778
      }
779

	
780
      // Handle GEQ supply type
781
      if (_sum_supply < 0) {
782
        _pi[_root] = 0;
783
        _excess[_root] = -_sum_supply;
784
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
785
          int ra = _reverse[a];
786
          _res_cap[a] = -_sum_supply + 1;
787
          _res_cap[ra] = 0;
788
          _cost[a] = 0;
789
          _cost[ra] = 0;
790
        }
791
      } else {
792
        _pi[_root] = 0;
793
        _excess[_root] = 0;
794
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
795
          int ra = _reverse[a];
796
          _res_cap[a] = 1;
797
          _res_cap[ra] = 0;
798
          _cost[a] = 0;
799
          _cost[ra] = 0;
800
        }
801
      }
802

	
803
      // Initialize delta value
804
      if (_factor > 1) {
805
        // With scaling
806
        Value max_sup = 0, max_dem = 0, max_cap = 0;
807
        for (int i = 0; i != _root; ++i) {
808
          Value ex = _excess[i];
809
          if ( ex > max_sup) max_sup =  ex;
810
          if (-ex > max_dem) max_dem = -ex;
811
          int last_out = _first_out[i+1] - 1;
812
          for (int j = _first_out[i]; j != last_out; ++j) {
813
            if (_res_cap[j] > max_cap) max_cap = _res_cap[j];
814
          }
815
        }
816
        max_sup = std::min(std::min(max_sup, max_dem), max_cap);
817
        for (_delta = 1; 2 * _delta <= max_sup; _delta *= 2) ;
818
      } else {
819
        // Without scaling
820
        _delta = 1;
821
      }
822

	
823
      return OPTIMAL;
824
    }
825

	
826
    ProblemType start() {
827
      // Execute the algorithm
828
      ProblemType pt;
829
      if (_delta > 1)
830
        pt = startWithScaling();
831
      else
832
        pt = startWithoutScaling();
833

	
834
      // Handle non-zero lower bounds
835
      if (_have_lower) {
836
        int limit = _first_out[_root];
837
        for (int j = 0; j != limit; ++j) {
838
          if (!_forward[j]) _res_cap[j] += _lower[j];
839
        }
840
      }
841

	
842
      // Shift potentials if necessary
843
      Cost pr = _pi[_root];
844
      if (_sum_supply < 0 || pr > 0) {
845
        for (int i = 0; i != _node_num; ++i) {
846
          _pi[i] -= pr;
847
        }
848
      }
849

	
850
      return pt;
851
    }
852

	
853
    // Execute the capacity scaling algorithm
854
    ProblemType startWithScaling() {
855
      // Perform capacity scaling phases
856
      int s, t;
857
      ResidualDijkstra _dijkstra(*this);
858
      while (true) {
859
        // Saturate all arcs not satisfying the optimality condition
860
        int last_out;
861
        for (int u = 0; u != _node_num; ++u) {
862
          last_out = _sum_supply < 0 ?
863
            _first_out[u+1] : _first_out[u+1] - 1;
864
          for (int a = _first_out[u]; a != last_out; ++a) {
865
            int v = _target[a];
866
            Cost c = _cost[a] + _pi[u] - _pi[v];
867
            Value rc = _res_cap[a];
868
            if (c < 0 && rc >= _delta) {
869
              _excess[u] -= rc;
870
              _excess[v] += rc;
871
              _res_cap[a] = 0;
872
              _res_cap[_reverse[a]] += rc;
873
            }
874
          }
875
        }
876

	
877
        // Find excess nodes and deficit nodes
878
        _excess_nodes.clear();
879
        _deficit_nodes.clear();
880
        for (int u = 0; u != _node_num; ++u) {
881
          Value ex = _excess[u];
882
          if (ex >=  _delta) _excess_nodes.push_back(u);
883
          if (ex <= -_delta) _deficit_nodes.push_back(u);
884
        }
885
        int next_node = 0, next_def_node = 0;
886

	
887
        // Find augmenting shortest paths
888
        while (next_node < int(_excess_nodes.size())) {
889
          // Check deficit nodes
890
          if (_delta > 1) {
891
            bool delta_deficit = false;
892
            for ( ; next_def_node < int(_deficit_nodes.size());
893
                    ++next_def_node ) {
894
              if (_excess[_deficit_nodes[next_def_node]] <= -_delta) {
895
                delta_deficit = true;
896
                break;
897
              }
898
            }
899
            if (!delta_deficit) break;
900
          }
901

	
902
          // Run Dijkstra in the residual network
903
          s = _excess_nodes[next_node];
904
          if ((t = _dijkstra.run(s, _delta)) == -1) {
905
            if (_delta > 1) {
906
              ++next_node;
907
              continue;
908
            }
909
            return INFEASIBLE;
910
          }
911

	
912
          // Augment along a shortest path from s to t
913
          Value d = std::min(_excess[s], -_excess[t]);
914
          int u = t;
915
          int a;
916
          if (d > _delta) {
917
            while ((a = _pred[u]) != -1) {
918
              if (_res_cap[a] < d) d = _res_cap[a];
919
              u = _source[a];
920
            }
921
          }
922
          u = t;
923
          while ((a = _pred[u]) != -1) {
924
            _res_cap[a] -= d;
925
            _res_cap[_reverse[a]] += d;
926
            u = _source[a];
927
          }
928
          _excess[s] -= d;
929
          _excess[t] += d;
930

	
931
          if (_excess[s] < _delta) ++next_node;
932
        }
933

	
934
        if (_delta == 1) break;
935
        _delta = _delta <= _factor ? 1 : _delta / _factor;
936
      }
937

	
938
      return OPTIMAL;
939
    }
940

	
941
    // Execute the successive shortest path algorithm
942
    ProblemType startWithoutScaling() {
943
      // Find excess nodes
944
      _excess_nodes.clear();
945
      for (int i = 0; i != _node_num; ++i) {
946
        if (_excess[i] > 0) _excess_nodes.push_back(i);
947
      }
948
      if (_excess_nodes.size() == 0) return OPTIMAL;
949
      int next_node = 0;
950

	
951
      // Find shortest paths
952
      int s, t;
953
      ResidualDijkstra _dijkstra(*this);
954
      while ( _excess[_excess_nodes[next_node]] > 0 ||
955
              ++next_node < int(_excess_nodes.size()) )
956
      {
957
        // Run Dijkstra in the residual network
958
        s = _excess_nodes[next_node];
959
        if ((t = _dijkstra.run(s)) == -1) return INFEASIBLE;
960

	
961
        // Augment along a shortest path from s to t
962
        Value d = std::min(_excess[s], -_excess[t]);
963
        int u = t;
964
        int a;
965
        if (d > 1) {
966
          while ((a = _pred[u]) != -1) {
967
            if (_res_cap[a] < d) d = _res_cap[a];
968
            u = _source[a];
969
          }
970
        }
971
        u = t;
972
        while ((a = _pred[u]) != -1) {
973
          _res_cap[a] -= d;
974
          _res_cap[_reverse[a]] += d;
975
          u = _source[a];
976
        }
977
        _excess[s] -= d;
978
        _excess[t] += d;
979
      }
980

	
981
      return OPTIMAL;
982
    }
983

	
984
  }; //class CapacityScaling
985

	
986
  ///@}
987

	
988
} //namespace lemon
989

	
990
#endif //LEMON_CAPACITY_SCALING_H
Ignore white space 6 line context
... ...
@@ -24,2 +24,3 @@
24 24
doc/Doxyfile
25
doc/references.dox
25 26
cmake/version.cmake
Ignore white space 6 line context
... ...
@@ -116,2 +116,4 @@
116 116

	
117
INCLUDE(FindPythonInterp)
118

	
117 119
ENABLE_TESTING()
Ignore white space 6 line context
... ...
@@ -175,1 +175,23 @@
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
... ...
@@ -46,2 +46,3 @@
46 46
include tools/Makefile.am
47
include scripts/Makefile.am
47 48

	
Ignore white space 6 line context
... ...
@@ -19,2 +19,6 @@
19 19

	
20
NEWS
21

	
22
   News and version history.
23

	
20 24
INSTALL
... ...
@@ -35,2 +39,6 @@
35 39

	
40
scripts/
41

	
42
   Scripts that make it easier to develop LEMON.
43

	
36 44
test/
Ignore white space 6 line context
... ...
@@ -43,2 +43,3 @@
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])
... ...
@@ -84,2 +85,17 @@
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.
... ...
@@ -130,2 +146,3 @@
130 146
echo Build additional tools........ : $enable_tools
147
echo Use valgrind for tests........ : $use_valgrind
131 148
echo
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -67,5 +67,14 @@
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

	
Ignore white space 6 line context
... ...
@@ -19,3 +19,3 @@
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/)
... ...
@@ -30,2 +30,3 @@
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
... ...
@@ -36,4 +37,6 @@
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
Ignore white space 6 line context
... ...
@@ -99,3 +99,4 @@
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
Ignore white space 6 line context
... ...
@@ -29,3 +29,5 @@
29 29
	edge_biconnected_components.eps \
30
	matching.eps \
30 31
	node_biconnected_components.eps \
32
	planar.eps \
31 33
	strongly_connected_components.eps
... ...
@@ -68,3 +70,15 @@
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 \
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -228,10 +228,2 @@
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
... ...
@@ -248,3 +240,32 @@
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
*/
... ...
@@ -261,2 +282,24 @@
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
... ...
@@ -275,3 +318,4 @@
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
*/
... ...
@@ -283,3 +327,4 @@
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

	
... ...
@@ -300,2 +345,11 @@
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
... ...
@@ -305,3 +359,3 @@
305 359
This group contains the algorithms for finding maximum flows and
306
feasible circulations.
360
feasible circulations \ref clrs01algorithms, \ref amo93networkflows.
307 361

	
... ...
@@ -320,8 +374,12 @@
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
... ...
@@ -330,3 +388,3 @@
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,
... ...
@@ -343,4 +401,5 @@
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

	
... ...
@@ -348,9 +407,10 @@
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

	
... ...
@@ -377,3 +437,3 @@
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

	
... ...
@@ -393,23 +453,36 @@
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
*/
... ...
@@ -451,5 +524,12 @@
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
*/
... ...
@@ -457,8 +537,32 @@
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
*/
... ...
@@ -475,11 +579,2 @@
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
... ...
@@ -493,9 +588,12 @@
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
*/
... ...
@@ -589,3 +687,3 @@
589 687
/**
590
@defgroup dimacs_group DIMACS format
688
@defgroup dimacs_group DIMACS Format
591 689
@ingroup io_group
... ...
@@ -638,4 +736,4 @@
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
*/
... ...
@@ -651,2 +749,11 @@
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
... ...
@@ -662,11 +769,2 @@
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
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -23,10 +23,7 @@
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

	
... ...
@@ -40,3 +37,12 @@
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

	
... ...
@@ -45,2 +51,6 @@
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
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -28,3 +28,3 @@
28 28
in a network with capacity constraints (lower and upper bounds)
29
and arc costs.
29
and arc costs \ref amo93networkflows.
30 30

	
... ...
@@ -80,6 +80,6 @@
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
... ...
@@ -121,3 +121,3 @@
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
... ...
@@ -147,3 +147,3 @@
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$,
Ignore white space 6 line context
... ...
@@ -60,5 +60,8 @@
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 \
... ...
@@ -69,6 +72,9 @@
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 \
... ...
@@ -81,2 +87,3 @@
81 87
	lemon/fib_heap.h \
88
	lemon/fractional_matching.h \
82 89
	lemon/full_graph.h \
... ...
@@ -86,3 +93,6 @@
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 \
... ...
@@ -101,4 +111,7 @@
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 \
... ...
@@ -108,2 +121,3 @@
108 121
	lemon/soplex.h \
122
	lemon/static_graph.h \
109 123
	lemon/suurballe.h \
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -362,2 +362,5 @@
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.
... ...
@@ -420,3 +423,3 @@
420 423
      _node_filter = &node_filter;
421
      _arc_filter = &arc_filter;      
424
      _arc_filter = &arc_filter;
422 425
    }
... ...
@@ -507,7 +510,7 @@
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

	
... ...
@@ -534,5 +537,5 @@
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>,
... ...
@@ -581,3 +584,3 @@
581 584
      _node_filter = &node_filter;
582
      _arc_filter = &arc_filter;      
585
      _arc_filter = &arc_filter;
583 586
    }
... ...
@@ -650,6 +653,6 @@
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;
... ...
@@ -677,3 +680,3 @@
677 680
    template <typename V>
678
    class ArcMap 
681
    class ArcMap
679 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
... ...
@@ -721,2 +724,4 @@
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.
... ...
@@ -1018,6 +1023,6 @@
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;
... ...
@@ -1045,6 +1050,6 @@
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;
... ...
@@ -1072,6 +1077,6 @@
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;
... ...
@@ -1114,4 +1119,4 @@
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

	
... ...
@@ -1216,6 +1221,6 @@
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;
... ...
@@ -1243,6 +1248,6 @@
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;
... ...
@@ -1270,7 +1275,7 @@
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

	
... ...
@@ -1316,2 +1321,4 @@
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.
... ...
@@ -1473,2 +1480,4 @@
1473 1480
  ///
1481
  /// This class provides only linear time item counting.
1482
  ///
1474 1483
  /// \tparam GR The type of the adapted digraph or graph.
... ...
@@ -1497,3 +1506,3 @@
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;
... ...
@@ -1518,3 +1527,3 @@
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()
... ...
@@ -1556,3 +1565,3 @@
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> > {
... ...
@@ -1560,3 +1569,3 @@
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;
... ...
@@ -1621,2 +1630,4 @@
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.
... ...
@@ -1644,3 +1655,3 @@
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;
... ...
@@ -1731,2 +1742,4 @@
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.
... ...
@@ -1750,3 +1763,3 @@
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> > {
... ...
@@ -1754,3 +1767,3 @@
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;
... ...
@@ -1779,3 +1792,3 @@
1779 1792
    /// filter map.
1780
    FilterEdges(GR& graph, EF& edge_filter) 
1793
    FilterEdges(GR& graph, EF& edge_filter)
1781 1794
      : Parent(), const_true_map() {
... ...
@@ -1847,3 +1860,3 @@
1847 1860

	
1848
      Arc(const Edge& edge, bool forward) 
1861
      Arc(const Edge& edge, bool forward)
1849 1862
        : _edge(edge), _forward(forward) {}
... ...
@@ -2087,3 +2100,3 @@
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) {}
... ...
@@ -2205,3 +2218,3 @@
2205 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2206
    
2219

	
2207 2220
    typedef EdgeNotifier ArcNotifier;
... ...
@@ -2234,2 +2247,5 @@
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.
... ...
@@ -2537,2 +2553,5 @@
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.
... ...
@@ -2680,2 +2699,4 @@
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.
... ...
@@ -2709,3 +2730,3 @@
2709 2730
           typename TL = Tolerance<typename CM::Value> >
2710
  class ResidualDigraph 
2731
  class ResidualDigraph
2711 2732
    : public SubDigraph<
... ...
@@ -2766,3 +2787,3 @@
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(),
... ...
@@ -2848,3 +2869,3 @@
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) {}
... ...
@@ -3327,2 +3348,5 @@
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.
... ...
@@ -3425,3 +3449,3 @@
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.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -22,2 +22,10 @@
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)
... ...
@@ -25,3 +33,3 @@
25 33
    (static_cast<ArgParser*>(p))->showHelp();
26
    exit(1);
34
    (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP);
27 35
  }
... ...
@@ -29,3 +37,4 @@
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);
... ...
@@ -344,3 +353,3 @@
344 353
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
345
    exit(1);
354
    _terminate(ArgParserException::HELP);
346 355
  }
... ...
@@ -353,3 +362,3 @@
353 362
      " --help' to obtain a short summary on the usage.\n\n";
354
    exit(1);
363
    _terminate(ArgParserException::UNKNOWN_OPT);
355 364
  }
... ...
@@ -416,3 +425,3 @@
416 425
        " --help' to obtain a short summary on the usage.\n\n";
417
      exit(1);
426
      _terminate(ArgParserException::INVALID_OPT);
418 427
    }
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -36,2 +36,40 @@
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
... ...
@@ -118,2 +156,6 @@
118 156

	
157
    bool _exit_on_problems;
158

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

	
119 161
  public:
... ...
@@ -382,2 +424,7 @@
382 424

	
425
    ///Throw instead of exit in case of problems
426
    void throwOnProblems()
427
    {
428
      _exit_on_problems=false;
429
    }
383 430
  };
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -49,3 +49,3 @@
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;
... ...
@@ -64,3 +64,4 @@
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;
... ...
@@ -83,3 +84,4 @@
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;
... ...
@@ -98,3 +100,3 @@
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;
... ...
@@ -122,2 +124,7 @@
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
... ...
@@ -227,3 +234,3 @@
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>
... ...
@@ -247,3 +254,3 @@
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>
... ...
@@ -267,3 +274,4 @@
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>
... ...
@@ -287,3 +295,3 @@
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>
... ...
@@ -415,4 +423,4 @@
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
... ...
@@ -702,8 +710,4 @@
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
    ///
... ...
@@ -739,5 +743,5 @@
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
    ///
... ...
@@ -749,5 +753,5 @@
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
    ///
... ...
@@ -760,4 +764,5 @@
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
... ...
@@ -768,3 +773,3 @@
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
    ///
... ...
@@ -774,7 +779,8 @@
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.
... ...
@@ -782,3 +788,3 @@
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
    ///
... ...
@@ -803,3 +809,3 @@
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
    ///
... ...
@@ -809,3 +815,3 @@
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

	
... ...
@@ -835,3 +841,3 @@
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;
... ...
@@ -850,4 +856,4 @@
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;
... ...
@@ -870,3 +876,4 @@
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;
... ...
@@ -885,3 +892,3 @@
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;
... ...
@@ -900,3 +907,3 @@
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;
... ...
@@ -906,8 +913,4 @@
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>
... ...
@@ -939,3 +942,3 @@
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.
... ...
@@ -964,2 +967,5 @@
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>
... ...
@@ -969,3 +975,2 @@
969 975

	
970
    ///The type of the digraph the algorithm runs on.
971 976
    typedef typename TR::Digraph Digraph;
... ...
@@ -977,12 +982,6 @@
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;
... ...
@@ -1056,4 +1055,4 @@
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()
... ...
@@ -1069,7 +1068,8 @@
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>
... ...
@@ -1087,7 +1087,8 @@
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>
... ...
@@ -1105,7 +1106,9 @@
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>
... ...
@@ -1123,7 +1126,8 @@
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>
... ...
@@ -1266,3 +1270,4 @@
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;
... ...
@@ -1304,7 +1309,7 @@
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
... ...
@@ -1427,4 +1432,4 @@
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
... ...
@@ -1700,8 +1705,4 @@
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
    ///
... ...
@@ -1737,3 +1738,3 @@
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
    ///
Ignore white space 6 line context
... ...
@@ -21,5 +21,5 @@
21 21

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

	
... ...
@@ -31,41 +31,37 @@
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.
... ...
@@ -86,18 +82,18 @@
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)
... ...
@@ -106,18 +102,19 @@
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() {
... ...
@@ -129,3 +126,3 @@
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 {
... ...
@@ -134,3 +131,3 @@
134 131

	
135
    int bubble_up(int hole, Pair p) {
132
    int bubbleUp(int hole, Pair p) {
136 133
      int par = parent(hole);
... ...
@@ -145,4 +142,4 @@
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) {
... ...
@@ -155,3 +152,3 @@
155 152
        hole = child;
156
        child = second_child(hole);
153
        child = secondChild(hole);
157 154
      }
... ...
@@ -173,6 +170,9 @@
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) {
... ...
@@ -180,17 +180,18 @@
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 {
... ...
@@ -199,6 +200,6 @@
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 {
... ...
@@ -207,6 +208,5 @@
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.
... ...
@@ -216,3 +216,3 @@
216 216
      if (n > 0) {
217
        bubble_down(0, _data[n], n);
217
        bubbleDown(0, _data[n], n);
218 218
      }
... ...
@@ -221,7 +221,8 @@
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) {
... ...
@@ -231,4 +232,4 @@
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
        }
... ...
@@ -238,8 +239,7 @@
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 {
... ...
@@ -249,7 +249,8 @@
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.
... ...
@@ -262,6 +263,6 @@
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
      }
... ...
@@ -269,33 +270,31 @@
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.
... ...
@@ -308,7 +307,7 @@
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.
... ...
@@ -329,8 +328,9 @@
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) {
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -72,3 +72,3 @@
72 72
  private:
73
  
73

	
74 74
    // The MapBase of the Map which imlements the core regisitry function.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -159,3 +159,3 @@
159 159
    typedef DefaultMap<_Graph, _Item, _Value> Map;
160
    
160

	
161 161
    typedef typename Parent::GraphType GraphType;
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
... ...
@@ -65,7 +65,7 @@
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
    }
... ...
@@ -93,3 +93,3 @@
93 93

	
94
    class NodeIt : public Node { 
94
    class NodeIt : public Node {
95 95
      const Digraph* digraph;
... ...
@@ -102,11 +102,11 @@
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
      }
... ...
@@ -116,3 +116,3 @@
116 116

	
117
    class ArcIt : public Arc { 
117
    class ArcIt : public Arc {
118 118
      const Digraph* digraph;
... ...
@@ -125,11 +125,11 @@
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
      }
... ...
@@ -139,3 +139,3 @@
139 139

	
140
    class OutArcIt : public Arc { 
140
    class OutArcIt : public Arc {
141 141
      const Digraph* digraph;
... ...
@@ -147,13 +147,13 @@
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
      }
... ...
@@ -163,3 +163,3 @@
163 163

	
164
    class InArcIt : public Arc { 
164
    class InArcIt : public Arc {
165 165
      const Digraph* digraph;
... ...
@@ -171,13 +171,13 @@
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
      }
... ...
@@ -217,5 +217,5 @@
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> > {
... ...
@@ -224,9 +224,9 @@
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
      }
... ...
@@ -236,3 +236,3 @@
236 236
        Parent::operator=(cmap);
237
	return *this;
237
        return *this;
238 238
      }
... ...
@@ -249,3 +249,3 @@
249 249
    }
250
    
250

	
251 251
    void clear() {
... ...
@@ -314,7 +314,7 @@
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
    }
... ...
@@ -342,3 +342,3 @@
342 342
    using Parent::notifier;
343
    
343

	
344 344
    ArcNotifier& notifier(Arc) const {
... ...
@@ -352,3 +352,3 @@
352 352

	
353
    class NodeIt : public Node { 
353
    class NodeIt : public Node {
354 354
      const Graph* graph;
... ...
@@ -361,11 +361,11 @@
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
      }
... ...
@@ -375,3 +375,3 @@
375 375

	
376
    class ArcIt : public Arc { 
376
    class ArcIt : public Arc {
377 377
      const Graph* graph;
... ...
@@ -384,11 +384,11 @@
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
      }
... ...
@@ -398,3 +398,3 @@
398 398

	
399
    class OutArcIt : public Arc { 
399
    class OutArcIt : public Arc {
400 400
      const Graph* graph;
... ...
@@ -406,13 +406,13 @@
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
      }
... ...
@@ -422,3 +422,3 @@
422 422

	
423
    class InArcIt : public Arc { 
423
    class InArcIt : public Arc {
424 424
      const Graph* graph;
... ...
@@ -430,13 +430,13 @@
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
      }
... ...
@@ -446,3 +446,3 @@
446 446

	
447
    class EdgeIt : public Parent::Edge { 
447
    class EdgeIt : public Parent::Edge {
448 448
      const Graph* graph;
... ...
@@ -455,11 +455,11 @@
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
      }
... ...
@@ -479,3 +479,3 @@
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
      }
... ...
@@ -483,4 +483,4 @@
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
      }
... ...
@@ -488,4 +488,4 @@
488 488
      IncEdgeIt& operator++() {
489
	graph->nextInc(*this, direction);
490
	return *this; 
489
        graph->nextInc(*this, direction);
490
        return *this;
491 491
      }
... ...
@@ -536,3 +536,3 @@
536 536
    template <typename _Value>
537
    class ArcMap 
537
    class ArcMap
538 538
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
... ...
@@ -541,9 +541,9 @@
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
      }
... ...
@@ -553,3 +553,3 @@
553 553
        Parent::operator=(cmap);
554
	return *this;
554
        return *this;
555 555
      }
... ...
@@ -560,3 +560,3 @@
560 560
    template <typename _Value>
561
    class EdgeMap 
561
    class EdgeMap
562 562
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
... ...
@@ -565,10 +565,10 @@
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
      }
... ...
@@ -578,3 +578,3 @@
578 578
        Parent::operator=(cmap);
579
	return *this;
579
        return *this;
580 580
      }
... ...
@@ -595,3 +595,3 @@
595 595
    }
596
    
596

	
597 597
    void clear() {
... ...
@@ -621,3 +621,3 @@
621 621
    }
622
    
622

	
623 623
  };
Ignore white space 6 line context
... ...
@@ -58,3 +58,3 @@
58 58

	
59
    Node fromId(int id, Node) const {
59
    static Node fromId(int id, Node) {
60 60
      return Parent::nodeFromId(id);
... ...
@@ -62,3 +62,3 @@
62 62

	
63
    Arc fromId(int id, Arc) const {
63
    static Arc fromId(int id, Arc) {
64 64
      return Parent::arcFromId(id);
... ...
@@ -357,3 +357,3 @@
357 357

	
358
    Node fromId(int id, Node) const {
358
    static Node fromId(int id, Node) {
359 359
      return Parent::nodeFromId(id);
... ...
@@ -361,3 +361,3 @@
361 361

	
362
    Arc fromId(int id, Arc) const {
362
    static Arc fromId(int id, Arc) {
363 363
      return Parent::arcFromId(id);
... ...
@@ -365,3 +365,3 @@
365 365

	
366
    Edge fromId(int id, Edge) const {
366
    static Edge fromId(int id, Edge) {
367 367
      return Parent::edgeFromId(id);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -100,3 +100,3 @@
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) &&
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -21,5 +21,5 @@
21 21

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

	
... ...
@@ -55,19 +55,24 @@
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>
... ...
@@ -76,10 +81,11 @@
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

	
... ...
@@ -91,6 +97,6 @@
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.
... ...
@@ -106,26 +112,28 @@
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() {
... ...
@@ -136,3 +144,3 @@
136 144

	
137
    void relocate_last(int idx) {
145
    void relocateLast(int idx) {
138 146
      if (idx + 1 < int(_data.size())) {
... ...
@@ -176,6 +184,9 @@
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) {
... ...
@@ -186,5 +197,7 @@
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) {
... ...
@@ -199,6 +212,6 @@
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 {
... ...
@@ -210,6 +223,6 @@
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 {
... ...
@@ -221,5 +234,5 @@
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.
... ...
@@ -232,10 +245,11 @@
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) {
... ...
@@ -244,11 +258,10 @@
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 {
... ...
@@ -258,7 +271,8 @@
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.
... ...
@@ -276,9 +290,8 @@
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) {
... ...
@@ -293,9 +306,8 @@
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) {
... ...
@@ -307,9 +319,9 @@
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.
... ...
@@ -321,7 +333,7 @@
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.
... ...
@@ -361,19 +373,25 @@
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
  ///
... ...
@@ -384,6 +402,11 @@
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

	
... ...
@@ -395,6 +418,6 @@
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.
... ...
@@ -411,8 +434,8 @@
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)
... ...
@@ -420,18 +443,19 @@
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() {
... ...
@@ -442,4 +466,6 @@
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) {
... ...
@@ -450,5 +476,7 @@
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) {
... ...
@@ -473,6 +501,6 @@
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 {
... ...
@@ -484,6 +512,6 @@
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 {
... ...
@@ -495,5 +523,5 @@
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.
... ...
@@ -511,12 +539,11 @@
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];
... ...
@@ -532,9 +559,9 @@
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.
Ignore white space 6 line context
... ...
@@ -96,2 +96,14 @@
96 96

	
97
  int CbcMip::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
98
    std::vector<int> indexes;
99
    std::vector<Value> values;
100

	
101
    for(ExprIterator it = b; it != e; ++it) {
102
      indexes.push_back(it->first);
103
      values.push_back(it->second);
104
    }
105

	
106
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
107
    return _prob->numberRows() - 1;
108
  }
97 109

	
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -64,2 +64,3 @@
64 64
    virtual int _addRow();
65
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
65 66

	
... ...
@@ -122,3 +123,3 @@
122 123

	
123
    
124

	
124 125

	
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -61,4 +61,4 @@
61 61
    ///
62
    /// The type of the map that stores the signed supply values of the 
63
    /// nodes. 
62
    /// The type of the map that stores the signed supply values of the
63
    /// nodes.
64 64
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
... ...
@@ -74,3 +74,7 @@
74 74
    /// concept.
75
#ifdef DOXYGEN
76
    typedef GR::ArcMap<Value> FlowMap;
77
#else
75 78
    typedef typename Digraph::template ArcMap<Value> FlowMap;
79
#endif
76 80

	
... ...
@@ -89,5 +93,8 @@
89 93
    ///
90
    /// \sa Elevator
91
    /// \sa LinkedElevator
94
    /// \sa Elevator, LinkedElevator
95
#ifdef DOXYGEN
96
    typedef lemon::Elevator<GR, GR::Node> Elevator;
97
#else
92 98
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
99
#endif
93 100

	
... ...
@@ -136,3 +143,3 @@
136 143
     \f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A. \f]
137
     
144

	
138 145
     The sum of the supply values, i.e. \f$\sum_{u\in V} sup(u)\f$ must be
... ...
@@ -146,3 +153,3 @@
146 153
     have to be satisfied and all supplies have to be used.
147
     
154

	
148 155
     If you need the opposite inequalities in the supply/demand constraints
... ...
@@ -168,2 +175,7 @@
168 175
     \ref concepts::Digraph::NodeMap "GR::NodeMap<UM::Value>".
176
     \tparam TR The traits class that defines various types used by the
177
     algorithm. By default, it is \ref CirculationDefaultTraits
178
     "CirculationDefaultTraits<GR, LM, UM, SM>".
179
     In most cases, this parameter should not be set directly,
180
     consider to use the named template parameters instead.
169 181
  */
... ...
@@ -301,3 +313,3 @@
301 313
    /// digraph and the maximum level should be passed to it).
302
    /// However an external elevator object could also be passed to the
314
    /// However, an external elevator object could also be passed to the
303 315
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
... ...
@@ -327,3 +339,3 @@
327 339
    /// \param lower The lower bounds for the flow values on the arcs.
328
    /// \param upper The upper bounds (capacities) for the flow values 
340
    /// \param upper The upper bounds (capacities) for the flow values
329 341
    /// on the arcs.
... ...
@@ -452,5 +464,6 @@
452 464

	
453
    /// \brief Sets the tolerance used by algorithm.
465
    /// \brief Sets the tolerance used by the algorithm.
454 466
    ///
455
    /// Sets the tolerance used by algorithm.
467
    /// Sets the tolerance object used by the algorithm.
468
    /// \return <tt>(*this)</tt>
456 469
    Circulation& tolerance(const Tolerance& tolerance) {
... ...
@@ -462,3 +475,4 @@
462 475
    ///
463
    /// Returns a const reference to the tolerance.
476
    /// Returns a const reference to the tolerance object used by
477
    /// the algorithm.
464 478
    const Tolerance& tolerance() const {
... ...
@@ -469,4 +483,4 @@
469 483
    /// The simplest way to execute the algorithm is to call \ref run().\n
470
    /// If you need more control on the initial solution or the execution,
471
    /// first you have to call one of the \ref init() functions, then
484
    /// If you need better control on the initial solution or the execution,
485
    /// you have to call one of the \ref init() functions first, then
472 486
    /// the \ref start() function.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -80,2 +80,15 @@
80 80

	
81
  int ClpLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
82
    std::vector<int> indexes;
83
    std::vector<Value> values;
84

	
85
    for(ExprIterator it = b; it != e; ++it) {
86
      indexes.push_back(it->first);
87
      values.push_back(it->second);
88
    }
89

	
90
    _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u);
91
    return _prob->numberRows() - 1;
92
  }
93

	
81 94

	
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -77,2 +77,3 @@
77 77
    virtual int _addRow();
78
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
78 79

	
... ...
@@ -139,3 +140,3 @@
139 140
    virtual void _messageLevel(MessageLevel);
140
    
141

	
141 142
  public:
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -37,32 +37,26 @@
37 37
    ///
38
    /// This class describes the \ref concept "concept" of the
39
    /// immutable directed digraphs.
38
    /// This class describes the common interface of all directed
39
    /// graphs (digraphs).
40 40
    ///
41
    /// Note that actual digraph implementation like @ref ListDigraph or
42
    /// @ref SmartDigraph may have several additional functionality.
41
    /// Like all concept classes, it only provides an interface
42
    /// without any sensible implementation. So any general algorithm for
43
    /// directed graphs should compile with this class, but it will not
44
    /// run properly, of course.
45
    /// An actual digraph implementation like \ref ListDigraph or
46
    /// \ref SmartDigraph may have additional functionality.
43 47
    ///
44
    /// \sa concept
48
    /// \sa Graph
45 49
    class Digraph {
46 50
    private:
47
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
51
      /// Diraphs are \e not copy constructible. Use DigraphCopy instead.
52
      Digraph(const Digraph &) {}
53
      /// \brief Assignment of a digraph to another one is \e not allowed.
54
      /// Use DigraphCopy instead.
55
      void operator=(const Digraph &) {}
48 56

	
49
      ///Digraphs are \e not copy constructible. Use DigraphCopy() instead.
50
      ///
51
      Digraph(const Digraph &) {};
52
      ///\brief Assignment of \ref Digraph "Digraph"s to another ones are
53
      ///\e not allowed. Use DigraphCopy() instead.
57
    public:
58
      /// Default constructor.
59
      Digraph() { }
54 60

	
55
      ///Assignment of \ref Digraph "Digraph"s to another ones are
56
      ///\e not allowed.  Use DigraphCopy() instead.
57

	
58
      void operator=(const Digraph &) {}
59
    public:
60
      ///\e
61

	
62
      /// Defalult constructor.
63

	
64
      /// Defalult constructor.
65
      ///
66
      Digraph() { }
67
      /// Class for identifying a node of the digraph
61
      /// The node type of the digraph
68 62

	
... ...
@@ -70,3 +64,3 @@
70 64
      /// as a base class of the node iterators,
71
      /// thus they will convert to this type.
65
      /// thus they convert to this type.
72 66
      class Node {
... ...
@@ -75,4 +69,4 @@
75 69

	
76
        /// @warning The default constructor sets the iterator
77
        /// to an undefined value.
70
        /// Default constructor.
71
        /// \warning It sets the object to an undefined value.
78 72
        Node() { }
... ...
@@ -84,5 +78,5 @@
84 78

	
85
        /// Invalid constructor \& conversion.
79
        /// %Invalid constructor \& conversion.
86 80

	
87
        /// This constructor initializes the iterator to be invalid.
81
        /// Initializes the object to be invalid.
88 82
        /// \sa Invalid for more details.
... ...
@@ -91,4 +85,6 @@
91 85

	
86
        /// Equality operator.
87
        ///
92 88
        /// Two iterators are equal if and only if they point to the
93
        /// same object or both are invalid.
89
        /// same object or both are \c INVALID.
94 90
        bool operator==(Node) const { return true; }
... ...
@@ -97,4 +93,3 @@
97 93

	
98
        /// \sa operator==(Node n)
99
        ///
94
        /// Inequality operator.
100 95
        bool operator!=(Node) const { return true; }
... ...
@@ -103,17 +98,15 @@
103 98

	
104
        /// To allow the use of digraph descriptors as key type in std::map or
105
        /// similar associative container we require this.
99
        /// Artificial ordering operator.
106 100
        ///
107
        /// \note This operator only have to define some strict ordering of
108
        /// the items; this order has nothing to do with the iteration
109
        /// ordering of the items.
101
        /// \note This operator only has to define some strict ordering of
102
        /// the nodes; this order has nothing to do with the iteration
103
        /// ordering of the nodes.
110 104
        bool operator<(Node) const { return false; }
111

	
112 105
      };
113 106

	
114
      /// This iterator goes through each node.
107
      /// Iterator class for the nodes.
115 108

	
116
      /// This iterator goes through each node.
117
      /// Its usage is quite simple, for example you can count the number
118
      /// of nodes in digraph \c g of type \c Digraph like this:
109
      /// This iterator goes through each node of the digraph.
110
      /// Its usage is quite simple, for example, you can count the number
111
      /// of nodes in a digraph \c g of type \c %Digraph like this:
119 112
      ///\code
... ...
@@ -126,4 +119,4 @@
126 119

	
127
        /// @warning The default constructor sets the iterator
128
        /// to an undefined value.
120
        /// Default constructor.
121
        /// \warning It sets the iterator to an undefined value.
129 122
        NodeIt() { }
... ...
@@ -134,5 +127,5 @@
134 127
        NodeIt(const NodeIt& n) : Node(n) { }
135
        /// Invalid constructor \& conversion.
128
        /// %Invalid constructor \& conversion.
136 129

	
137
        /// Initialize the iterator to be invalid.
130
        /// Initializes the iterator to be invalid.
138 131
        /// \sa Invalid for more details.
... ...
@@ -141,11 +134,9 @@
141 134

	
142
        /// Sets the iterator to the first node of \c g.
135
        /// Sets the iterator to the first node of the given digraph.
143 136
        ///
144
        NodeIt(const Digraph&) { }
145
        /// Node -> NodeIt conversion.
137
        explicit NodeIt(const Digraph&) { }
138
        /// Sets the iterator to the given node.
146 139

	
147
        /// Sets the iterator to the node of \c the digraph pointed by
148
        /// the trivial iterator.
149
        /// This feature necessitates that each time we
150
        /// iterate the arc-set, the iteration order is the same.
140
        /// Sets the iterator to the given node of the given digraph.
141
        ///
151 142
        NodeIt(const Digraph&, const Node&) { }
... ...
@@ -159,3 +150,3 @@
159 150

	
160
      /// Class for identifying an arc of the digraph
151
      /// The arc type of the digraph
161 152

	
... ...
@@ -168,4 +159,4 @@
168 159

	
169
        /// @warning The default constructor sets the iterator
170
        /// to an undefined value.
160
        /// Default constructor.
161
        /// \warning It sets the object to an undefined value.
171 162
        Arc() { }
... ...
@@ -176,6 +167,6 @@
176 167
        Arc(const Arc&) { }
177
        /// Initialize the iterator to be invalid.
168
        /// %Invalid constructor \& conversion.
178 169

	
179
        /// Initialize the iterator to be invalid.
180
        ///
170
        /// Initializes the object to be invalid.
171
        /// \sa Invalid for more details.
181 172
        Arc(Invalid) { }
... ...
@@ -183,4 +174,6 @@
183 174

	
175
        /// Equality operator.
176
        ///
184 177
        /// Two iterators are equal if and only if they point to the
185
        /// same object or both are invalid.
178
        /// same object or both are \c INVALID.
186 179
        bool operator==(Arc) const { return true; }
... ...
@@ -188,4 +181,3 @@
188 181

	
189
        /// \sa operator==(Arc n)
190
        ///
182
        /// Inequality operator.
191 183
        bool operator!=(Arc) const { return true; }
... ...
@@ -194,8 +186,7 @@
194 186

	
195
        /// To allow the use of digraph descriptors as key type in std::map or
196
        /// similar associative container we require this.
187
        /// Artificial ordering operator.
197 188
        ///
198
        /// \note This operator only have to define some strict ordering of
199
        /// the items; this order has nothing to do with the iteration
200
        /// ordering of the items.
189
        /// \note This operator only has to define some strict ordering of
190
        /// the arcs; this order has nothing to do with the iteration
191
        /// ordering of the arcs.
201 192
        bool operator<(Arc) const { return false; }
... ...
@@ -203,3 +194,3 @@
203 194

	
204
      /// This iterator goes trough the outgoing arcs of a node.
195
      /// Iterator class for the outgoing arcs of a node.
205 196

	
... ...
@@ -207,10 +198,9 @@
207 198
      /// of a digraph.
208
      /// Its usage is quite simple, for example you can count the number
199
      /// Its usage is quite simple, for example, you can count the number
209 200
      /// of outgoing arcs of a node \c n
210
      /// in digraph \c g of type \c Digraph as follows.
201
      /// in a digraph \c g of type \c %Digraph as follows.
211 202
      ///\code
212 203
      /// int count=0;
213
      /// for (Digraph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
204
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
214 205
      ///\endcode
215

	
216 206
      class OutArcIt : public Arc {
... ...
@@ -219,4 +209,4 @@
219 209

	
220
        /// @warning The default constructor sets the iterator
221
        /// to an undefined value.
210
        /// Default constructor.
211
        /// \warning It sets the iterator to an undefined value.
222 212
        OutArcIt() { }
... ...
@@ -227,19 +217,18 @@
227 217
        OutArcIt(const OutArcIt& e) : Arc(e) { }
228
        /// Initialize the iterator to be invalid.
218
        /// %Invalid constructor \& conversion.
229 219

	
230
        /// Initialize the iterator to be invalid.
220
        /// Initializes the iterator to be invalid.
221
        /// \sa Invalid for more details.
222
        OutArcIt(Invalid) { }
223
        /// Sets the iterator to the first outgoing arc.
224

	
225
        /// Sets the iterator to the first outgoing arc of the given node.
231 226
        ///
232
        OutArcIt(Invalid) { }
233
        /// This constructor sets the iterator to the first outgoing arc.
227
        OutArcIt(const Digraph&, const Node&) { }
228
        /// Sets the iterator to the given arc.
234 229

	
235
        /// This constructor sets the iterator to the first outgoing arc of
236
        /// the node.
237
        OutArcIt(const Digraph&, const Node&) { }
238
        /// Arc -> OutArcIt conversion
239

	
240
        /// Sets the iterator to the value of the trivial iterator.
241
        /// This feature necessitates that each time we
242
        /// iterate the arc-set, the iteration order is the same.
230
        /// Sets the iterator to the given arc of the given digraph.
231
        ///
243 232
        OutArcIt(const Digraph&, const Arc&) { }
244
        ///Next outgoing arc
233
        /// Next outgoing arc
245 234

	
... ...
@@ -250,3 +239,3 @@
250 239

	
251
      /// This iterator goes trough the incoming arcs of a node.
240
      /// Iterator class for the incoming arcs of a node.
252 241

	
... ...
@@ -254,10 +243,9 @@
254 243
      /// of a digraph.
255
      /// Its usage is quite simple, for example you can count the number
256
      /// of outgoing arcs of a node \c n
257
      /// in digraph \c g of type \c Digraph as follows.
244
      /// Its usage is quite simple, for example, you can count the number
245
      /// of incoming arcs of a node \c n
246
      /// in a digraph \c g of type \c %Digraph as follows.
258 247
      ///\code
259 248
      /// int count=0;
260
      /// for(Digraph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
249
      /// for(Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
261 250
      ///\endcode
262

	
263 251
      class InArcIt : public Arc {
... ...
@@ -266,4 +254,4 @@
266 254

	
267
        /// @warning The default constructor sets the iterator
268
        /// to an undefined value.
255
        /// Default constructor.
256
        /// \warning It sets the iterator to an undefined value.
269 257
        InArcIt() { }
... ...
@@ -274,17 +262,16 @@
274 262
        InArcIt(const InArcIt& e) : Arc(e) { }
275
        /// Initialize the iterator to be invalid.
263
        /// %Invalid constructor \& conversion.
276 264

	
277
        /// Initialize the iterator to be invalid.
265
        /// Initializes the iterator to be invalid.
266
        /// \sa Invalid for more details.
267
        InArcIt(Invalid) { }
268
        /// Sets the iterator to the first incoming arc.
269

	
270
        /// Sets the iterator to the first incoming arc of the given node.
278 271
        ///
279
        InArcIt(Invalid) { }
280
        /// This constructor sets the iterator to first incoming arc.
272
        InArcIt(const Digraph&, const Node&) { }
273
        /// Sets the iterator to the given arc.
281 274

	
282
        /// This constructor set the iterator to the first incoming arc of
283
        /// the node.
284
        InArcIt(const Digraph&, const Node&) { }
285
        /// Arc -> InArcIt conversion
286

	
287
        /// Sets the iterator to the value of the trivial iterator \c e.
288
        /// This feature necessitates that each time we
289
        /// iterate the arc-set, the iteration order is the same.
275
        /// Sets the iterator to the given arc of the given digraph.
276
        ///
290 277
        InArcIt(const Digraph&, const Arc&) { }
... ...
@@ -292,14 +279,15 @@
292 279

	
293
        /// Assign the iterator to the next inarc of the corresponding node.
294
        ///
280
        /// Assign the iterator to the next
281
        /// incoming arc of the corresponding node.
295 282
        InArcIt& operator++() { return *this; }
296 283
      };
297
      /// This iterator goes through each arc.
298 284

	
299
      /// This iterator goes through each arc of a digraph.
300
      /// Its usage is quite simple, for example you can count the number
301
      /// of arcs in a digraph \c g of type \c Digraph as follows:
285
      /// Iterator class for the arcs.
286

	
287
      /// This iterator goes through each arc of the digraph.
288
      /// Its usage is quite simple, for example, you can count the number
289
      /// of arcs in a digraph \c g of type \c %Digraph as follows:
302 290
      ///\code
303 291
      /// int count=0;
304
      /// for(Digraph::ArcIt e(g); e!=INVALID; ++e) ++count;
292
      /// for(Digraph::ArcIt a(g); a!=INVALID; ++a) ++count;
305 293
      ///\endcode
... ...
@@ -309,4 +297,4 @@
309 297

	
310
        /// @warning The default constructor sets the iterator
311
        /// to an undefined value.
298
        /// Default constructor.
299
        /// \warning It sets the iterator to an undefined value.
312 300
        ArcIt() { }
... ...
@@ -317,54 +305,64 @@
317 305
        ArcIt(const ArcIt& e) : Arc(e) { }
318
        /// Initialize the iterator to be invalid.
306
        /// %Invalid constructor \& conversion.
319 307

	
320
        /// Initialize the iterator to be invalid.
308
        /// Initializes the iterator to be invalid.
309
        /// \sa Invalid for more details.
310
        ArcIt(Invalid) { }
311
        /// Sets the iterator to the first arc.
312

	
313
        /// Sets the iterator to the first arc of the given digraph.
321 314
        ///
322
        ArcIt(Invalid) { }
323
        /// This constructor sets the iterator to the first arc.
315
        explicit ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
316
        /// Sets the iterator to the given arc.
324 317

	
325
        /// This constructor sets the iterator to the first arc of \c g.
326
        ///@param g the digraph
327
        ArcIt(const Digraph& g) { ignore_unused_variable_warning(g); }
328
        /// Arc -> ArcIt conversion
329

	
330
        /// Sets the iterator to the value of the trivial iterator \c e.
331
        /// This feature necessitates that each time we
332
        /// iterate the arc-set, the iteration order is the same.
318
        /// Sets the iterator to the given arc of the given digraph.
319
        ///
333 320
        ArcIt(const Digraph&, const Arc&) { }
334
        ///Next arc
321
        /// Next arc
335 322

	
336 323
        /// Assign the iterator to the next arc.
324
        ///
337 325
        ArcIt& operator++() { return *this; }
338 326
      };
339
      ///Gives back the target node of an arc.
340 327

	
341
      ///Gives back the target node of an arc.
328
      /// \brief The source node of the arc.
342 329
      ///
343
      Node target(Arc) const { return INVALID; }
344
      ///Gives back the source node of an arc.
345

	
346
      ///Gives back the source node of an arc.
347
      ///
330
      /// Returns the source node of the given arc.
348 331
      Node source(Arc) const { return INVALID; }
349 332

	
350
      /// \brief Returns the ID of the node.
333
      /// \brief The target node of the arc.
334
      ///
335
      /// Returns the target node of the given arc.
336
      Node target(Arc) const { return INVALID; }
337

	
338
      /// \brief The ID of the node.
339
      ///
340
      /// Returns the ID of the given node.
351 341
      int id(Node) const { return -1; }
352 342

	
353
      /// \brief Returns the ID of the arc.
343
      /// \brief The ID of the arc.
344
      ///
345
      /// Returns the ID of the given arc.
354 346
      int id(Arc) const { return -1; }
355 347

	
356
      /// \brief Returns the node with the given ID.
348
      /// \brief The node with the given ID.
357 349
      ///
358
      /// \pre The argument should be a valid node ID in the graph.
350
      /// Returns the node with the given ID.
351
      /// \pre The argument should be a valid node ID in the digraph.
359 352
      Node nodeFromId(int) const { return INVALID; }
360 353

	
361
      /// \brief Returns the arc with the given ID.
354
      /// \brief The arc with the given ID.
362 355
      ///
363
      /// \pre The argument should be a valid arc ID in the graph.
356
      /// Returns the arc with the given ID.
357
      /// \pre The argument should be a valid arc ID in the digraph.
364 358
      Arc arcFromId(int) const { return INVALID; }
365 359

	
366
      /// \brief Returns an upper bound on the node IDs.
360
      /// \brief An upper bound on the node IDs.
361
      ///
362
      /// Returns an upper bound on the node IDs.
367 363
      int maxNodeId() const { return -1; }
368 364

	
369
      /// \brief Returns an upper bound on the arc IDs.
365
      /// \brief An upper bound on the arc IDs.
366
      ///
367
      /// Returns an upper bound on the arc IDs.
370 368
      int maxArcId() const { return -1; }
... ...
@@ -394,7 +392,12 @@
394 392

	
393
      /// \brief The opposite node on the arc.
394
      ///
395
      /// Returns the opposite node on the given arc.
396
      Node oppositeNode(Node, Arc) const { return INVALID; }
397

	
395 398
      /// \brief The base node of the iterator.
396 399
      ///
397
      /// Gives back the base node of the iterator.
398
      /// It is always the target of the pointed arc.
399
      Node baseNode(const InArcIt&) const { return INVALID; }
400
      /// Returns the base node of the given outgoing arc iterator
401
      /// (i.e. the source node of the corresponding arc).
402
      Node baseNode(OutArcIt) const { return INVALID; }
400 403

	
... ...
@@ -402,5 +405,5 @@
402 405
      ///
403
      /// Gives back the running node of the iterator.
404
      /// It is always the source of the pointed arc.
405
      Node runningNode(const InArcIt&) const { return INVALID; }
406
      /// Returns the running node of the given outgoing arc iterator
407
      /// (i.e. the target node of the corresponding arc).
408
      Node runningNode(OutArcIt) const { return INVALID; }
406 409

	
... ...
@@ -408,5 +411,5 @@
408 411
      ///
409
      /// Gives back the base node of the iterator.
410
      /// It is always the source of the pointed arc.
411
      Node baseNode(const OutArcIt&) const { return INVALID; }
412
      /// Returns the base node of the given incomming arc iterator
413
      /// (i.e. the target node of the corresponding arc).
414
      Node baseNode(InArcIt) const { return INVALID; }
412 415

	
... ...
@@ -414,14 +417,10 @@
414 417
      ///
415
      /// Gives back the running node of the iterator.
416
      /// It is always the target of the pointed arc.
417
      Node runningNode(const OutArcIt&) const { return INVALID; }
418
      /// Returns the running node of the given incomming arc iterator
419
      /// (i.e. the source node of the corresponding arc).
420
      Node runningNode(InArcIt) const { return INVALID; }
418 421

	
419
      /// \brief The opposite node on the given arc.
422
      /// \brief Standard graph map type for the nodes.
420 423
      ///
421
      /// Gives back the opposite node on the given arc.
422
      Node oppositeNode(const Node&, const Arc&) const { return INVALID; }
423

	
424
      /// \brief Reference map of the nodes to type \c T.
425
      ///
426
      /// Reference map of the nodes to type \c T.
424
      /// Standard graph map type for the nodes.
425
      /// It conforms to the ReferenceMap concept.
427 426
      template<class T>
... ...
@@ -430,5 +429,5 @@
430 429

	
431
        ///\e
432
        NodeMap(const Digraph&) { }
433
        ///\e
430
        /// Constructor
431
        explicit NodeMap(const Digraph&) { }
432
        /// Constructor with given initial value
434 433
        NodeMap(const Digraph&, T) { }
... ...
@@ -437,3 +436,3 @@
437 436
        ///Copy constructor
438
        NodeMap(const NodeMap& nm) : 
437
        NodeMap(const NodeMap& nm) :
439 438
          ReferenceMap<Node, T, T&, const T&>(nm) { }
... ...
@@ -447,5 +446,6 @@
447 446

	
448
      /// \brief Reference map of the arcs to type \c T.
447
      /// \brief Standard graph map type for the arcs.
449 448
      ///
450
      /// Reference map of the arcs to type \c T.
449
      /// Standard graph map type for the arcs.
450
      /// It conforms to the ReferenceMap concept.
451 451
      template<class T>
... ...
@@ -454,6 +454,7 @@
454 454

	
455
        ///\e
456
        ArcMap(const Digraph&) { }
457
        ///\e
455
        /// Constructor
456
        explicit ArcMap(const Digraph&) { }
457
        /// Constructor with given initial value
458 458
        ArcMap(const Digraph&, T) { }
459

	
459 460
      private:

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

0 comments (0 inline)