↑ Collapse diff ↑
Show white space 2 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
Show white space 2 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
Show white space 2 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 2 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

	
Show white space 2 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

	
Show white space 2 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
Show white space 2 line context
... ...
@@ -24,2 +24,3 @@
24 24
doc/Doxyfile
25
doc/references.dox
25 26
cmake/version.cmake
Show white space 2 line context
... ...
@@ -116,2 +116,4 @@
116 116

	
117
INCLUDE(FindPythonInterp)
118

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

	
Show white space 2 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/
Show white space 2 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
Show white space 2 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)
75
  // The try {} construct is necessary only if the ap.trowOnProblems()
76
  // setting is in use.
77
  try {
70 78
  ap.parse();
79
  } catch (ArgParserException &) { return 1; }
71 80

	
Show white space 2 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
Show white space 2 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
Show white space 2 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 \
Show white space 2 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
... ...
@@ -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
}
Show white space 2 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
Show white space 2 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,3 +80,3 @@
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$,
... ...
@@ -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$,
Show white space 2 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 \
Show white space 2 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.
... ...
@@ -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.
... ...
@@ -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.
... ...
@@ -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.
... ...
@@ -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.
... ...
@@ -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.
... ...
@@ -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.
Show white space 2 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
    }
Show white space 2 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
  };
Show white space 2 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
    ///
Show white space 2 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 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.
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.
48 43
  ///The default is \c std::less<PR>.
49
  ///
50
  ///\sa FibHeap
51
  ///\sa Dijkstra
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) {
Show white space 2 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
Show white space 2 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
Show white space 2 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
Show white space 2 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);
Show white space 2 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
Show white space 2 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
Show white space 2 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
87
    /// Type of the items stored in the heap.
88
    typedef typename ItemIntMap::Key Item;
89
    /// Type of the item-priority pairs.
82 90
    typedef std::pair<Item, Prio> Pair;
83
    /// \e
84
    typedef IM ItemIntMap;
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;
408
    /// Type of the items stored in the heap.
409
    typedef typename ItemIntMap::Key Item;
410
    /// Type of the item-priority pairs.
387 411
    typedef std::pair<Item, Prio> Pair;
388
    typedef IM ItemIntMap;
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.
Show white space 2 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

	
Show white space 2 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

	
Show white space 2 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
... ...
@@ -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

	
... ...
@@ -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
... ...
@@ -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.
Show white space 2 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

	
Show white space 2 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

	
Show white space 2 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,17 +217,16 @@
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&) { }
... ...
@@ -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,17 +305,16 @@
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&) { }
... ...
@@ -336,35 +323,46 @@
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) { }
... ...
@@ -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:
Show white space 2 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
... ...
@@ -20,3 +20,3 @@
20 20
///\file
21
///\brief The concept of Undirected Graphs.
21
///\brief The concept of undirected graphs.
22 22

	
... ...
@@ -26,2 +26,4 @@
26 26
#include <lemon/concepts/graph_components.h>
27
#include <lemon/concepts/maps.h>
28
#include <lemon/concept_check.h>
27 29
#include <lemon/core.h>
... ...
@@ -33,43 +35,56 @@
33 35
    ///
34
    /// \brief Class describing the concept of Undirected Graphs.
36
    /// \brief Class describing the concept of undirected graphs.
35 37
    ///
36
    /// This class describes the common interface of all Undirected
37
    /// Graphs.
38
    /// This class describes the common interface of all undirected
39
    /// graphs.
38 40
    ///
39
    /// As all concept describing classes it provides only interface
40
    /// without any sensible implementation. So any algorithm for
41
    /// undirected graph should compile with this class, but it will not
41
    /// Like all concept classes, it only provides an interface
42
    /// without any sensible implementation. So any general algorithm for
43
    /// undirected graphs should compile with this class, but it will not
42 44
    /// run properly, of course.
45
    /// An actual graph implementation like \ref ListGraph or
46
    /// \ref SmartGraph may have additional functionality.
43 47
    ///
44
    /// The LEMON undirected graphs also fulfill the concept of
45
    /// directed graphs (\ref lemon::concepts::Digraph "Digraph
46
    /// Concept"). Each edges can be seen as two opposite
47
    /// directed arc and consequently the undirected graph can be
48
    /// seen as the direceted graph of these directed arcs. The
49
    /// Graph has the Edge inner class for the edges and
50
    /// the Arc type for the directed arcs. The Arc type is
51
    /// convertible to Edge or inherited from it so from a directed
52
    /// arc we can get the represented edge.
48
    /// The undirected graphs also fulfill the concept of \ref Digraph
49
    /// "directed graphs", since each edge can also be regarded as two
50
    /// oppositely directed arcs.
51
    /// Undirected graphs provide an Edge type for the undirected edges and
52
    /// an Arc type for the directed arcs. The Arc type is convertible to
53
    /// Edge or inherited from it, i.e. the corresponding edge can be
54
    /// obtained from an arc.
55
    /// EdgeIt and EdgeMap classes can be used for the edges, while ArcIt
56
    /// and ArcMap classes can be used for the arcs (just like in digraphs).
57
    /// Both InArcIt and OutArcIt iterates on the same edges but with
58
    /// opposite direction. IncEdgeIt also iterates on the same edges
59
    /// as OutArcIt and InArcIt, but it is not convertible to Arc,
60
    /// only to Edge.
53 61
    ///
54
    /// In the sense of the LEMON each edge has a default
55
    /// direction (it should be in every computer implementation,
56
    /// because the order of edge's nodes defines an
57
    /// orientation). With the default orientation we can define that
58
    /// the directed arc is forward or backward directed. With the \c
59
    /// direction() and \c direct() function we can get the direction
60
    /// of the directed arc and we can direct an edge.
62
    /// In LEMON, each undirected edge has an inherent orientation.
63
    /// Thus it can defined if an arc is forward or backward oriented in
64
    /// an undirected graph with respect to this default oriantation of
65
    /// the represented edge.
66
    /// With the direction() and direct() functions the direction
67
    /// of an arc can be obtained and set, respectively.
61 68
    ///
62
    /// The EdgeIt is an iterator for the edges. We can use
63
    /// the EdgeMap to map values for the edges. The InArcIt and
64
    /// OutArcIt iterates on the same edges but with opposite
65
    /// direction. The IncEdgeIt iterates also on the same edges
66
    /// as the OutArcIt and InArcIt but it is not convertible to Arc just
67
    /// to Edge.
69
    /// Only nodes and edges can be added to or removed from an undirected
70
    /// graph and the corresponding arcs are added or removed automatically.
71
    ///
72
    /// \sa Digraph
68 73
    class Graph {
74
    private:
75
      /// Graphs are \e not copy constructible. Use DigraphCopy instead.
76
      Graph(const Graph&) {}
77
      /// \brief Assignment of a graph to another one is \e not allowed.
78
      /// Use DigraphCopy instead.
79
      void operator=(const Graph&) {}
80

	
69 81
    public:
70
      /// \brief The undirected graph should be tagged by the
71
      /// UndirectedTag.
82
      /// Default constructor.
83
      Graph() {}
84

	
85
      /// \brief Undirected graphs should be tagged with \c UndirectedTag.
72 86
      ///
73
      /// The undirected graph should be tagged by the UndirectedTag. This
74
      /// tag helps the enable_if technics to make compile time
87
      /// Undirected graphs should be tagged with \c UndirectedTag.
88
      ///
89
      /// This tag helps the \c enable_if technics to make compile time
75 90
      /// specializations for undirected graphs.
... ...
@@ -77,9 +92,7 @@
77 92

	
78
      /// \brief The base type of node iterators,
79
      /// or in other words, the trivial node iterator.
80
      ///
81
      /// This is the base type of each node iterator,
82
      /// thus each kind of node iterator converts to this.
83
      /// More precisely each kind of node iterator should be inherited
84
      /// from the trivial node iterator.
93
      /// The node type of the graph
94

	
95
      /// This class identifies a node of the graph. It also serves
96
      /// as a base class of the node iterators,
97
      /// thus they convert to this type.
85 98
      class Node {
... ...
@@ -88,4 +101,4 @@
88 101

	
89
        /// @warning The default constructor sets the iterator
90
        /// to an undefined value.
102
        /// Default constructor.
103
        /// \warning It sets the object to an undefined value.
91 104
        Node() { }
... ...
@@ -97,5 +110,5 @@
97 110

	
98
        /// Invalid constructor \& conversion.
111
        /// %Invalid constructor \& conversion.
99 112

	
100
        /// This constructor initializes the iterator to be invalid.
113
        /// Initializes the object to be invalid.
101 114
        /// \sa Invalid for more details.
... ...
@@ -104,4 +117,6 @@
104 117

	
118
        /// Equality operator.
119
        ///
105 120
        /// Two iterators are equal if and only if they point to the
106
        /// same object or both are invalid.
121
        /// same object or both are \c INVALID.
107 122
        bool operator==(Node) const { return true; }
... ...
@@ -110,4 +125,3 @@
110 125

	
111
        /// \sa operator==(Node n)
112
        ///
126
        /// Inequality operator.
113 127
        bool operator!=(Node) const { return true; }
... ...
@@ -116,6 +130,5 @@
116 130

	
117
        /// To allow the use of graph descriptors as key type in std::map or
118
        /// similar associative container we require this.
131
        /// Artificial ordering operator.
119 132
        ///
120
        /// \note This operator only have to define some strict ordering of
133
        /// \note This operator only has to define some strict ordering of
121 134
        /// the items; this order has nothing to do with the iteration
... ...
@@ -126,7 +139,7 @@
126 139

	
127
      /// This iterator goes through each node.
140
      /// Iterator class for the nodes.
128 141

	
129
      /// This iterator goes through each node.
130
      /// Its usage is quite simple, for example you can count the number
131
      /// of nodes in graph \c g of type \c Graph like this:
142
      /// This iterator goes through each node of the graph.
143
      /// Its usage is quite simple, for example, you can count the number
144
      /// of nodes in a graph \c g of type \c %Graph like this:
132 145
      ///\code
... ...
@@ -139,4 +152,4 @@
139 152

	
140
        /// @warning The default constructor sets the iterator
141
        /// to an undefined value.
153
        /// Default constructor.
154
        /// \warning It sets the iterator to an undefined value.
142 155
        NodeIt() { }
... ...
@@ -147,5 +160,5 @@
147 160
        NodeIt(const NodeIt& n) : Node(n) { }
148
        /// Invalid constructor \& conversion.
161
        /// %Invalid constructor \& conversion.
149 162

	
150
        /// Initialize the iterator to be invalid.
163
        /// Initializes the iterator to be invalid.
151 164
        /// \sa Invalid for more details.
... ...
@@ -154,11 +167,9 @@
154 167

	
155
        /// Sets the iterator to the first node of \c g.
168
        /// Sets the iterator to the first node of the given digraph.
156 169
        ///
157
        NodeIt(const Graph&) { }
158
        /// Node -> NodeIt conversion.
170
        explicit NodeIt(const Graph&) { }
171
        /// Sets the iterator to the given node.
159 172

	
160
        /// Sets the iterator to the node of \c the graph pointed by
161
        /// the trivial iterator.
162
        /// This feature necessitates that each time we
163
        /// iterate the arc-set, the iteration order is the same.
173
        /// Sets the iterator to the given node of the given digraph.
174
        ///
164 175
        NodeIt(const Graph&, const Node&) { }
... ...
@@ -172,6 +183,7 @@
172 183

	
173
      /// The base type of the edge iterators.
184
      /// The edge type of the graph
174 185

	
175
      /// The base type of the edge iterators.
176
      ///
186
      /// This class identifies an edge of the graph. It also serves
187
      /// as a base class of the edge iterators,
188
      /// thus they will convert to this type.
177 189
      class Edge {
... ...
@@ -180,4 +192,4 @@
180 192

	
181
        /// @warning The default constructor sets the iterator
182
        /// to an undefined value.
193
        /// Default constructor.
194
        /// \warning It sets the object to an undefined value.
183 195
        Edge() { }
... ...
@@ -188,6 +200,6 @@
188 200
        Edge(const Edge&) { }
189
        /// Initialize the iterator to be invalid.
201
        /// %Invalid constructor \& conversion.
190 202

	
191
        /// Initialize the iterator to be invalid.
192
        ///
203
        /// Initializes the object to be invalid.
204
        /// \sa Invalid for more details.
193 205
        Edge(Invalid) { }
... ...
@@ -195,4 +207,6 @@
195 207

	
208
        /// Equality operator.
209
        ///
196 210
        /// Two iterators are equal if and only if they point to the
197
        /// same object or both are invalid.
211
        /// same object or both are \c INVALID.
198 212
        bool operator==(Edge) const { return true; }
... ...
@@ -200,4 +214,3 @@
200 214

	
201
        /// \sa operator==(Edge n)
202
        ///
215
        /// Inequality operator.
203 216
        bool operator!=(Edge) const { return true; }
... ...
@@ -206,8 +219,7 @@
206 219

	
207
        /// To allow the use of graph descriptors as key type in std::map or
208
        /// similar associative container we require this.
220
        /// Artificial ordering operator.
209 221
        ///
210
        /// \note This operator only have to define some strict ordering of
211
        /// the items; this order has nothing to do with the iteration
212
        /// ordering of the items.
222
        /// \note This operator only has to define some strict ordering of
223
        /// the edges; this order has nothing to do with the iteration
224
        /// ordering of the edges.
213 225
        bool operator<(Edge) const { return false; }
... ...
@@ -215,7 +227,7 @@
215 227

	
216
      /// This iterator goes through each edge.
228
      /// Iterator class for the edges.
217 229

	
218
      /// This iterator goes through each edge of a graph.
219
      /// Its usage is quite simple, for example you can count the number
220
      /// of edges in a graph \c g of type \c Graph as follows:
230
      /// This iterator goes through each edge of the graph.
231
      /// Its usage is quite simple, for example, you can count the number
232
      /// of edges in a graph \c g of type \c %Graph as follows:
221 233
      ///\code
... ...
@@ -228,4 +240,4 @@
228 240

	
229
        /// @warning The default constructor sets the iterator
230
        /// to an undefined value.
241
        /// Default constructor.
242
        /// \warning It sets the iterator to an undefined value.
231 243
        EdgeIt() { }
... ...
@@ -236,17 +248,16 @@
236 248
        EdgeIt(const EdgeIt& e) : Edge(e) { }
237
        /// Initialize the iterator to be invalid.
249
        /// %Invalid constructor \& conversion.
238 250

	
239
        /// Initialize the iterator to be invalid.
251
        /// Initializes the iterator to be invalid.
252
        /// \sa Invalid for more details.
253
        EdgeIt(Invalid) { }
254
        /// Sets the iterator to the first edge.
255

	
256
        /// Sets the iterator to the first edge of the given graph.
240 257
        ///
241
        EdgeIt(Invalid) { }
242
        /// This constructor sets the iterator to the first edge.
258
        explicit EdgeIt(const Graph&) { }
259
        /// Sets the iterator to the given edge.
243 260

	
244
        /// This constructor sets the iterator to the first edge.
245
        EdgeIt(const Graph&) { }
246
        /// Edge -> EdgeIt conversion
247

	
248
        /// Sets the iterator to the value of the trivial iterator.
249
        /// This feature necessitates that each time we
250
        /// iterate the edge-set, the iteration order is the
251
        /// same.
261
        /// Sets the iterator to the given edge of the given graph.
262
        ///
252 263
        EdgeIt(const Graph&, const Edge&) { }
... ...
@@ -255,2 +266,3 @@
255 266
        /// Assign the iterator to the next edge.
267
        ///
256 268
        EdgeIt& operator++() { return *this; }
... ...
@@ -258,12 +270,9 @@
258 270

	
259
      /// \brief This iterator goes trough the incident undirected
260
      /// arcs of a node.
261
      ///
262
      /// This iterator goes trough the incident edges
263
      /// of a certain node of a graph. You should assume that the
264
      /// loop arcs will be iterated twice.
265
      ///
266
      /// Its usage is quite simple, for example you can compute the
267
      /// degree (i.e. count the number of incident arcs of a node \c n
268
      /// in graph \c g of type \c Graph as follows.
271
      /// Iterator class for the incident edges of a node.
272

	
273
      /// This iterator goes trough the incident undirected edges
274
      /// of a certain node of a graph.
275
      /// Its usage is quite simple, for example, you can compute the
276
      /// degree (i.e. the number of incident edges) of a node \c n
277
      /// in a graph \c g of type \c %Graph as follows.
269 278
      ///
... ...
@@ -273,2 +282,4 @@
273 282
      ///\endcode
283
      ///
284
      /// \warning Loop edges will be iterated twice.
274 285
      class IncEdgeIt : public Edge {
... ...
@@ -277,4 +288,4 @@
277 288

	
278
        /// @warning The default constructor sets the iterator
279
        /// to an undefined value.
289
        /// Default constructor.
290
        /// \warning It sets the iterator to an undefined value.
280 291
        IncEdgeIt() { }
... ...
@@ -285,21 +296,20 @@
285 296
        IncEdgeIt(const IncEdgeIt& e) : Edge(e) { }
286
        /// Initialize the iterator to be invalid.
297
        /// %Invalid constructor \& conversion.
287 298

	
288
        /// Initialize the iterator to be invalid.
299
        /// Initializes the iterator to be invalid.
300
        /// \sa Invalid for more details.
301
        IncEdgeIt(Invalid) { }
302
        /// Sets the iterator to the first incident edge.
303

	
304
        /// Sets the iterator to the first incident edge of the given node.
289 305
        ///
290
        IncEdgeIt(Invalid) { }
291
        /// This constructor sets the iterator to first incident arc.
306
        IncEdgeIt(const Graph&, const Node&) { }
307
        /// Sets the iterator to the given edge.
292 308

	
293
        /// This constructor set the iterator to the first incident arc of
294
        /// the node.
295
        IncEdgeIt(const Graph&, const Node&) { }
296
        /// Edge -> IncEdgeIt conversion
309
        /// Sets the iterator to the given edge of the given graph.
310
        ///
311
        IncEdgeIt(const Graph&, const Edge&) { }
312
        /// Next incident edge
297 313

	
298
        /// Sets the iterator to the value of the trivial iterator \c e.
299
        /// This feature necessitates that each time we
300
        /// iterate the arc-set, the iteration order is the same.
301
        IncEdgeIt(const Graph&, const Edge&) { }
302
        /// Next incident arc
303

	
304
        /// Assign the iterator to the next incident arc
314
        /// Assign the iterator to the next incident edge
305 315
        /// of the corresponding node.
... ...
@@ -308,7 +318,7 @@
308 318

	
309
      /// The directed arc type.
319
      /// The arc type of the graph
310 320

	
311
      /// The directed arc type. It can be converted to the
312
      /// edge or it should be inherited from the undirected
313
      /// edge.
321
      /// This class identifies a directed arc of the graph. It also serves
322
      /// as a base class of the arc iterators,
323
      /// thus they will convert to this type.
314 324
      class Arc {
... ...
@@ -317,4 +327,4 @@
317 327

	
318
        /// @warning The default constructor sets the iterator
319
        /// to an undefined value.
328
        /// Default constructor.
329
        /// \warning It sets the object to an undefined value.
320 330
        Arc() { }
... ...
@@ -325,6 +335,6 @@
325 335
        Arc(const Arc&) { }
326
        /// Initialize the iterator to be invalid.
336
        /// %Invalid constructor \& conversion.
327 337

	
328
        /// Initialize the iterator to be invalid.
329
        ///
338
        /// Initializes the object to be invalid.
339
        /// \sa Invalid for more details.
330 340
        Arc(Invalid) { }
... ...
@@ -332,4 +342,6 @@
332 342

	
343
        /// Equality operator.
344
        ///
333 345
        /// Two iterators are equal if and only if they point to the
334
        /// same object or both are invalid.
346
        /// same object or both are \c INVALID.
335 347
        bool operator==(Arc) const { return true; }
... ...
@@ -337,4 +349,3 @@
337 349

	
338
        /// \sa operator==(Arc n)
339
        ///
350
        /// Inequality operator.
340 351
        bool operator!=(Arc) const { return true; }
... ...
@@ -343,21 +354,24 @@
343 354

	
344
        /// To allow the use of graph descriptors as key type in std::map or
345
        /// similar associative container we require this.
355
        /// Artificial ordering operator.
346 356
        ///
347
        /// \note This operator only have to define some strict ordering of
348
        /// the items; this order has nothing to do with the iteration
349
        /// ordering of the items.
357
        /// \note This operator only has to define some strict ordering of
358
        /// the arcs; this order has nothing to do with the iteration
359
        /// ordering of the arcs.
350 360
        bool operator<(Arc) const { return false; }
351 361

	
352
        /// Converison to Edge
362
        /// Converison to \c Edge
363

	
364
        /// Converison to \c Edge.
365
        ///
353 366
        operator Edge() const { return Edge(); }
354 367
      };
355
      /// This iterator goes through each directed arc.
356 368

	
357
      /// This iterator goes through each arc of a graph.
358
      /// Its usage is quite simple, for example you can count the number
359
      /// of arcs in a graph \c g of type \c Graph as follows:
369
      /// Iterator class for the arcs.
370

	
371
      /// This iterator goes through each directed arc of the graph.
372
      /// Its usage is quite simple, for example, you can count the number
373
      /// of arcs in a graph \c g of type \c %Graph as follows:
360 374
      ///\code
361 375
      /// int count=0;
362
      /// for(Graph::ArcIt e(g); e!=INVALID; ++e) ++count;
376
      /// for(Graph::ArcIt a(g); a!=INVALID; ++a) ++count;
363 377
      ///\endcode
... ...
@@ -367,4 +381,4 @@
367 381

	
368
        /// @warning The default constructor sets the iterator
369
        /// to an undefined value.
382
        /// Default constructor.
383
        /// \warning It sets the iterator to an undefined value.
370 384
        ArcIt() { }
... ...
@@ -375,17 +389,16 @@
375 389
        ArcIt(const ArcIt& e) : Arc(e) { }
376
        /// Initialize the iterator to be invalid.
390
        /// %Invalid constructor \& conversion.
377 391

	
378
        /// Initialize the iterator to be invalid.
392
        /// Initializes the iterator to be invalid.
393
        /// \sa Invalid for more details.
394
        ArcIt(Invalid) { }
395
        /// Sets the iterator to the first arc.
396

	
397
        /// Sets the iterator to the first arc of the given graph.
379 398
        ///
380
        ArcIt(Invalid) { }
381
        /// This constructor sets the iterator to the first arc.
399
        explicit ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
400
        /// Sets the iterator to the given arc.
382 401

	
383
        /// This constructor sets the iterator to the first arc of \c g.
384
        ///@param g the graph
385
        ArcIt(const Graph &g) { ignore_unused_variable_warning(g); }
386
        /// Arc -> ArcIt conversion
387

	
388
        /// Sets the iterator to the value of the trivial iterator \c e.
389
        /// This feature necessitates that each time we
390
        /// iterate the arc-set, the iteration order is the same.
402
        /// Sets the iterator to the given arc of the given graph.
403
        ///
391 404
        ArcIt(const Graph&, const Arc&) { }
... ...
@@ -394,2 +407,3 @@
394 407
        /// Assign the iterator to the next arc.
408
        ///
395 409
        ArcIt& operator++() { return *this; }
... ...
@@ -397,14 +411,13 @@
397 411

	
398
      /// This iterator goes trough the outgoing directed arcs of a node.
412
      /// Iterator class for the outgoing arcs of a node.
399 413

	
400
      /// This iterator goes trough the \e outgoing arcs of a certain node
401
      /// of a graph.
402
      /// Its usage is quite simple, for example you can count the number
414
      /// This iterator goes trough the \e outgoing directed arcs of a
415
      /// certain node of a graph.
416
      /// Its usage is quite simple, for example, you can count the number
403 417
      /// of outgoing arcs of a node \c n
404
      /// in graph \c g of type \c Graph as follows.
418
      /// in a graph \c g of type \c %Graph as follows.
405 419
      ///\code
406 420
      /// int count=0;
407
      /// for (Graph::OutArcIt e(g, n); e!=INVALID; ++e) ++count;
421
      /// for (Digraph::OutArcIt a(g, n); a!=INVALID; ++a) ++count;
408 422
      ///\endcode
409

	
410 423
      class OutArcIt : public Arc {
... ...
@@ -413,4 +426,4 @@
413 426

	
414
        /// @warning The default constructor sets the iterator
415
        /// to an undefined value.
427
        /// Default constructor.
428
        /// \warning It sets the iterator to an undefined value.
416 429
        OutArcIt() { }
... ...
@@ -421,13 +434,11 @@
421 434
        OutArcIt(const OutArcIt& e) : Arc(e) { }
422
        /// Initialize the iterator to be invalid.
435
        /// %Invalid constructor \& conversion.
423 436

	
424
        /// Initialize the iterator to be invalid.
437
        /// Initializes the iterator to be invalid.
438
        /// \sa Invalid for more details.
439
        OutArcIt(Invalid) { }
440
        /// Sets the iterator to the first outgoing arc.
441

	
442
        /// Sets the iterator to the first outgoing arc of the given node.
425 443
        ///
426
        OutArcIt(Invalid) { }
427
        /// This constructor sets the iterator to the first outgoing arc.
428

	
429
        /// This constructor sets the iterator to the first outgoing arc of
430
        /// the node.
431
        ///@param n the node
432
        ///@param g the graph
433 444
        OutArcIt(const Graph& n, const Node& g) {
... ...
@@ -436,7 +447,6 @@
436 447
        }
437
        /// Arc -> OutArcIt conversion
448
        /// Sets the iterator to the given arc.
438 449

	
439
        /// Sets the iterator to the value of the trivial iterator.
440
        /// This feature necessitates that each time we
441
        /// iterate the arc-set, the iteration order is the same.
450
        /// Sets the iterator to the given arc of the given graph.
451
        ///
442 452
        OutArcIt(const Graph&, const Arc&) { }
... ...
@@ -449,14 +459,13 @@
449 459

	
450
      /// This iterator goes trough the incoming directed arcs of a node.
460
      /// Iterator class for the incoming arcs of a node.
451 461

	
452
      /// This iterator goes trough the \e incoming arcs of a certain node
453
      /// of a graph.
454
      /// Its usage is quite simple, for example you can count the number
455
      /// of outgoing arcs of a node \c n
456
      /// in graph \c g of type \c Graph as follows.
462
      /// This iterator goes trough the \e incoming directed arcs of a
463
      /// certain node of a graph.
464
      /// Its usage is quite simple, for example, you can count the number
465
      /// of incoming arcs of a node \c n
466
      /// in a graph \c g of type \c %Graph as follows.
457 467
      ///\code
458 468
      /// int count=0;
459
      /// for(Graph::InArcIt e(g, n); e!=INVALID; ++e) ++count;
469
      /// for (Digraph::InArcIt a(g, n); a!=INVALID; ++a) ++count;
460 470
      ///\endcode
461

	
462 471
      class InArcIt : public Arc {
... ...
@@ -465,4 +474,4 @@
465 474

	
466
        /// @warning The default constructor sets the iterator
467
        /// to an undefined value.
475
        /// Default constructor.
476
        /// \warning It sets the iterator to an undefined value.
468 477
        InArcIt() { }
... ...
@@ -473,13 +482,11 @@
473 482
        InArcIt(const InArcIt& e) : Arc(e) { }
474
        /// Initialize the iterator to be invalid.
483
        /// %Invalid constructor \& conversion.
475 484

	
476
        /// Initialize the iterator to be invalid.
485
        /// Initializes the iterator to be invalid.
486
        /// \sa Invalid for more details.
487
        InArcIt(Invalid) { }
488
        /// Sets the iterator to the first incoming arc.
489

	
490
        /// Sets the iterator to the first incoming arc of the given node.
477 491
        ///
478
        InArcIt(Invalid) { }
479
        /// This constructor sets the iterator to first incoming arc.
480

	
481
        /// This constructor set the iterator to the first incoming arc of
482
        /// the node.
483
        ///@param n the node
484
        ///@param g the graph
485 492
        InArcIt(const Graph& g, const Node& n) {
... ...
@@ -488,7 +495,6 @@
488 495
        }
489
        /// Arc -> InArcIt conversion
496
        /// Sets the iterator to the given arc.
490 497

	
491
        /// Sets the iterator to the value of the trivial iterator \c e.
492
        /// This feature necessitates that each time we
493
        /// iterate the arc-set, the iteration order is the same.
498
        /// Sets the iterator to the given arc of the given graph.
499
        ///
494 500
        InArcIt(const Graph&, const Arc&) { }
... ...
@@ -496,4 +502,4 @@
496 502

	
497
        /// Assign the iterator to the next inarc of the corresponding node.
498
        ///
503
        /// Assign the iterator to the next
504
        /// incoming arc of the corresponding node.
499 505
        InArcIt& operator++() { return *this; }
... ...
@@ -501,5 +507,6 @@
501 507

	
502
      /// \brief Reference map of the nodes to type \c T.
508
      /// \brief Standard graph map type for the nodes.
503 509
      ///
504
      /// Reference map of the nodes to type \c T.
510
      /// Standard graph map type for the nodes.
511
      /// It conforms to the ReferenceMap concept.
505 512
      template<class T>
... ...
@@ -509,5 +516,5 @@
509 516

	
510
        ///\e
511
        NodeMap(const Graph&) { }
512
        ///\e
517
        /// Constructor
518
        explicit NodeMap(const Graph&) { }
519
        /// Constructor with given initial value
513 520
        NodeMap(const Graph&, T) { }
... ...
@@ -526,5 +533,6 @@
526 533

	
527
      /// \brief Reference map of the arcs to type \c T.
534
      /// \brief Standard graph map type for the arcs.
528 535
      ///
529
      /// Reference map of the arcs to type \c T.
536
      /// Standard graph map type for the arcs.
537
      /// It conforms to the ReferenceMap concept.
530 538
      template<class T>
... ...
@@ -534,6 +542,7 @@
534 542

	
535
        ///\e
536
        ArcMap(const Graph&) { }
537
        ///\e
543
        /// Constructor
544
        explicit ArcMap(const Graph&) { }
545
        /// Constructor with given initial value
538 546
        ArcMap(const Graph&, T) { }
547

	
539 548
      private:
... ...
@@ -550,5 +559,6 @@
550 559

	
551
      /// Reference map of the edges to type \c T.
552

	
553
      /// Reference map of the edges to type \c T.
560
      /// \brief Standard graph map type for the edges.
561
      ///
562
      /// Standard graph map type for the edges.
563
      /// It conforms to the ReferenceMap concept.
554 564
      template<class T>
... ...
@@ -558,6 +568,7 @@
558 568

	
559
        ///\e
560
        EdgeMap(const Graph&) { }
561
        ///\e
569
        /// Constructor
570
        explicit EdgeMap(const Graph&) { }
571
        /// Constructor with given initial value
562 572
        EdgeMap(const Graph&, T) { }
573

	
563 574
      private:
... ...
@@ -574,46 +585,11 @@
574 585

	
575
      /// \brief Direct the given edge.
586
      /// \brief The first node of the edge.
576 587
      ///
577
      /// Direct the given edge. The returned arc source
578
      /// will be the given node.
579
      Arc direct(const Edge&, const Node&) const {
580
        return INVALID;
581
      }
582

	
583
      /// \brief Direct the given edge.
588
      /// Returns the first node of the given edge.
584 589
      ///
585
      /// Direct the given edge. The returned arc
586
      /// represents the given edge and the direction comes
587
      /// from the bool parameter. The source of the edge and
588
      /// the directed arc is the same when the given bool is true.
589
      Arc direct(const Edge&, bool) const {
590
        return INVALID;
591
      }
592

	
593
      /// \brief Returns true if the arc has default orientation.
594
      ///
595
      /// Returns whether the given directed arc is same orientation as
596
      /// the corresponding edge's default orientation.
597
      bool direction(Arc) const { return true; }
598

	
599
      /// \brief Returns the opposite directed arc.
600
      ///
601
      /// Returns the opposite directed arc.
602
      Arc oppositeArc(Arc) const { return INVALID; }
603

	
604
      /// \brief Opposite node on an arc
605
      ///
606
      /// \return The opposite of the given node on the given edge.
607
      Node oppositeNode(Node, Edge) const { return INVALID; }
608

	
609
      /// \brief First node of the edge.
610
      ///
611
      /// \return The first node of the given edge.
612
      ///
613
      /// Naturally edges don't have direction and thus
614
      /// don't have source and target node. However we use \c u() and \c v()
615
      /// methods to query the two nodes of the arc. The direction of the
616
      /// arc which arises this way is called the inherent direction of the
617
      /// edge, and is used to define the "default" direction
618
      /// of the directed versions of the arcs.
590
      /// Edges don't have source and target nodes, however, methods
591
      /// u() and v() are used to query the two end-nodes of an edge.
592
      /// The orientation of an edge that arises this way is called
593
      /// the inherent direction, it is used to define the default
594
      /// direction for the corresponding arcs.
619 595
      /// \sa v()
... ...
@@ -622,12 +598,11 @@
622 598

	
623
      /// \brief Second node of the edge.
599
      /// \brief The second node of the edge.
624 600
      ///
625
      /// \return The second node of the given edge.
601
      /// Returns the second node of the given edge.
626 602
      ///
627
      /// Naturally edges don't have direction and thus
628
      /// don't have source and target node. However we use \c u() and \c v()
629
      /// methods to query the two nodes of the arc. The direction of the
630
      /// arc which arises this way is called the inherent direction of the
631
      /// edge, and is used to define the "default" direction
632
      /// of the directed versions of the arcs.
603
      /// Edges don't have source and target nodes, however, methods
604
      /// u() and v() are used to query the two end-nodes of an edge.
605
      /// The orientation of an edge that arises this way is called
606
      /// the inherent direction, it is used to define the default
607
      /// direction for the corresponding arcs.
633 608
      /// \sa u()
... ...
@@ -636,41 +611,94 @@
636 611

	
637
      /// \brief Source node of the directed arc.
612
      /// \brief The source node of the arc.
613
      ///
614
      /// Returns the source node of the given arc.
638 615
      Node source(Arc) const { return INVALID; }
639 616

	
640
      /// \brief Target node of the directed arc.
617
      /// \brief The target node of the arc.
618
      ///
619
      /// Returns the target node of the given arc.
641 620
      Node target(Arc) const { return INVALID; }
642 621

	
643
      /// \brief Returns the id of the node.
622
      /// \brief The ID of the node.
623
      ///
624
      /// Returns the ID of the given node.
644 625
      int id(Node) const { return -1; }
645 626

	
646
      /// \brief Returns the id of the edge.
627
      /// \brief The ID of the edge.
628
      ///
629
      /// Returns the ID of the given edge.
647 630
      int id(Edge) const { return -1; }
648 631

	
649
      /// \brief Returns the id of the arc.
632
      /// \brief The ID of the arc.
633
      ///
634
      /// Returns the ID of the given arc.
650 635
      int id(Arc) const { return -1; }
651 636

	
652
      /// \brief Returns the node with the given id.
637
      /// \brief The node with the given ID.
653 638
      ///
654
      /// \pre The argument should be a valid node id in the graph.
639
      /// Returns the node with the given ID.
640
      /// \pre The argument should be a valid node ID in the graph.
655 641
      Node nodeFromId(int) const { return INVALID; }
656 642

	
657
      /// \brief Returns the edge with the given id.
643
      /// \brief The edge with the given ID.
658 644
      ///
659
      /// \pre The argument should be a valid edge id in the graph.
645
      /// Returns the edge with the given ID.
646
      /// \pre The argument should be a valid edge ID in the graph.
660 647
      Edge edgeFromId(int) const { return INVALID; }
661 648

	
662
      /// \brief Returns the arc with the given id.
649
      /// \brief The arc with the given ID.
663 650
      ///
664
      /// \pre The argument should be a valid arc id in the graph.
651
      /// Returns the arc with the given ID.
652
      /// \pre The argument should be a valid arc ID in the graph.
665 653
      Arc arcFromId(int) const { return INVALID; }
666 654

	
667
      /// \brief Returns an upper bound on the node IDs.
655
      /// \brief An upper bound on the node IDs.
656
      ///
657
      /// Returns an upper bound on the node IDs.
668 658
      int maxNodeId() const { return -1; }
669 659

	
670
      /// \brief Returns an upper bound on the edge IDs.
660
      /// \brief An upper bound on the edge IDs.
661
      ///
662
      /// Returns an upper bound on the edge IDs.
671 663
      int maxEdgeId() const { return -1; }
672 664

	
673
      /// \brief Returns an upper bound on the arc IDs.
665
      /// \brief An upper bound on the arc IDs.
666
      ///
667
      /// Returns an upper bound on the arc IDs.
674 668
      int maxArcId() const { return -1; }
675 669

	
670
      /// \brief The direction of the arc.
671
      ///
672
      /// Returns \c true if the direction of the given arc is the same as
673
      /// the inherent orientation of the represented edge.
674
      bool direction(Arc) const { return true; }
675

	
676
      /// \brief Direct the edge.
677
      ///
678
      /// Direct the given edge. The returned arc
679
      /// represents the given edge and its direction comes
680
      /// from the bool parameter. If it is \c true, then the direction
681
      /// of the arc is the same as the inherent orientation of the edge.
682
      Arc direct(Edge, bool) const {
683
        return INVALID;
684
      }
685

	
686
      /// \brief Direct the edge.
687
      ///
688
      /// Direct the given edge. The returned arc represents the given
689
      /// edge and its source node is the given node.
690
      Arc direct(Edge, Node) const {
691
        return INVALID;
692
      }
693

	
694
      /// \brief The oppositely directed arc.
695
      ///
696
      /// Returns the oppositely directed arc representing the same edge.
697
      Arc oppositeArc(Arc) const { return INVALID; }
698

	
699
      /// \brief The opposite node on the edge.
700
      ///
701
      /// Returns the opposite node on the given edge.
702
      Node oppositeNode(Node, Edge) const { return INVALID; }
703

	
676 704
      void first(Node&) const {}
... ...
@@ -707,43 +735,35 @@
707 735

	
708
      /// \brief Base node of the iterator
736
      /// \brief The base node of the iterator.
709 737
      ///
710
      /// Returns the base node (the source in this case) of the iterator
711
      Node baseNode(OutArcIt e) const {
712
        return source(e);
713
      }
714
      /// \brief Running node of the iterator
738
      /// Returns the base node of the given incident edge iterator.
739
      Node baseNode(IncEdgeIt) const { return INVALID; }
740

	
741
      /// \brief The running node of the iterator.
715 742
      ///
716
      /// Returns the running node (the target in this case) of the
717
      /// iterator
718
      Node runningNode(OutArcIt e) const {
719
        return target(e);
720
      }
743
      /// Returns the running node of the given incident edge iterator.
744
      Node runningNode(IncEdgeIt) const { return INVALID; }
721 745

	
722
      /// \brief Base node of the iterator
746
      /// \brief The base node of the iterator.
723 747
      ///
724
      /// Returns the base node (the target in this case) of the iterator
725
      Node baseNode(InArcIt e) const {
726
        return target(e);
727
      }
728
      /// \brief Running node of the iterator
748
      /// Returns the base node of the given outgoing arc iterator
749
      /// (i.e. the source node of the corresponding arc).
750
      Node baseNode(OutArcIt) const { return INVALID; }
751

	
752
      /// \brief The running node of the iterator.
729 753
      ///
730
      /// Returns the running node (the source in this case) of the
731
      /// iterator
732
      Node runningNode(InArcIt e) const {
733
        return source(e);
734
      }
754
      /// Returns the running node of the given outgoing arc iterator
755
      /// (i.e. the target node of the corresponding arc).
756
      Node runningNode(OutArcIt) const { return INVALID; }
735 757

	
736
      /// \brief Base node of the iterator
758
      /// \brief The base node of the iterator.
737 759
      ///
738
      /// Returns the base node of the iterator
739
      Node baseNode(IncEdgeIt) const {
740
        return INVALID;
741
      }
760
      /// Returns the base node of the given incomming arc iterator
761
      /// (i.e. the target node of the corresponding arc).
762
      Node baseNode(InArcIt) const { return INVALID; }
742 763

	
743
      /// \brief Running node of the iterator
764
      /// \brief The running node of the iterator.
744 765
      ///
745
      /// Returns the running node of the iterator
746
      Node runningNode(IncEdgeIt) const {
747
        return INVALID;
748
      }
766
      /// Returns the running node of the given incomming arc iterator
767
      /// (i.e. the source node of the corresponding arc).
768
      Node runningNode(InArcIt) const { return INVALID; }
749 769

	
Show white space 2 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
... ...
@@ -20,3 +20,3 @@
20 20
///\file
21
///\brief The concept of graph components.
21
///\brief The concepts of graph components.
22 22

	
... ...
@@ -94,3 +94,3 @@
94 94
      ///
95
      /// \note This operator only have to define some strict ordering of
95
      /// \note This operator only has to define some strict ordering of
96 96
      /// the items; this order has nothing to do with the iteration
Show white space 2 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
... ...
@@ -18,2 +18,5 @@
18 18

	
19
#ifndef LEMON_CONCEPTS_HEAP_H
20
#define LEMON_CONCEPTS_HEAP_H
21

	
19 22
///\ingroup concept
... ...
@@ -22,5 +25,2 @@
22 25

	
23
#ifndef LEMON_CONCEPTS_HEAP_H
24
#define LEMON_CONCEPTS_HEAP_H
25

	
26 26
#include <lemon/core.h>
... ...
@@ -37,17 +37,23 @@
37 37
    ///
38
    /// Concept class describing the main interface of heaps. A \e heap
39
    /// is a data structure for storing items with specified values called
40
    /// \e priorities in such a way that finding the item with minimum
41
    /// priority is efficient. In a heap one can change the priority of an
42
    /// item, add or erase an item, etc.
38
    /// This concept class describes the main interface of heaps.
39
    /// The various \ref heaps "heap structures" are efficient
40
    /// implementations of the abstract data type \e priority \e queue.
41
    /// They store items with specified values called \e priorities
42
    /// in such a way that finding and removing the item with minimum
43
    /// priority are efficient. The basic operations are adding and
44
    /// erasing items, changing the priority of an item, etc.
43 45
    ///
44
    /// \tparam PR Type of the priority of the items.
45
    /// \tparam IM A read and writable item map with int values, used
46
    /// Heaps are crucial in several algorithms, such as Dijkstra and Prim.
47
    /// Any class that conforms to this concept can be used easily in such
48
    /// algorithms.
49
    ///
50
    /// \tparam PR Type of the priorities of the items.
51
    /// \tparam IM A read-writable item map with \c int values, used
46 52
    /// internally to handle the cross references.
47
    /// \tparam Comp A functor class for the ordering of the priorities.
53
    /// \tparam CMP A functor class for comparing the priorities.
48 54
    /// The default is \c std::less<PR>.
49 55
#ifdef DOXYGEN
50
    template <typename PR, typename IM, typename Comp = std::less<PR> >
56
    template <typename PR, typename IM, typename CMP>
51 57
#else
52
    template <typename PR, typename IM>
58
    template <typename PR, typename IM, typename CMP = std::less<PR> >
53 59
#endif
... ...
@@ -66,5 +72,4 @@
66 72
      /// Each item has a state associated to it. It can be "in heap",
67
      /// "pre heap" or "post heap". The later two are indifferent
68
      /// from the point of view of the heap, but may be useful for
69
      /// the user.
73
      /// "pre-heap" or "post-heap". The latter two are indifferent from the
74
      /// heap's point of view, but may be useful to the user.
70 75
      ///
... ...
@@ -74,9 +79,9 @@
74 79
        IN_HEAP = 0,    ///< = 0. The "in heap" state constant.
75
        PRE_HEAP = -1,  ///< = -1. The "pre heap" state constant.
76
        POST_HEAP = -2  ///< = -2. The "post heap" state constant.
80
        PRE_HEAP = -1,  ///< = -1. The "pre-heap" state constant.
81
        POST_HEAP = -2  ///< = -2. The "post-heap" state constant.
77 82
      };
78 83

	
79
      /// \brief The constructor.
84
      /// \brief Constructor.
80 85
      ///
81
      /// The constructor.
86
      /// Constructor.
82 87
      /// \param map A map that assigns \c int values to keys of type
... ...
@@ -84,4 +89,22 @@
84 89
      /// handle the cross references. The assigned value must be
85
      /// \c PRE_HEAP (<tt>-1</tt>) for every item.
90
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
91
#ifdef DOXYGEN
86 92
      explicit Heap(ItemIntMap &map) {}
93
#else
94
      explicit Heap(ItemIntMap&) {}
95
#endif
96

	
97
      /// \brief Constructor.
98
      ///
99
      /// Constructor.
100
      /// \param map A map that assigns \c int values to keys of type
101
      /// \c Item. It is used internally by the heap implementations to
102
      /// handle the cross references. The assigned value must be
103
      /// \c PRE_HEAP (<tt>-1</tt>) for each item.
104
      /// \param comp The function object used for comparing the priorities.
105
#ifdef DOXYGEN
106
      explicit Heap(ItemIntMap &map, const CMP &comp) {}
107
#else
108
      explicit Heap(ItemIntMap&, const CMP&) {}
109
#endif
87 110

	
... ...
@@ -89,27 +112,37 @@
89 112
      ///
90
      /// Returns the number of items stored in the heap.
113
      /// This function returns the number of items stored in the heap.
91 114
      int size() const { return 0; }
92 115

	
93
      /// \brief Checks if the heap is empty.
116
      /// \brief Check if the heap is empty.
94 117
      ///
95
      /// Returns \c true if the heap is empty.
118
      /// This function returns \c true if the heap is empty.
96 119
      bool empty() const { return false; }
97 120

	
98
      /// \brief Makes the heap empty.
121
      /// \brief Make the heap empty.
99 122
      ///
100
      /// Makes the heap empty.
101
      void clear();
123
      /// This functon makes the heap empty.
124
      /// It does not change the cross reference map. If you want to reuse
125
      /// a heap that is not surely empty, you should first clear it and
126
      /// then you should set the cross reference map to \c PRE_HEAP
127
      /// for each item.
128
      void clear() {}
102 129

	
103
      /// \brief Inserts an item into the heap with the given priority.
130
      /// \brief Insert an item into the heap with the given priority.
104 131
      ///
105
      /// Inserts the given item into the heap with the given priority.
132
      /// This function inserts the given item into the heap with the
133
      /// given priority.
106 134
      /// \param i The item to insert.
107 135
      /// \param p The priority of the item.
136
      /// \pre \e i must not be stored in the heap.
137
#ifdef DOXYGEN
108 138
      void push(const Item &i, const Prio &p) {}
139
#else
140
      void push(const Item&, const Prio&) {}
141
#endif
109 142

	
110
      /// \brief Returns the item having minimum priority.
143
      /// \brief Return the item having minimum priority.
111 144
      ///
112
      /// Returns the item having minimum priority.
145
      /// This function returns the item having minimum priority.
113 146
      /// \pre The heap must be non-empty.
114
      Item top() const {}
147
      Item top() const { return Item(); }
115 148

	
... ...
@@ -117,9 +150,9 @@
117 150
      ///
118
      /// Returns the minimum priority.
151
      /// This function returns the minimum priority.
119 152
      /// \pre The heap must be non-empty.
120
      Prio prio() const {}
153
      Prio prio() const { return Prio(); }
121 154

	
122
      /// \brief Removes the item having minimum priority.
155
      /// \brief Remove the item having minimum priority.
123 156
      ///
124
      /// Removes the item having minimum priority.
157
      /// This function removes the item having minimum priority.
125 158
      /// \pre The heap must be non-empty.
... ...
@@ -127,16 +160,26 @@
127 160

	
128
      /// \brief Removes an item from the heap.
161
      /// \brief Remove the given item from the heap.
129 162
      ///
130
      /// Removes the given item from the heap if it is already stored.
163
      /// This function removes the given item from the heap if it is
164
      /// already stored.
131 165
      /// \param i The item to delete.
166
      /// \pre \e i must be in the heap.
167
#ifdef DOXYGEN
132 168
      void erase(const Item &i) {}
169
#else
170
      void erase(const Item&) {}
171
#endif
133 172

	
134
      /// \brief The priority of an item.
173
      /// \brief The priority of the given item.
135 174
      ///
136
      /// Returns the priority of the given item.
175
      /// This function returns the priority of the given item.
137 176
      /// \param i The item.
138
      /// \pre \c i must be in the heap.
177
      /// \pre \e i must be in the heap.
178
#ifdef DOXYGEN
139 179
      Prio operator[](const Item &i) const {}
180
#else
181
      Prio operator[](const Item&) const { return Prio(); }
182
#endif
140 183

	
141
      /// \brief Sets the priority of an item or inserts it, if it is
184
      /// \brief Set the priority of an item or insert it, if it is
142 185
      /// not stored in the heap.
... ...
@@ -144,4 +187,4 @@
144 187
      /// This method sets the priority of the given item if it is
145
      /// already stored in the heap.
146
      /// Otherwise it inserts the given item with the given priority.
188
      /// already stored in the heap. Otherwise it inserts the given
189
      /// item into the heap with the given priority.
147 190
      ///
... ...
@@ -149,22 +192,33 @@
149 192
      /// \param p The priority.
193
#ifdef DOXYGEN
150 194
      void set(const Item &i, const Prio &p) {}
195
#else
196
      void set(const Item&, const Prio&) {}
197
#endif
151 198

	
152
      /// \brief Decreases the priority of an item to the given value.
199
      /// \brief Decrease the priority of an item to the given value.
153 200
      ///
154
      /// Decreases the priority of an item to the given value.
201
      /// This function decreases the priority of an item to the given value.
155 202
      /// \param i The item.
156 203
      /// \param p The priority.
157
      /// \pre \c i must be stored in the heap with priority at least \c p.
204
      /// \pre \e i must be stored in the heap with priority at least \e p.
205
#ifdef DOXYGEN
158 206
      void decrease(const Item &i, const Prio &p) {}
207
#else
208
      void decrease(const Item&, const Prio&) {}
209
#endif
159 210

	
160
      /// \brief Increases the priority of an item to the given value.
211
      /// \brief Increase the priority of an item to the given value.
161 212
      ///
162
      /// Increases the priority of an item to the given value.
213
      /// This function increases the priority of an item to the given value.
163 214
      /// \param i The item.
164 215
      /// \param p The priority.
165
      /// \pre \c i must be stored in the heap with priority at most \c p.
216
      /// \pre \e i must be stored in the heap with priority at most \e p.
217
#ifdef DOXYGEN
166 218
      void increase(const Item &i, const Prio &p) {}
219
#else
220
      void increase(const Item&, const Prio&) {}
221
#endif
167 222

	
168
      /// \brief Returns if an item is in, has already been in, or has
169
      /// never been in the heap.
223
      /// \brief Return the state of an item.
170 224
      ///
... ...
@@ -176,12 +230,20 @@
176 230
      /// \param i The item.
231
#ifdef DOXYGEN
177 232
      State state(const Item &i) const {}
233
#else
234
      State state(const Item&) const { return PRE_HEAP; }
235
#endif
178 236

	
179
      /// \brief Sets the state of an item in the heap.
237
      /// \brief Set the state of an item in the heap.
180 238
      ///
181
      /// Sets the state of the given item in the heap. It can be used
182
      /// to manually clear the heap when it is important to achive the
183
      /// better time complexity.
239
      /// This function sets the state of the given item in the heap.
240
      /// It can be used to manually clear the heap when it is important
241
      /// to achive better time complexity.
184 242
      /// \param i The item.
185 243
      /// \param st The state. It should not be \c IN_HEAP.
244
#ifdef DOXYGEN
186 245
      void state(const Item& i, State st) {}
246
#else
247
      void state(const Item&, State) {}
248
#endif
187 249

	

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

0 comments (0 inline)