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

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

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

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

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

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

	
25

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

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

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

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

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

	
60

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

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

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

	
76

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

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

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

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

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

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

	
110

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

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

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

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

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

	
150

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

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

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

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

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

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

	
203

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

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

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

	
228

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

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

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

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

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

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

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

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

	
19
#ifndef LEMON_BELLMAN_FORD_H
20
#define LEMON_BELLMAN_FORD_H
21

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

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

	
34
#include <limits>
35

	
36
namespace lemon {
37

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

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

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

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

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

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

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

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

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

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

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

	
194
  };
195

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

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

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

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

	
259
  private:
260

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

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

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

	
282
    std::vector<Node> _process;
283

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

	
299
  public :
300

	
301
    typedef BellmanFord Create;
302

	
303
    /// \name Named Template Parameters
304

	
305
    ///@{
306

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

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

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

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

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

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

	
367
    ///@}
368

	
369
  protected:
370

	
371
    BellmanFord() {}
372

	
373
  public:
374

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

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

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

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

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

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

	
445
    ///@{
446

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

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

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

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

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

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

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

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

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

	
686
    ///@}
687

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

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

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

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

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

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

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

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

	
746
    ///@{
747

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

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

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

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

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

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

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

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

	
863
    ///@}
864
  };
865

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

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

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

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

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

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

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

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

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

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

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

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

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

	
958
    public:
959
    /// Constructor.
960

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

	
966
    /// Constructor.
967

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

	
978
  };
979

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

	
998
    typedef typename TR::Digraph Digraph;
999

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

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

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

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

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

	
1027
    ~BellmanFordWizard() {}
1028

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

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

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

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

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

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

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

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

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

	
1130
  };
1131

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

	
1162
} //END OF NAMESPACE LEMON
1163

	
1164
#endif
1165

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

	
19
#ifndef LEMON_BINOMIAL_HEAP_H
20
#define LEMON_BINOMIAL_HEAP_H
21

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

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

	
32
namespace lemon {
33

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

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

	
81
  private:
82
    class Store;
83

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
324
  private:
325

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

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

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

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

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

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

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

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

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

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

	
424
  private:
425

	
426
    class Store {
427
      friend class BinomialHeap;
428

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

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

	
442
} //namespace lemon
443

	
444
#endif //LEMON_BINOMIAL_HEAP_H
445

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

	
19
#ifndef LEMON_CAPACITY_SCALING_H
20
#define LEMON_CAPACITY_SCALING_H
21

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

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

	
32
namespace lemon {
33

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

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

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

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

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

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

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

	
116
  public:
117

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

	
137
  private:
138

	
139
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
140

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

	
147
  private:
148

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

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

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

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

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

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

	
186
  public:
187

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

	
195
  private:
196

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

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

	
215
      IntVector _proc_nodes;
216
      CostVector _dist;
217

	
218
    public:
219

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

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

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

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

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

	
273
        return t;
274
      }
275

	
276
    }; //class ResidualDijkstra
277

	
278
  public:
279

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

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

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

	
302
    /// @}
303

	
304
  protected:
305

	
306
    CapacityScaling() {}
307

	
308
  public:
309

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

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

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

	
335
    /// @{
336

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

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

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

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

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

	
443
    /// @}
444

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

	
448
    /// @{
449

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

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

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

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

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

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

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

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

	
628
    /// @}
629

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

	
635
    /// @{
636

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

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

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

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

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

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

	
717
    /// @}
718

	
719
  private:
720

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

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

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

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

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

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

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

	
823
      return OPTIMAL;
824
    }
825

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

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

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

	
850
      return pt;
851
    }
852

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

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

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

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

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

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

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

	
938
      return OPTIMAL;
939
    }
940

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

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

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

	
981
      return OPTIMAL;
982
    }
983

	
984
  }; //class CapacityScaling
985

	
986
  ///@}
987

	
988
} //namespace lemon
989

	
990
#endif //LEMON_CAPACITY_SCALING_H
Ignore white space 6 line context
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_COST_SCALING_H
20
#define LEMON_COST_SCALING_H
21

	
22
/// \ingroup min_cost_flow_algs
23
/// \file
24
/// \brief Cost scaling algorithm for finding a minimum cost flow.
25

	
26
#include <vector>
27
#include <deque>
28
#include <limits>
29

	
30
#include <lemon/core.h>
31
#include <lemon/maps.h>
32
#include <lemon/math.h>
33
#include <lemon/static_graph.h>
34
#include <lemon/circulation.h>
35
#include <lemon/bellman_ford.h>
36

	
37
namespace lemon {
38

	
39
  /// \brief Default traits class of CostScaling algorithm.
40
  ///
41
  /// Default traits class of CostScaling algorithm.
42
  /// \tparam GR Digraph type.
43
  /// \tparam V The number type used for flow amounts, capacity bounds
44
  /// and supply values. By default it is \c int.
45
  /// \tparam C The number type used for costs and potentials.
46
  /// By default it is the same as \c V.
47
#ifdef DOXYGEN
48
  template <typename GR, typename V = int, typename C = V>
49
#else
50
  template < typename GR, typename V = int, typename C = V,
51
             bool integer = std::numeric_limits<C>::is_integer >
52
#endif
53
  struct CostScalingDefaultTraits
54
  {
55
    /// The type of the digraph
56
    typedef GR Digraph;
57
    /// The type of the flow amounts, capacity bounds and supply values
58
    typedef V Value;
59
    /// The type of the arc costs
60
    typedef C Cost;
61

	
62
    /// \brief The large cost type used for internal computations
63
    ///
64
    /// The large cost type used for internal computations.
65
    /// It is \c long \c long if the \c Cost type is integer,
66
    /// otherwise it is \c double.
67
    /// \c Cost must be convertible to \c LargeCost.
68
    typedef double LargeCost;
69
  };
70

	
71
  // Default traits class for integer cost types
72
  template <typename GR, typename V, typename C>
73
  struct CostScalingDefaultTraits<GR, V, C, true>
74
  {
75
    typedef GR Digraph;
76
    typedef V Value;
77
    typedef C Cost;
78
#ifdef LEMON_HAVE_LONG_LONG
79
    typedef long long LargeCost;
80
#else
81
    typedef long LargeCost;
82
#endif
83
  };
84

	
85

	
86
  /// \addtogroup min_cost_flow_algs
87
  /// @{
88

	
89
  /// \brief Implementation of the Cost Scaling algorithm for
90
  /// finding a \ref min_cost_flow "minimum cost flow".
91
  ///
92
  /// \ref CostScaling implements a cost scaling algorithm that performs
93
  /// push/augment and relabel operations for finding a \ref min_cost_flow
94
  /// "minimum cost flow" \ref amo93networkflows, \ref goldberg90approximation,
95
  /// \ref goldberg97efficient, \ref bunnagel98efficient.
96
  /// It is a highly efficient primal-dual solution method, which
97
  /// can be viewed as the generalization of the \ref Preflow
98
  /// "preflow push-relabel" algorithm for the maximum flow problem.
99
  ///
100
  /// Most of the parameters of the problem (except for the digraph)
101
  /// can be given using separate functions, and the algorithm can be
102
  /// executed using the \ref run() function. If some parameters are not
103
  /// specified, then default values will be used.
104
  ///
105
  /// \tparam GR The digraph type the algorithm runs on.
106
  /// \tparam V The number type used for flow amounts, capacity bounds
107
  /// and supply values in the algorithm. By default, it is \c int.
108
  /// \tparam C The number type used for costs and potentials in the
109
  /// algorithm. By default, it is the same as \c V.
110
  /// \tparam TR The traits class that defines various types used by the
111
  /// algorithm. By default, it is \ref CostScalingDefaultTraits
112
  /// "CostScalingDefaultTraits<GR, V, C>".
113
  /// In most cases, this parameter should not be set directly,
114
  /// consider to use the named template parameters instead.
115
  ///
116
  /// \warning Both number types must be signed and all input data must
117
  /// be integer.
118
  /// \warning This algorithm does not support negative costs for such
119
  /// arcs that have infinite upper bound.
120
  ///
121
  /// \note %CostScaling provides three different internal methods,
122
  /// from which the most efficient one is used by default.
123
  /// For more information, see \ref Method.
124
#ifdef DOXYGEN
125
  template <typename GR, typename V, typename C, typename TR>
126
#else
127
  template < typename GR, typename V = int, typename C = V,
128
             typename TR = CostScalingDefaultTraits<GR, V, C> >
129
#endif
130
  class CostScaling
131
  {
132
  public:
133

	
134
    /// The type of the digraph
135
    typedef typename TR::Digraph Digraph;
136
    /// The type of the flow amounts, capacity bounds and supply values
137
    typedef typename TR::Value Value;
138
    /// The type of the arc costs
139
    typedef typename TR::Cost Cost;
140

	
141
    /// \brief The large cost type
142
    ///
143
    /// The large cost type used for internal computations.
144
    /// By default, it is \c long \c long if the \c Cost type is integer,
145
    /// otherwise it is \c double.
146
    typedef typename TR::LargeCost LargeCost;
147

	
148
    /// The \ref CostScalingDefaultTraits "traits class" of the algorithm
149
    typedef TR Traits;
150

	
151
  public:
152

	
153
    /// \brief Problem type constants for the \c run() function.
154
    ///
155
    /// Enum type containing the problem type constants that can be
156
    /// returned by the \ref run() function of the algorithm.
157
    enum ProblemType {
158
      /// The problem has no feasible solution (flow).
159
      INFEASIBLE,
160
      /// The problem has optimal solution (i.e. it is feasible and
161
      /// bounded), and the algorithm has found optimal flow and node
162
      /// potentials (primal and dual solutions).
163
      OPTIMAL,
164
      /// The digraph contains an arc of negative cost and infinite
165
      /// upper bound. It means that the objective function is unbounded
166
      /// on that arc, however, note that it could actually be bounded
167
      /// over the feasible flows, but this algroithm cannot handle
168
      /// these cases.
169
      UNBOUNDED
170
    };
171

	
172
    /// \brief Constants for selecting the internal method.
173
    ///
174
    /// Enum type containing constants for selecting the internal method
175
    /// for the \ref run() function.
176
    ///
177
    /// \ref CostScaling provides three internal methods that differ mainly
178
    /// in their base operations, which are used in conjunction with the
179
    /// relabel operation.
180
    /// By default, the so called \ref PARTIAL_AUGMENT
181
    /// "Partial Augment-Relabel" method is used, which proved to be
182
    /// the most efficient and the most robust on various test inputs.
183
    /// However, the other methods can be selected using the \ref run()
184
    /// function with the proper parameter.
185
    enum Method {
186
      /// Local push operations are used, i.e. flow is moved only on one
187
      /// admissible arc at once.
188
      PUSH,
189
      /// Augment operations are used, i.e. flow is moved on admissible
190
      /// paths from a node with excess to a node with deficit.
191
      AUGMENT,
192
      /// Partial augment operations are used, i.e. flow is moved on
193
      /// admissible paths started from a node with excess, but the
194
      /// lengths of these paths are limited. This method can be viewed
195
      /// as a combined version of the previous two operations.
196
      PARTIAL_AUGMENT
197
    };
198

	
199
  private:
200

	
201
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
202

	
203
    typedef std::vector<int> IntVector;
204
    typedef std::vector<Value> ValueVector;
205
    typedef std::vector<Cost> CostVector;
206
    typedef std::vector<LargeCost> LargeCostVector;
207
    typedef std::vector<char> BoolVector;
208
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
209

	
210
  private:
211

	
212
    template <typename KT, typename VT>
213
    class StaticVectorMap {
214
    public:
215
      typedef KT Key;
216
      typedef VT Value;
217

	
218
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
219

	
220
      const Value& operator[](const Key& key) const {
221
        return _v[StaticDigraph::id(key)];
222
      }
223

	
224
      Value& operator[](const Key& key) {
225
        return _v[StaticDigraph::id(key)];
226
      }
227

	
228
      void set(const Key& key, const Value& val) {
229
        _v[StaticDigraph::id(key)] = val;
230
      }
231

	
232
    private:
233
      std::vector<Value>& _v;
234
    };
235

	
236
    typedef StaticVectorMap<StaticDigraph::Node, LargeCost> LargeCostNodeMap;
237
    typedef StaticVectorMap<StaticDigraph::Arc, LargeCost> LargeCostArcMap;
238

	
239
  private:
240

	
241
    // Data related to the underlying digraph
242
    const GR &_graph;
243
    int _node_num;
244
    int _arc_num;
245
    int _res_node_num;
246
    int _res_arc_num;
247
    int _root;
248

	
249
    // Parameters of the problem
250
    bool _have_lower;
251
    Value _sum_supply;
252
    int _sup_node_num;
253

	
254
    // Data structures for storing the digraph
255
    IntNodeMap _node_id;
256
    IntArcMap _arc_idf;
257
    IntArcMap _arc_idb;
258
    IntVector _first_out;
259
    BoolVector _forward;
260
    IntVector _source;
261
    IntVector _target;
262
    IntVector _reverse;
263

	
264
    // Node and arc data
265
    ValueVector _lower;
266
    ValueVector _upper;
267
    CostVector _scost;
268
    ValueVector _supply;
269

	
270
    ValueVector _res_cap;
271
    LargeCostVector _cost;
272
    LargeCostVector _pi;
273
    ValueVector _excess;
274
    IntVector _next_out;
275
    std::deque<int> _active_nodes;
276

	
277
    // Data for scaling
278
    LargeCost _epsilon;
279
    int _alpha;
280

	
281
    IntVector _buckets;
282
    IntVector _bucket_next;
283
    IntVector _bucket_prev;
284
    IntVector _rank;
285
    int _max_rank;
286

	
287
    // Data for a StaticDigraph structure
288
    typedef std::pair<int, int> IntPair;
289
    StaticDigraph _sgr;
290
    std::vector<IntPair> _arc_vec;
291
    std::vector<LargeCost> _cost_vec;
292
    LargeCostArcMap _cost_map;
293
    LargeCostNodeMap _pi_map;
294

	
295
  public:
296

	
297
    /// \brief Constant for infinite upper bounds (capacities).
298
    ///
299
    /// Constant for infinite upper bounds (capacities).
300
    /// It is \c std::numeric_limits<Value>::infinity() if available,
301
    /// \c std::numeric_limits<Value>::max() otherwise.
302
    const Value INF;
303

	
304
  public:
305

	
306
    /// \name Named Template Parameters
307
    /// @{
308

	
309
    template <typename T>
310
    struct SetLargeCostTraits : public Traits {
311
      typedef T LargeCost;
312
    };
313

	
314
    /// \brief \ref named-templ-param "Named parameter" for setting
315
    /// \c LargeCost type.
316
    ///
317
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
318
    /// type, which is used for internal computations in the algorithm.
319
    /// \c Cost must be convertible to \c LargeCost.
320
    template <typename T>
321
    struct SetLargeCost
322
      : public CostScaling<GR, V, C, SetLargeCostTraits<T> > {
323
      typedef  CostScaling<GR, V, C, SetLargeCostTraits<T> > Create;
324
    };
325

	
326
    /// @}
327

	
328
  protected:
329

	
330
    CostScaling() {}
331

	
332
  public:
333

	
334
    /// \brief Constructor.
335
    ///
336
    /// The constructor of the class.
337
    ///
338
    /// \param graph The digraph the algorithm runs on.
339
    CostScaling(const GR& graph) :
340
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
341
      _cost_map(_cost_vec), _pi_map(_pi),
342
      INF(std::numeric_limits<Value>::has_infinity ?
343
          std::numeric_limits<Value>::infinity() :
344
          std::numeric_limits<Value>::max())
345
    {
346
      // Check the number types
347
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
348
        "The flow type of CostScaling must be signed");
349
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
350
        "The cost type of CostScaling must be signed");
351

	
352
      // Reset data structures
353
      reset();
354
    }
355

	
356
    /// \name Parameters
357
    /// The parameters of the algorithm can be specified using these
358
    /// functions.
359

	
360
    /// @{
361

	
362
    /// \brief Set the lower bounds on the arcs.
363
    ///
364
    /// This function sets the lower bounds on the arcs.
365
    /// If it is not used before calling \ref run(), the lower bounds
366
    /// will be set to zero on all arcs.
367
    ///
368
    /// \param map An arc map storing the lower bounds.
369
    /// Its \c Value type must be convertible to the \c Value type
370
    /// of the algorithm.
371
    ///
372
    /// \return <tt>(*this)</tt>
373
    template <typename LowerMap>
374
    CostScaling& lowerMap(const LowerMap& map) {
375
      _have_lower = true;
376
      for (ArcIt a(_graph); a != INVALID; ++a) {
377
        _lower[_arc_idf[a]] = map[a];
378
        _lower[_arc_idb[a]] = map[a];
379
      }
380
      return *this;
381
    }
382

	
383
    /// \brief Set the upper bounds (capacities) on the arcs.
384
    ///
385
    /// This function sets the upper bounds (capacities) on the arcs.
386
    /// If it is not used before calling \ref run(), the upper bounds
387
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
388
    /// unbounded from above).
389
    ///
390
    /// \param map An arc map storing the upper bounds.
391
    /// Its \c Value type must be convertible to the \c Value type
392
    /// of the algorithm.
393
    ///
394
    /// \return <tt>(*this)</tt>
395
    template<typename UpperMap>
396
    CostScaling& upperMap(const UpperMap& map) {
397
      for (ArcIt a(_graph); a != INVALID; ++a) {
398
        _upper[_arc_idf[a]] = map[a];
399
      }
400
      return *this;
401
    }
402

	
403
    /// \brief Set the costs of the arcs.
404
    ///
405
    /// This function sets the costs of the arcs.
406
    /// If it is not used before calling \ref run(), the costs
407
    /// will be set to \c 1 on all arcs.
408
    ///
409
    /// \param map An arc map storing the costs.
410
    /// Its \c Value type must be convertible to the \c Cost type
411
    /// of the algorithm.
412
    ///
413
    /// \return <tt>(*this)</tt>
414
    template<typename CostMap>
415
    CostScaling& costMap(const CostMap& map) {
416
      for (ArcIt a(_graph); a != INVALID; ++a) {
417
        _scost[_arc_idf[a]] =  map[a];
418
        _scost[_arc_idb[a]] = -map[a];
419
      }
420
      return *this;
421
    }
422

	
423
    /// \brief Set the supply values of the nodes.
424
    ///
425
    /// This function sets the supply values of the nodes.
426
    /// If neither this function nor \ref stSupply() is used before
427
    /// calling \ref run(), the supply of each node will be set to zero.
428
    ///
429
    /// \param map A node map storing the supply values.
430
    /// Its \c Value type must be convertible to the \c Value type
431
    /// of the algorithm.
432
    ///
433
    /// \return <tt>(*this)</tt>
434
    template<typename SupplyMap>
435
    CostScaling& supplyMap(const SupplyMap& map) {
436
      for (NodeIt n(_graph); n != INVALID; ++n) {
437
        _supply[_node_id[n]] = map[n];
438
      }
439
      return *this;
440
    }
441

	
442
    /// \brief Set single source and target nodes and a supply value.
443
    ///
444
    /// This function sets a single source node and a single target node
445
    /// and the required flow value.
446
    /// If neither this function nor \ref supplyMap() is used before
447
    /// calling \ref run(), the supply of each node will be set to zero.
448
    ///
449
    /// Using this function has the same effect as using \ref supplyMap()
450
    /// with such a map in which \c k is assigned to \c s, \c -k is
451
    /// assigned to \c t and all other nodes have zero supply value.
452
    ///
453
    /// \param s The source node.
454
    /// \param t The target node.
455
    /// \param k The required amount of flow from node \c s to node \c t
456
    /// (i.e. the supply of \c s and the demand of \c t).
457
    ///
458
    /// \return <tt>(*this)</tt>
459
    CostScaling& stSupply(const Node& s, const Node& t, Value k) {
460
      for (int i = 0; i != _res_node_num; ++i) {
461
        _supply[i] = 0;
462
      }
463
      _supply[_node_id[s]] =  k;
464
      _supply[_node_id[t]] = -k;
465
      return *this;
466
    }
467

	
468
    /// @}
469

	
470
    /// \name Execution control
471
    /// The algorithm can be executed using \ref run().
472

	
473
    /// @{
474

	
475
    /// \brief Run the algorithm.
476
    ///
477
    /// This function runs the algorithm.
478
    /// The paramters can be specified using functions \ref lowerMap(),
479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480
    /// For example,
481
    /// \code
482
    ///   CostScaling<ListDigraph> cs(graph);
483
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
484
    ///     .supplyMap(sup).run();
485
    /// \endcode
486
    ///
487
    /// This function can be called more than once. All the given parameters
488
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
489
    /// is used, thus only the modified parameters have to be set again.
490
    /// If the underlying digraph was also modified after the construction
491
    /// of the class (or the last \ref reset() call), then the \ref reset()
492
    /// function must be called.
493
    ///
494
    /// \param method The internal method that will be used in the
495
    /// algorithm. For more information, see \ref Method.
496
    /// \param factor The cost scaling factor. It must be larger than one.
497
    ///
498
    /// \return \c INFEASIBLE if no feasible flow exists,
499
    /// \n \c OPTIMAL if the problem has optimal solution
500
    /// (i.e. it is feasible and bounded), and the algorithm has found
501
    /// optimal flow and node potentials (primal and dual solutions),
502
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
503
    /// and infinite upper bound. It means that the objective function
504
    /// is unbounded on that arc, however, note that it could actually be
505
    /// bounded over the feasible flows, but this algroithm cannot handle
506
    /// these cases.
507
    ///
508
    /// \see ProblemType, Method
509
    /// \see resetParams(), reset()
510
    ProblemType run(Method method = PARTIAL_AUGMENT, int factor = 8) {
511
      _alpha = factor;
512
      ProblemType pt = init();
513
      if (pt != OPTIMAL) return pt;
514
      start(method);
515
      return OPTIMAL;
516
    }
517

	
518
    /// \brief Reset all the parameters that have been given before.
519
    ///
520
    /// This function resets all the paramaters that have been given
521
    /// before using functions \ref lowerMap(), \ref upperMap(),
522
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
523
    ///
524
    /// It is useful for multiple \ref run() calls. Basically, all the given
525
    /// parameters are kept for the next \ref run() call, unless
526
    /// \ref resetParams() or \ref reset() is used.
527
    /// If the underlying digraph was also modified after the construction
528
    /// of the class or the last \ref reset() call, then the \ref reset()
529
    /// function must be used, otherwise \ref resetParams() is sufficient.
530
    ///
531
    /// For example,
532
    /// \code
533
    ///   CostScaling<ListDigraph> cs(graph);
534
    ///
535
    ///   // First run
536
    ///   cs.lowerMap(lower).upperMap(upper).costMap(cost)
537
    ///     .supplyMap(sup).run();
538
    ///
539
    ///   // Run again with modified cost map (resetParams() is not called,
540
    ///   // so only the cost map have to be set again)
541
    ///   cost[e] += 100;
542
    ///   cs.costMap(cost).run();
543
    ///
544
    ///   // Run again from scratch using resetParams()
545
    ///   // (the lower bounds will be set to zero on all arcs)
546
    ///   cs.resetParams();
547
    ///   cs.upperMap(capacity).costMap(cost)
548
    ///     .supplyMap(sup).run();
549
    /// \endcode
550
    ///
551
    /// \return <tt>(*this)</tt>
552
    ///
553
    /// \see reset(), run()
554
    CostScaling& resetParams() {
555
      for (int i = 0; i != _res_node_num; ++i) {
556
        _supply[i] = 0;
557
      }
558
      int limit = _first_out[_root];
559
      for (int j = 0; j != limit; ++j) {
560
        _lower[j] = 0;
561
        _upper[j] = INF;
562
        _scost[j] = _forward[j] ? 1 : -1;
563
      }
564
      for (int j = limit; j != _res_arc_num; ++j) {
565
        _lower[j] = 0;
566
        _upper[j] = INF;
567
        _scost[j] = 0;
568
        _scost[_reverse[j]] = 0;
569
      }
570
      _have_lower = false;
571
      return *this;
572
    }
573

	
574
    /// \brief Reset all the parameters that have been given before.
575
    ///
576
    /// This function resets all the paramaters that have been given
577
    /// before using functions \ref lowerMap(), \ref upperMap(),
578
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
579
    ///
580
    /// It is useful for multiple run() calls. If this function is not
581
    /// used, all the parameters given before are kept for the next
582
    /// \ref run() call.
583
    /// However, the underlying digraph must not be modified after this
584
    /// class have been constructed, since it copies and extends the graph.
585
    /// \return <tt>(*this)</tt>
586
    CostScaling& reset() {
587
      // Resize vectors
588
      _node_num = countNodes(_graph);
589
      _arc_num = countArcs(_graph);
590
      _res_node_num = _node_num + 1;
591
      _res_arc_num = 2 * (_arc_num + _node_num);
592
      _root = _node_num;
593

	
594
      _first_out.resize(_res_node_num + 1);
595
      _forward.resize(_res_arc_num);
596
      _source.resize(_res_arc_num);
597
      _target.resize(_res_arc_num);
598
      _reverse.resize(_res_arc_num);
599

	
600
      _lower.resize(_res_arc_num);
601
      _upper.resize(_res_arc_num);
602
      _scost.resize(_res_arc_num);
603
      _supply.resize(_res_node_num);
604

	
605
      _res_cap.resize(_res_arc_num);
606
      _cost.resize(_res_arc_num);
607
      _pi.resize(_res_node_num);
608
      _excess.resize(_res_node_num);
609
      _next_out.resize(_res_node_num);
610

	
611
      _arc_vec.reserve(_res_arc_num);
612
      _cost_vec.reserve(_res_arc_num);
613

	
614
      // Copy the graph
615
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
616
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
617
        _node_id[n] = i;
618
      }
619
      i = 0;
620
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
621
        _first_out[i] = j;
622
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
623
          _arc_idf[a] = j;
624
          _forward[j] = true;
625
          _source[j] = i;
626
          _target[j] = _node_id[_graph.runningNode(a)];
627
        }
628
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
629
          _arc_idb[a] = j;
630
          _forward[j] = false;
631
          _source[j] = i;
632
          _target[j] = _node_id[_graph.runningNode(a)];
633
        }
634
        _forward[j] = false;
635
        _source[j] = i;
636
        _target[j] = _root;
637
        _reverse[j] = k;
638
        _forward[k] = true;
639
        _source[k] = _root;
640
        _target[k] = i;
641
        _reverse[k] = j;
642
        ++j; ++k;
643
      }
644
      _first_out[i] = j;
645
      _first_out[_res_node_num] = k;
646
      for (ArcIt a(_graph); a != INVALID; ++a) {
647
        int fi = _arc_idf[a];
648
        int bi = _arc_idb[a];
649
        _reverse[fi] = bi;
650
        _reverse[bi] = fi;
651
      }
652

	
653
      // Reset parameters
654
      resetParams();
655
      return *this;
656
    }
657

	
658
    /// @}
659

	
660
    /// \name Query Functions
661
    /// The results of the algorithm can be obtained using these
662
    /// functions.\n
663
    /// The \ref run() function must be called before using them.
664

	
665
    /// @{
666

	
667
    /// \brief Return the total cost of the found flow.
668
    ///
669
    /// This function returns the total cost of the found flow.
670
    /// Its complexity is O(e).
671
    ///
672
    /// \note The return type of the function can be specified as a
673
    /// template parameter. For example,
674
    /// \code
675
    ///   cs.totalCost<double>();
676
    /// \endcode
677
    /// It is useful if the total cost cannot be stored in the \c Cost
678
    /// type of the algorithm, which is the default return type of the
679
    /// function.
680
    ///
681
    /// \pre \ref run() must be called before using this function.
682
    template <typename Number>
683
    Number totalCost() const {
684
      Number c = 0;
685
      for (ArcIt a(_graph); a != INVALID; ++a) {
686
        int i = _arc_idb[a];
687
        c += static_cast<Number>(_res_cap[i]) *
688
             (-static_cast<Number>(_scost[i]));
689
      }
690
      return c;
691
    }
692

	
693
#ifndef DOXYGEN
694
    Cost totalCost() const {
695
      return totalCost<Cost>();
696
    }
697
#endif
698

	
699
    /// \brief Return the flow on the given arc.
700
    ///
701
    /// This function returns the flow on the given arc.
702
    ///
703
    /// \pre \ref run() must be called before using this function.
704
    Value flow(const Arc& a) const {
705
      return _res_cap[_arc_idb[a]];
706
    }
707

	
708
    /// \brief Return the flow map (the primal solution).
709
    ///
710
    /// This function copies the flow value on each arc into the given
711
    /// map. The \c Value type of the algorithm must be convertible to
712
    /// the \c Value type of the map.
713
    ///
714
    /// \pre \ref run() must be called before using this function.
715
    template <typename FlowMap>
716
    void flowMap(FlowMap &map) const {
717
      for (ArcIt a(_graph); a != INVALID; ++a) {
718
        map.set(a, _res_cap[_arc_idb[a]]);
719
      }
720
    }
721

	
722
    /// \brief Return the potential (dual value) of the given node.
723
    ///
724
    /// This function returns the potential (dual value) of the
725
    /// given node.
726
    ///
727
    /// \pre \ref run() must be called before using this function.
728
    Cost potential(const Node& n) const {
729
      return static_cast<Cost>(_pi[_node_id[n]]);
730
    }
731

	
732
    /// \brief Return the potential map (the dual solution).
733
    ///
734
    /// This function copies the potential (dual value) of each node
735
    /// into the given map.
736
    /// The \c Cost type of the algorithm must be convertible to the
737
    /// \c Value type of the map.
738
    ///
739
    /// \pre \ref run() must be called before using this function.
740
    template <typename PotentialMap>
741
    void potentialMap(PotentialMap &map) const {
742
      for (NodeIt n(_graph); n != INVALID; ++n) {
743
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
744
      }
745
    }
746

	
747
    /// @}
748

	
749
  private:
750

	
751
    // Initialize the algorithm
752
    ProblemType init() {
753
      if (_res_node_num <= 1) return INFEASIBLE;
754

	
755
      // Check the sum of supply values
756
      _sum_supply = 0;
757
      for (int i = 0; i != _root; ++i) {
758
        _sum_supply += _supply[i];
759
      }
760
      if (_sum_supply > 0) return INFEASIBLE;
761

	
762

	
763
      // Initialize vectors
764
      for (int i = 0; i != _res_node_num; ++i) {
765
        _pi[i] = 0;
766
        _excess[i] = _supply[i];
767
      }
768

	
769
      // Remove infinite upper bounds and check negative arcs
770
      const Value MAX = std::numeric_limits<Value>::max();
771
      int last_out;
772
      if (_have_lower) {
773
        for (int i = 0; i != _root; ++i) {
774
          last_out = _first_out[i+1];
775
          for (int j = _first_out[i]; j != last_out; ++j) {
776
            if (_forward[j]) {
777
              Value c = _scost[j] < 0 ? _upper[j] : _lower[j];
778
              if (c >= MAX) return UNBOUNDED;
779
              _excess[i] -= c;
780
              _excess[_target[j]] += c;
781
            }
782
          }
783
        }
784
      } else {
785
        for (int i = 0; i != _root; ++i) {
786
          last_out = _first_out[i+1];
787
          for (int j = _first_out[i]; j != last_out; ++j) {
788
            if (_forward[j] && _scost[j] < 0) {
789
              Value c = _upper[j];
790
              if (c >= MAX) return UNBOUNDED;
791
              _excess[i] -= c;
792
              _excess[_target[j]] += c;
793
            }
794
          }
795
        }
796
      }
797
      Value ex, max_cap = 0;
798
      for (int i = 0; i != _res_node_num; ++i) {
799
        ex = _excess[i];
800
        _excess[i] = 0;
801
        if (ex < 0) max_cap -= ex;
802
      }
803
      for (int j = 0; j != _res_arc_num; ++j) {
804
        if (_upper[j] >= MAX) _upper[j] = max_cap;
805
      }
806

	
807
      // Initialize the large cost vector and the epsilon parameter
808
      _epsilon = 0;
809
      LargeCost lc;
810
      for (int i = 0; i != _root; ++i) {
811
        last_out = _first_out[i+1];
812
        for (int j = _first_out[i]; j != last_out; ++j) {
813
          lc = static_cast<LargeCost>(_scost[j]) * _res_node_num * _alpha;
814
          _cost[j] = lc;
815
          if (lc > _epsilon) _epsilon = lc;
816
        }
817
      }
818
      _epsilon /= _alpha;
819

	
820
      // Initialize maps for Circulation and remove non-zero lower bounds
821
      ConstMap<Arc, Value> low(0);
822
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
823
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
824
      ValueArcMap cap(_graph), flow(_graph);
825
      ValueNodeMap sup(_graph);
826
      for (NodeIt n(_graph); n != INVALID; ++n) {
827
        sup[n] = _supply[_node_id[n]];
828
      }
829
      if (_have_lower) {
830
        for (ArcIt a(_graph); a != INVALID; ++a) {
831
          int j = _arc_idf[a];
832
          Value c = _lower[j];
833
          cap[a] = _upper[j] - c;
834
          sup[_graph.source(a)] -= c;
835
          sup[_graph.target(a)] += c;
836
        }
837
      } else {
838
        for (ArcIt a(_graph); a != INVALID; ++a) {
839
          cap[a] = _upper[_arc_idf[a]];
840
        }
841
      }
842

	
843
      _sup_node_num = 0;
844
      for (NodeIt n(_graph); n != INVALID; ++n) {
845
        if (sup[n] > 0) ++_sup_node_num;
846
      }
847

	
848
      // Find a feasible flow using Circulation
849
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
850
        circ(_graph, low, cap, sup);
851
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
852

	
853
      // Set residual capacities and handle GEQ supply type
854
      if (_sum_supply < 0) {
855
        for (ArcIt a(_graph); a != INVALID; ++a) {
856
          Value fa = flow[a];
857
          _res_cap[_arc_idf[a]] = cap[a] - fa;
858
          _res_cap[_arc_idb[a]] = fa;
859
          sup[_graph.source(a)] -= fa;
860
          sup[_graph.target(a)] += fa;
861
        }
862
        for (NodeIt n(_graph); n != INVALID; ++n) {
863
          _excess[_node_id[n]] = sup[n];
864
        }
865
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
866
          int u = _target[a];
867
          int ra = _reverse[a];
868
          _res_cap[a] = -_sum_supply + 1;
869
          _res_cap[ra] = -_excess[u];
870
          _cost[a] = 0;
871
          _cost[ra] = 0;
872
          _excess[u] = 0;
873
        }
874
      } else {
875
        for (ArcIt a(_graph); a != INVALID; ++a) {
876
          Value fa = flow[a];
877
          _res_cap[_arc_idf[a]] = cap[a] - fa;
878
          _res_cap[_arc_idb[a]] = fa;
879
        }
880
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
881
          int ra = _reverse[a];
882
          _res_cap[a] = 0;
883
          _res_cap[ra] = 0;
884
          _cost[a] = 0;
885
          _cost[ra] = 0;
886
        }
887
      }
888

	
889
      return OPTIMAL;
890
    }
891

	
892
    // Execute the algorithm and transform the results
893
    void start(Method method) {
894
      // Maximum path length for partial augment
895
      const int MAX_PATH_LENGTH = 4;
896

	
897
      // Initialize data structures for buckets
898
      _max_rank = _alpha * _res_node_num;
899
      _buckets.resize(_max_rank);
900
      _bucket_next.resize(_res_node_num + 1);
901
      _bucket_prev.resize(_res_node_num + 1);
902
      _rank.resize(_res_node_num + 1);
903

	
904
      // Execute the algorithm
905
      switch (method) {
906
        case PUSH:
907
          startPush();
908
          break;
909
        case AUGMENT:
910
          startAugment(_res_node_num - 1);
911
          break;
912
        case PARTIAL_AUGMENT:
913
          startAugment(MAX_PATH_LENGTH);
914
          break;
915
      }
916

	
917
      // Compute node potentials for the original costs
918
      _arc_vec.clear();
919
      _cost_vec.clear();
920
      for (int j = 0; j != _res_arc_num; ++j) {
921
        if (_res_cap[j] > 0) {
922
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
923
          _cost_vec.push_back(_scost[j]);
924
        }
925
      }
926
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
927

	
928
      typename BellmanFord<StaticDigraph, LargeCostArcMap>
929
        ::template SetDistMap<LargeCostNodeMap>::Create bf(_sgr, _cost_map);
930
      bf.distMap(_pi_map);
931
      bf.init(0);
932
      bf.start();
933

	
934
      // Handle non-zero lower bounds
935
      if (_have_lower) {
936
        int limit = _first_out[_root];
937
        for (int j = 0; j != limit; ++j) {
938
          if (!_forward[j]) _res_cap[j] += _lower[j];
939
        }
940
      }
941
    }
942

	
943
    // Initialize a cost scaling phase
944
    void initPhase() {
945
      // Saturate arcs not satisfying the optimality condition
946
      for (int u = 0; u != _res_node_num; ++u) {
947
        int last_out = _first_out[u+1];
948
        LargeCost pi_u = _pi[u];
949
        for (int a = _first_out[u]; a != last_out; ++a) {
950
          int v = _target[a];
951
          if (_res_cap[a] > 0 && _cost[a] + pi_u - _pi[v] < 0) {
952
            Value delta = _res_cap[a];
953
            _excess[u] -= delta;
954
            _excess[v] += delta;
955
            _res_cap[a] = 0;
956
            _res_cap[_reverse[a]] += delta;
957
          }
958
        }
959
      }
960

	
961
      // Find active nodes (i.e. nodes with positive excess)
962
      for (int u = 0; u != _res_node_num; ++u) {
963
        if (_excess[u] > 0) _active_nodes.push_back(u);
964
      }
965

	
966
      // Initialize the next arcs
967
      for (int u = 0; u != _res_node_num; ++u) {
968
        _next_out[u] = _first_out[u];
969
      }
970
    }
971

	
972
    // Early termination heuristic
973
    bool earlyTermination() {
974
      const double EARLY_TERM_FACTOR = 3.0;
975

	
976
      // Build a static residual graph
977
      _arc_vec.clear();
978
      _cost_vec.clear();
979
      for (int j = 0; j != _res_arc_num; ++j) {
980
        if (_res_cap[j] > 0) {
981
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
982
          _cost_vec.push_back(_cost[j] + 1);
983
        }
984
      }
985
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
986

	
987
      // Run Bellman-Ford algorithm to check if the current flow is optimal
988
      BellmanFord<StaticDigraph, LargeCostArcMap> bf(_sgr, _cost_map);
989
      bf.init(0);
990
      bool done = false;
991
      int K = int(EARLY_TERM_FACTOR * std::sqrt(double(_res_node_num)));
992
      for (int i = 0; i < K && !done; ++i) {
993
        done = bf.processNextWeakRound();
994
      }
995
      return done;
996
    }
997

	
998
    // Global potential update heuristic
999
    void globalUpdate() {
1000
      int bucket_end = _root + 1;
1001

	
1002
      // Initialize buckets
1003
      for (int r = 0; r != _max_rank; ++r) {
1004
        _buckets[r] = bucket_end;
1005
      }
1006
      Value total_excess = 0;
1007
      for (int i = 0; i != _res_node_num; ++i) {
1008
        if (_excess[i] < 0) {
1009
          _rank[i] = 0;
1010
          _bucket_next[i] = _buckets[0];
1011
          _bucket_prev[_buckets[0]] = i;
1012
          _buckets[0] = i;
1013
        } else {
1014
          total_excess += _excess[i];
1015
          _rank[i] = _max_rank;
1016
        }
1017
      }
1018
      if (total_excess == 0) return;
1019

	
1020
      // Search the buckets
1021
      int r = 0;
1022
      for ( ; r != _max_rank; ++r) {
1023
        while (_buckets[r] != bucket_end) {
1024
          // Remove the first node from the current bucket
1025
          int u = _buckets[r];
1026
          _buckets[r] = _bucket_next[u];
1027

	
1028
          // Search the incomming arcs of u
1029
          LargeCost pi_u = _pi[u];
1030
          int last_out = _first_out[u+1];
1031
          for (int a = _first_out[u]; a != last_out; ++a) {
1032
            int ra = _reverse[a];
1033
            if (_res_cap[ra] > 0) {
1034
              int v = _source[ra];
1035
              int old_rank_v = _rank[v];
1036
              if (r < old_rank_v) {
1037
                // Compute the new rank of v
1038
                LargeCost nrc = (_cost[ra] + _pi[v] - pi_u) / _epsilon;
1039
                int new_rank_v = old_rank_v;
1040
                if (nrc < LargeCost(_max_rank))
1041
                  new_rank_v = r + 1 + int(nrc);
1042

	
1043
                // Change the rank of v
1044
                if (new_rank_v < old_rank_v) {
1045
                  _rank[v] = new_rank_v;
1046
                  _next_out[v] = _first_out[v];
1047

	
1048
                  // Remove v from its old bucket
1049
                  if (old_rank_v < _max_rank) {
1050
                    if (_buckets[old_rank_v] == v) {
1051
                      _buckets[old_rank_v] = _bucket_next[v];
1052
                    } else {
1053
                      _bucket_next[_bucket_prev[v]] = _bucket_next[v];
1054
                      _bucket_prev[_bucket_next[v]] = _bucket_prev[v];
1055
                    }
1056
                  }
1057

	
1058
                  // Insert v to its new bucket
1059
                  _bucket_next[v] = _buckets[new_rank_v];
1060
                  _bucket_prev[_buckets[new_rank_v]] = v;
1061
                  _buckets[new_rank_v] = v;
1062
                }
1063
              }
1064
            }
1065
          }
1066

	
1067
          // Finish search if there are no more active nodes
1068
          if (_excess[u] > 0) {
1069
            total_excess -= _excess[u];
1070
            if (total_excess <= 0) break;
1071
          }
1072
        }
1073
        if (total_excess <= 0) break;
1074
      }
1075

	
1076
      // Relabel nodes
1077
      for (int u = 0; u != _res_node_num; ++u) {
1078
        int k = std::min(_rank[u], r);
1079
        if (k > 0) {
1080
          _pi[u] -= _epsilon * k;
1081
          _next_out[u] = _first_out[u];
1082
        }
1083
      }
1084
    }
1085

	
1086
    /// Execute the algorithm performing augment and relabel operations
1087
    void startAugment(int max_length) {
1088
      // Paramters for heuristics
1089
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1090
      const double GLOBAL_UPDATE_FACTOR = 3.0;
1091

	
1092
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1093
        (_res_node_num + _sup_node_num * _sup_node_num));
1094
      int next_update_limit = global_update_freq;
1095

	
1096
      int relabel_cnt = 0;
1097

	
1098
      // Perform cost scaling phases
1099
      std::vector<int> path;
1100
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1101
                                        1 : _epsilon / _alpha )
1102
      {
1103
        // Early termination heuristic
1104
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1105
          if (earlyTermination()) break;
1106
        }
1107

	
1108
        // Initialize current phase
1109
        initPhase();
1110

	
1111
        // Perform partial augment and relabel operations
1112
        while (true) {
1113
          // Select an active node (FIFO selection)
1114
          while (_active_nodes.size() > 0 &&
1115
                 _excess[_active_nodes.front()] <= 0) {
1116
            _active_nodes.pop_front();
1117
          }
1118
          if (_active_nodes.size() == 0) break;
1119
          int start = _active_nodes.front();
1120

	
1121
          // Find an augmenting path from the start node
1122
          path.clear();
1123
          int tip = start;
1124
          while (_excess[tip] >= 0 && int(path.size()) < max_length) {
1125
            int u;
1126
            LargeCost min_red_cost, rc, pi_tip = _pi[tip];
1127
            int last_out = _first_out[tip+1];
1128
            for (int a = _next_out[tip]; a != last_out; ++a) {
1129
              u = _target[a];
1130
              if (_res_cap[a] > 0 && _cost[a] + pi_tip - _pi[u] < 0) {
1131
                path.push_back(a);
1132
                _next_out[tip] = a;
1133
                tip = u;
1134
                goto next_step;
1135
              }
1136
            }
1137

	
1138
            // Relabel tip node
1139
            min_red_cost = std::numeric_limits<LargeCost>::max();
1140
            if (tip != start) {
1141
              int ra = _reverse[path.back()];
1142
              min_red_cost = _cost[ra] + pi_tip - _pi[_target[ra]];
1143
            }
1144
            for (int a = _first_out[tip]; a != last_out; ++a) {
1145
              rc = _cost[a] + pi_tip - _pi[_target[a]];
1146
              if (_res_cap[a] > 0 && rc < min_red_cost) {
1147
                min_red_cost = rc;
1148
              }
1149
            }
1150
            _pi[tip] -= min_red_cost + _epsilon;
1151
            _next_out[tip] = _first_out[tip];
1152
            ++relabel_cnt;
1153

	
1154
            // Step back
1155
            if (tip != start) {
1156
              tip = _source[path.back()];
1157
              path.pop_back();
1158
            }
1159

	
1160
          next_step: ;
1161
          }
1162

	
1163
          // Augment along the found path (as much flow as possible)
1164
          Value delta;
1165
          int pa, u, v = start;
1166
          for (int i = 0; i != int(path.size()); ++i) {
1167
            pa = path[i];
1168
            u = v;
1169
            v = _target[pa];
1170
            delta = std::min(_res_cap[pa], _excess[u]);
1171
            _res_cap[pa] -= delta;
1172
            _res_cap[_reverse[pa]] += delta;
1173
            _excess[u] -= delta;
1174
            _excess[v] += delta;
1175
            if (_excess[v] > 0 && _excess[v] <= delta)
1176
              _active_nodes.push_back(v);
1177
          }
1178

	
1179
          // Global update heuristic
1180
          if (relabel_cnt >= next_update_limit) {
1181
            globalUpdate();
1182
            next_update_limit += global_update_freq;
1183
          }
1184
        }
1185
      }
1186
    }
1187

	
1188
    /// Execute the algorithm performing push and relabel operations
1189
    void startPush() {
1190
      // Paramters for heuristics
1191
      const int EARLY_TERM_EPSILON_LIMIT = 1000;
1192
      const double GLOBAL_UPDATE_FACTOR = 2.0;
1193

	
1194
      const int global_update_freq = int(GLOBAL_UPDATE_FACTOR *
1195
        (_res_node_num + _sup_node_num * _sup_node_num));
1196
      int next_update_limit = global_update_freq;
1197

	
1198
      int relabel_cnt = 0;
1199

	
1200
      // Perform cost scaling phases
1201
      BoolVector hyper(_res_node_num, false);
1202
      LargeCostVector hyper_cost(_res_node_num);
1203
      for ( ; _epsilon >= 1; _epsilon = _epsilon < _alpha && _epsilon > 1 ?
1204
                                        1 : _epsilon / _alpha )
1205
      {
1206
        // Early termination heuristic
1207
        if (_epsilon <= EARLY_TERM_EPSILON_LIMIT) {
1208
          if (earlyTermination()) break;
1209
        }
1210

	
1211
        // Initialize current phase
1212
        initPhase();
1213

	
1214
        // Perform push and relabel operations
1215
        while (_active_nodes.size() > 0) {
1216
          LargeCost min_red_cost, rc, pi_n;
1217
          Value delta;
1218
          int n, t, a, last_out = _res_arc_num;
1219

	
1220
        next_node:
1221
          // Select an active node (FIFO selection)
1222
          n = _active_nodes.front();
1223
          last_out = _first_out[n+1];
1224
          pi_n = _pi[n];
1225

	
1226
          // Perform push operations if there are admissible arcs
1227
          if (_excess[n] > 0) {
1228
            for (a = _next_out[n]; a != last_out; ++a) {
1229
              if (_res_cap[a] > 0 &&
1230
                  _cost[a] + pi_n - _pi[_target[a]] < 0) {
1231
                delta = std::min(_res_cap[a], _excess[n]);
1232
                t = _target[a];
1233

	
1234
                // Push-look-ahead heuristic
1235
                Value ahead = -_excess[t];
1236
                int last_out_t = _first_out[t+1];
1237
                LargeCost pi_t = _pi[t];
1238
                for (int ta = _next_out[t]; ta != last_out_t; ++ta) {
1239
                  if (_res_cap[ta] > 0 &&
1240
                      _cost[ta] + pi_t - _pi[_target[ta]] < 0)
1241
                    ahead += _res_cap[ta];
1242
                  if (ahead >= delta) break;
1243
                }
1244
                if (ahead < 0) ahead = 0;
1245

	
1246
                // Push flow along the arc
1247
                if (ahead < delta && !hyper[t]) {
1248
                  _res_cap[a] -= ahead;
1249
                  _res_cap[_reverse[a]] += ahead;
1250
                  _excess[n] -= ahead;
1251
                  _excess[t] += ahead;
1252
                  _active_nodes.push_front(t);
1253
                  hyper[t] = true;
1254
                  hyper_cost[t] = _cost[a] + pi_n - pi_t;
1255
                  _next_out[n] = a;
1256
                  goto next_node;
1257
                } else {
1258
                  _res_cap[a] -= delta;
1259
                  _res_cap[_reverse[a]] += delta;
1260
                  _excess[n] -= delta;
1261
                  _excess[t] += delta;
1262
                  if (_excess[t] > 0 && _excess[t] <= delta)
1263
                    _active_nodes.push_back(t);
1264
                }
1265

	
1266
                if (_excess[n] == 0) {
1267
                  _next_out[n] = a;
1268
                  goto remove_nodes;
1269
                }
1270
              }
1271
            }
1272
            _next_out[n] = a;
1273
          }
1274

	
1275
          // Relabel the node if it is still active (or hyper)
1276
          if (_excess[n] > 0 || hyper[n]) {
1277
             min_red_cost = hyper[n] ? -hyper_cost[n] :
1278
               std::numeric_limits<LargeCost>::max();
1279
            for (int a = _first_out[n]; a != last_out; ++a) {
1280
              rc = _cost[a] + pi_n - _pi[_target[a]];
1281
              if (_res_cap[a] > 0 && rc < min_red_cost) {
1282
                min_red_cost = rc;
1283
              }
1284
            }
1285
            _pi[n] -= min_red_cost + _epsilon;
1286
            _next_out[n] = _first_out[n];
1287
            hyper[n] = false;
1288
            ++relabel_cnt;
1289
          }
1290

	
1291
          // Remove nodes that are not active nor hyper
1292
        remove_nodes:
1293
          while ( _active_nodes.size() > 0 &&
1294
                  _excess[_active_nodes.front()] <= 0 &&
1295
                  !hyper[_active_nodes.front()] ) {
1296
            _active_nodes.pop_front();
1297
          }
1298

	
1299
          // Global update heuristic
1300
          if (relabel_cnt >= next_update_limit) {
1301
            globalUpdate();
1302
            for (int u = 0; u != _res_node_num; ++u)
1303
              hyper[u] = false;
1304
            next_update_limit += global_update_freq;
1305
          }
1306
        }
1307
      }
1308
    }
1309

	
1310
  }; //class CostScaling
1311

	
1312
  ///@}
1313

	
1314
} //namespace lemon
1315

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

	
19
#ifndef LEMON_CYCLE_CANCELING_H
20
#define LEMON_CYCLE_CANCELING_H
21

	
22
/// \ingroup min_cost_flow_algs
23
/// \file
24
/// \brief Cycle-canceling algorithms for finding a minimum cost flow.
25

	
26
#include <vector>
27
#include <limits>
28

	
29
#include <lemon/core.h>
30
#include <lemon/maps.h>
31
#include <lemon/path.h>
32
#include <lemon/math.h>
33
#include <lemon/static_graph.h>
34
#include <lemon/adaptors.h>
35
#include <lemon/circulation.h>
36
#include <lemon/bellman_ford.h>
37
#include <lemon/howard_mmc.h>
38

	
39
namespace lemon {
40

	
41
  /// \addtogroup min_cost_flow_algs
42
  /// @{
43

	
44
  /// \brief Implementation of cycle-canceling algorithms for
45
  /// finding a \ref min_cost_flow "minimum cost flow".
46
  ///
47
  /// \ref CycleCanceling implements three different cycle-canceling
48
  /// algorithms for finding a \ref min_cost_flow "minimum cost flow"
49
  /// \ref amo93networkflows, \ref klein67primal,
50
  /// \ref goldberg89cyclecanceling.
51
  /// The most efficent one (both theoretically and practically)
52
  /// is the \ref CANCEL_AND_TIGHTEN "Cancel and Tighten" algorithm,
53
  /// thus it is the default method.
54
  /// It is strongly polynomial, but in practice, it is typically much
55
  /// slower than the scaling algorithms and NetworkSimplex.
56
  ///
57
  /// Most of the parameters of the problem (except for the digraph)
58
  /// can be given using separate functions, and the algorithm can be
59
  /// executed using the \ref run() function. If some parameters are not
60
  /// specified, then default values will be used.
61
  ///
62
  /// \tparam GR The digraph type the algorithm runs on.
63
  /// \tparam V The number type used for flow amounts, capacity bounds
64
  /// and supply values in the algorithm. By default, it is \c int.
65
  /// \tparam C The number type used for costs and potentials in the
66
  /// algorithm. By default, it is the same as \c V.
67
  ///
68
  /// \warning Both number types must be signed and all input data must
69
  /// be integer.
70
  /// \warning This algorithm does not support negative costs for such
71
  /// arcs that have infinite upper bound.
72
  ///
73
  /// \note For more information about the three available methods,
74
  /// see \ref Method.
75
#ifdef DOXYGEN
76
  template <typename GR, typename V, typename C>
77
#else
78
  template <typename GR, typename V = int, typename C = V>
79
#endif
80
  class CycleCanceling
81
  {
82
  public:
83

	
84
    /// The type of the digraph
85
    typedef GR Digraph;
86
    /// The type of the flow amounts, capacity bounds and supply values
87
    typedef V Value;
88
    /// The type of the arc costs
89
    typedef C Cost;
90

	
91
  public:
92

	
93
    /// \brief Problem type constants for the \c run() function.
94
    ///
95
    /// Enum type containing the problem type constants that can be
96
    /// returned by the \ref run() function of the algorithm.
97
    enum ProblemType {
98
      /// The problem has no feasible solution (flow).
99
      INFEASIBLE,
100
      /// The problem has optimal solution (i.e. it is feasible and
101
      /// bounded), and the algorithm has found optimal flow and node
102
      /// potentials (primal and dual solutions).
103
      OPTIMAL,
104
      /// The digraph contains an arc of negative cost and infinite
105
      /// upper bound. It means that the objective function is unbounded
106
      /// on that arc, however, note that it could actually be bounded
107
      /// over the feasible flows, but this algroithm cannot handle
108
      /// these cases.
109
      UNBOUNDED
110
    };
111

	
112
    /// \brief Constants for selecting the used method.
113
    ///
114
    /// Enum type containing constants for selecting the used method
115
    /// for the \ref run() function.
116
    ///
117
    /// \ref CycleCanceling provides three different cycle-canceling
118
    /// methods. By default, \ref CANCEL_AND_TIGHTEN "Cancel and Tighten"
119
    /// is used, which proved to be the most efficient and the most robust
120
    /// on various test inputs.
121
    /// However, the other methods can be selected using the \ref run()
122
    /// function with the proper parameter.
123
    enum Method {
124
      /// A simple cycle-canceling method, which uses the
125
      /// \ref BellmanFord "Bellman-Ford" algorithm with limited iteration
126
      /// number for detecting negative cycles in the residual network.
127
      SIMPLE_CYCLE_CANCELING,
128
      /// The "Minimum Mean Cycle-Canceling" algorithm, which is a
129
      /// well-known strongly polynomial method
130
      /// \ref goldberg89cyclecanceling. It improves along a
131
      /// \ref min_mean_cycle "minimum mean cycle" in each iteration.
132
      /// Its running time complexity is O(n<sup>2</sup>m<sup>3</sup>log(n)).
133
      MINIMUM_MEAN_CYCLE_CANCELING,
134
      /// The "Cancel And Tighten" algorithm, which can be viewed as an
135
      /// improved version of the previous method
136
      /// \ref goldberg89cyclecanceling.
137
      /// It is faster both in theory and in practice, its running time
138
      /// complexity is O(n<sup>2</sup>m<sup>2</sup>log(n)).
139
      CANCEL_AND_TIGHTEN
140
    };
141

	
142
  private:
143

	
144
    TEMPLATE_DIGRAPH_TYPEDEFS(GR);
145

	
146
    typedef std::vector<int> IntVector;
147
    typedef std::vector<double> DoubleVector;
148
    typedef std::vector<Value> ValueVector;
149
    typedef std::vector<Cost> CostVector;
150
    typedef std::vector<char> BoolVector;
151
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
152

	
153
  private:
154

	
155
    template <typename KT, typename VT>
156
    class StaticVectorMap {
157
    public:
158
      typedef KT Key;
159
      typedef VT Value;
160

	
161
      StaticVectorMap(std::vector<Value>& v) : _v(v) {}
162

	
163
      const Value& operator[](const Key& key) const {
164
        return _v[StaticDigraph::id(key)];
165
      }
166

	
167
      Value& operator[](const Key& key) {
168
        return _v[StaticDigraph::id(key)];
169
      }
170

	
171
      void set(const Key& key, const Value& val) {
172
        _v[StaticDigraph::id(key)] = val;
173
      }
174

	
175
    private:
176
      std::vector<Value>& _v;
177
    };
178

	
179
    typedef StaticVectorMap<StaticDigraph::Node, Cost> CostNodeMap;
180
    typedef StaticVectorMap<StaticDigraph::Arc, Cost> CostArcMap;
181

	
182
  private:
183

	
184

	
185
    // Data related to the underlying digraph
186
    const GR &_graph;
187
    int _node_num;
188
    int _arc_num;
189
    int _res_node_num;
190
    int _res_arc_num;
191
    int _root;
192

	
193
    // Parameters of the problem
194
    bool _have_lower;
195
    Value _sum_supply;
196

	
197
    // Data structures for storing the digraph
198
    IntNodeMap _node_id;
199
    IntArcMap _arc_idf;
200
    IntArcMap _arc_idb;
201
    IntVector _first_out;
202
    BoolVector _forward;
203
    IntVector _source;
204
    IntVector _target;
205
    IntVector _reverse;
206

	
207
    // Node and arc data
208
    ValueVector _lower;
209
    ValueVector _upper;
210
    CostVector _cost;
211
    ValueVector _supply;
212

	
213
    ValueVector _res_cap;
214
    CostVector _pi;
215

	
216
    // Data for a StaticDigraph structure
217
    typedef std::pair<int, int> IntPair;
218
    StaticDigraph _sgr;
219
    std::vector<IntPair> _arc_vec;
220
    std::vector<Cost> _cost_vec;
221
    IntVector _id_vec;
222
    CostArcMap _cost_map;
223
    CostNodeMap _pi_map;
224

	
225
  public:
226

	
227
    /// \brief Constant for infinite upper bounds (capacities).
228
    ///
229
    /// Constant for infinite upper bounds (capacities).
230
    /// It is \c std::numeric_limits<Value>::infinity() if available,
231
    /// \c std::numeric_limits<Value>::max() otherwise.
232
    const Value INF;
233

	
234
  public:
235

	
236
    /// \brief Constructor.
237
    ///
238
    /// The constructor of the class.
239
    ///
240
    /// \param graph The digraph the algorithm runs on.
241
    CycleCanceling(const GR& graph) :
242
      _graph(graph), _node_id(graph), _arc_idf(graph), _arc_idb(graph),
243
      _cost_map(_cost_vec), _pi_map(_pi),
244
      INF(std::numeric_limits<Value>::has_infinity ?
245
          std::numeric_limits<Value>::infinity() :
246
          std::numeric_limits<Value>::max())
247
    {
248
      // Check the number types
249
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
250
        "The flow type of CycleCanceling must be signed");
251
      LEMON_ASSERT(std::numeric_limits<Cost>::is_signed,
252
        "The cost type of CycleCanceling must be signed");
253

	
254
      // Reset data structures
255
      reset();
256
    }
257

	
258
    /// \name Parameters
259
    /// The parameters of the algorithm can be specified using these
260
    /// functions.
261

	
262
    /// @{
263

	
264
    /// \brief Set the lower bounds on the arcs.
265
    ///
266
    /// This function sets the lower bounds on the arcs.
267
    /// If it is not used before calling \ref run(), the lower bounds
268
    /// will be set to zero on all arcs.
269
    ///
270
    /// \param map An arc map storing the lower bounds.
271
    /// Its \c Value type must be convertible to the \c Value type
272
    /// of the algorithm.
273
    ///
274
    /// \return <tt>(*this)</tt>
275
    template <typename LowerMap>
276
    CycleCanceling& lowerMap(const LowerMap& map) {
277
      _have_lower = true;
278
      for (ArcIt a(_graph); a != INVALID; ++a) {
279
        _lower[_arc_idf[a]] = map[a];
280
        _lower[_arc_idb[a]] = map[a];
281
      }
282
      return *this;
283
    }
284

	
285
    /// \brief Set the upper bounds (capacities) on the arcs.
286
    ///
287
    /// This function sets the upper bounds (capacities) on the arcs.
288
    /// If it is not used before calling \ref run(), the upper bounds
289
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
290
    /// unbounded from above).
291
    ///
292
    /// \param map An arc map storing the upper bounds.
293
    /// Its \c Value type must be convertible to the \c Value type
294
    /// of the algorithm.
295
    ///
296
    /// \return <tt>(*this)</tt>
297
    template<typename UpperMap>
298
    CycleCanceling& upperMap(const UpperMap& map) {
299
      for (ArcIt a(_graph); a != INVALID; ++a) {
300
        _upper[_arc_idf[a]] = map[a];
301
      }
302
      return *this;
303
    }
304

	
305
    /// \brief Set the costs of the arcs.
306
    ///
307
    /// This function sets the costs of the arcs.
308
    /// If it is not used before calling \ref run(), the costs
309
    /// will be set to \c 1 on all arcs.
310
    ///
311
    /// \param map An arc map storing the costs.
312
    /// Its \c Value type must be convertible to the \c Cost type
313
    /// of the algorithm.
314
    ///
315
    /// \return <tt>(*this)</tt>
316
    template<typename CostMap>
317
    CycleCanceling& costMap(const CostMap& map) {
318
      for (ArcIt a(_graph); a != INVALID; ++a) {
319
        _cost[_arc_idf[a]] =  map[a];
320
        _cost[_arc_idb[a]] = -map[a];
321
      }
322
      return *this;
323
    }
324

	
325
    /// \brief Set the supply values of the nodes.
326
    ///
327
    /// This function sets the supply values of the nodes.
328
    /// If neither this function nor \ref stSupply() is used before
329
    /// calling \ref run(), the supply of each node will be set to zero.
330
    ///
331
    /// \param map A node map storing the supply values.
332
    /// Its \c Value type must be convertible to the \c Value type
333
    /// of the algorithm.
334
    ///
335
    /// \return <tt>(*this)</tt>
336
    template<typename SupplyMap>
337
    CycleCanceling& supplyMap(const SupplyMap& map) {
338
      for (NodeIt n(_graph); n != INVALID; ++n) {
339
        _supply[_node_id[n]] = map[n];
340
      }
341
      return *this;
342
    }
343

	
344
    /// \brief Set single source and target nodes and a supply value.
345
    ///
346
    /// This function sets a single source node and a single target node
347
    /// and the required flow value.
348
    /// If neither this function nor \ref supplyMap() is used before
349
    /// calling \ref run(), the supply of each node will be set to zero.
350
    ///
351
    /// Using this function has the same effect as using \ref supplyMap()
352
    /// with such a map in which \c k is assigned to \c s, \c -k is
353
    /// assigned to \c t and all other nodes have zero supply value.
354
    ///
355
    /// \param s The source node.
356
    /// \param t The target node.
357
    /// \param k The required amount of flow from node \c s to node \c t
358
    /// (i.e. the supply of \c s and the demand of \c t).
359
    ///
360
    /// \return <tt>(*this)</tt>
361
    CycleCanceling& stSupply(const Node& s, const Node& t, Value k) {
362
      for (int i = 0; i != _res_node_num; ++i) {
363
        _supply[i] = 0;
364
      }
365
      _supply[_node_id[s]] =  k;
366
      _supply[_node_id[t]] = -k;
367
      return *this;
368
    }
369

	
370
    /// @}
371

	
372
    /// \name Execution control
373
    /// The algorithm can be executed using \ref run().
374

	
375
    /// @{
376

	
377
    /// \brief Run the algorithm.
378
    ///
379
    /// This function runs the algorithm.
380
    /// The paramters can be specified using functions \ref lowerMap(),
381
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
382
    /// For example,
383
    /// \code
384
    ///   CycleCanceling<ListDigraph> cc(graph);
385
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
386
    ///     .supplyMap(sup).run();
387
    /// \endcode
388
    ///
389
    /// This function can be called more than once. All the given parameters
390
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
391
    /// is used, thus only the modified parameters have to be set again.
392
    /// If the underlying digraph was also modified after the construction
393
    /// of the class (or the last \ref reset() call), then the \ref reset()
394
    /// function must be called.
395
    ///
396
    /// \param method The cycle-canceling method that will be used.
397
    /// For more information, see \ref Method.
398
    ///
399
    /// \return \c INFEASIBLE if no feasible flow exists,
400
    /// \n \c OPTIMAL if the problem has optimal solution
401
    /// (i.e. it is feasible and bounded), and the algorithm has found
402
    /// optimal flow and node potentials (primal and dual solutions),
403
    /// \n \c UNBOUNDED if the digraph contains an arc of negative cost
404
    /// and infinite upper bound. It means that the objective function
405
    /// is unbounded on that arc, however, note that it could actually be
406
    /// bounded over the feasible flows, but this algroithm cannot handle
407
    /// these cases.
408
    ///
409
    /// \see ProblemType, Method
410
    /// \see resetParams(), reset()
411
    ProblemType run(Method method = CANCEL_AND_TIGHTEN) {
412
      ProblemType pt = init();
413
      if (pt != OPTIMAL) return pt;
414
      start(method);
415
      return OPTIMAL;
416
    }
417

	
418
    /// \brief Reset all the parameters that have been given before.
419
    ///
420
    /// This function resets all the paramaters that have been given
421
    /// before using functions \ref lowerMap(), \ref upperMap(),
422
    /// \ref costMap(), \ref supplyMap(), \ref stSupply().
423
    ///
424
    /// It is useful for multiple \ref run() calls. Basically, all the given
425
    /// parameters are kept for the next \ref run() call, unless
426
    /// \ref resetParams() or \ref reset() is used.
427
    /// If the underlying digraph was also modified after the construction
428
    /// of the class or the last \ref reset() call, then the \ref reset()
429
    /// function must be used, otherwise \ref resetParams() is sufficient.
430
    ///
431
    /// For example,
432
    /// \code
433
    ///   CycleCanceling<ListDigraph> cs(graph);
434
    ///
435
    ///   // First run
436
    ///   cc.lowerMap(lower).upperMap(upper).costMap(cost)
437
    ///     .supplyMap(sup).run();
438
    ///
439
    ///   // Run again with modified cost map (resetParams() is not called,
440
    ///   // so only the cost map have to be set again)
441
    ///   cost[e] += 100;
442
    ///   cc.costMap(cost).run();
443
    ///
444
    ///   // Run again from scratch using resetParams()
445
    ///   // (the lower bounds will be set to zero on all arcs)
446
    ///   cc.resetParams();
447
    ///   cc.upperMap(capacity).costMap(cost)
448
    ///     .supplyMap(sup).run();
449
    /// \endcode
450
    ///
451
    /// \return <tt>(*this)</tt>
452
    ///
453
    /// \see reset(), run()
454
    CycleCanceling& resetParams() {
455
      for (int i = 0; i != _res_node_num; ++i) {
456
        _supply[i] = 0;
457
      }
458
      int limit = _first_out[_root];
459
      for (int j = 0; j != limit; ++j) {
460
        _lower[j] = 0;
461
        _upper[j] = INF;
462
        _cost[j] = _forward[j] ? 1 : -1;
463
      }
464
      for (int j = limit; j != _res_arc_num; ++j) {
465
        _lower[j] = 0;
466
        _upper[j] = INF;
467
        _cost[j] = 0;
468
        _cost[_reverse[j]] = 0;
469
      }
470
      _have_lower = false;
471
      return *this;
472
    }
473

	
474
    /// \brief Reset the internal data structures and all the parameters
475
    /// that have been given before.
476
    ///
477
    /// This function resets the internal data structures and all the
478
    /// paramaters that have been given before using functions \ref lowerMap(),
479
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply().
480
    ///
481
    /// It is useful for multiple \ref run() calls. Basically, all the given
482
    /// parameters are kept for the next \ref run() call, unless
483
    /// \ref resetParams() or \ref reset() is used.
484
    /// If the underlying digraph was also modified after the construction
485
    /// of the class or the last \ref reset() call, then the \ref reset()
486
    /// function must be used, otherwise \ref resetParams() is sufficient.
487
    ///
488
    /// See \ref resetParams() for examples.
489
    ///
490
    /// \return <tt>(*this)</tt>
491
    ///
492
    /// \see resetParams(), run()
493
    CycleCanceling& reset() {
494
      // Resize vectors
495
      _node_num = countNodes(_graph);
496
      _arc_num = countArcs(_graph);
497
      _res_node_num = _node_num + 1;
498
      _res_arc_num = 2 * (_arc_num + _node_num);
499
      _root = _node_num;
500

	
501
      _first_out.resize(_res_node_num + 1);
502
      _forward.resize(_res_arc_num);
503
      _source.resize(_res_arc_num);
504
      _target.resize(_res_arc_num);
505
      _reverse.resize(_res_arc_num);
506

	
507
      _lower.resize(_res_arc_num);
508
      _upper.resize(_res_arc_num);
509
      _cost.resize(_res_arc_num);
510
      _supply.resize(_res_node_num);
511

	
512
      _res_cap.resize(_res_arc_num);
513
      _pi.resize(_res_node_num);
514

	
515
      _arc_vec.reserve(_res_arc_num);
516
      _cost_vec.reserve(_res_arc_num);
517
      _id_vec.reserve(_res_arc_num);
518

	
519
      // Copy the graph
520
      int i = 0, j = 0, k = 2 * _arc_num + _node_num;
521
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
522
        _node_id[n] = i;
523
      }
524
      i = 0;
525
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
526
        _first_out[i] = j;
527
        for (OutArcIt a(_graph, n); a != INVALID; ++a, ++j) {
528
          _arc_idf[a] = j;
529
          _forward[j] = true;
530
          _source[j] = i;
531
          _target[j] = _node_id[_graph.runningNode(a)];
532
        }
533
        for (InArcIt a(_graph, n); a != INVALID; ++a, ++j) {
534
          _arc_idb[a] = j;
535
          _forward[j] = false;
536
          _source[j] = i;
537
          _target[j] = _node_id[_graph.runningNode(a)];
538
        }
539
        _forward[j] = false;
540
        _source[j] = i;
541
        _target[j] = _root;
542
        _reverse[j] = k;
543
        _forward[k] = true;
544
        _source[k] = _root;
545
        _target[k] = i;
546
        _reverse[k] = j;
547
        ++j; ++k;
548
      }
549
      _first_out[i] = j;
550
      _first_out[_res_node_num] = k;
551
      for (ArcIt a(_graph); a != INVALID; ++a) {
552
        int fi = _arc_idf[a];
553
        int bi = _arc_idb[a];
554
        _reverse[fi] = bi;
555
        _reverse[bi] = fi;
556
      }
557

	
558
      // Reset parameters
559
      resetParams();
560
      return *this;
561
    }
562

	
563
    /// @}
564

	
565
    /// \name Query Functions
566
    /// The results of the algorithm can be obtained using these
567
    /// functions.\n
568
    /// The \ref run() function must be called before using them.
569

	
570
    /// @{
571

	
572
    /// \brief Return the total cost of the found flow.
573
    ///
574
    /// This function returns the total cost of the found flow.
575
    /// Its complexity is O(e).
576
    ///
577
    /// \note The return type of the function can be specified as a
578
    /// template parameter. For example,
579
    /// \code
580
    ///   cc.totalCost<double>();
581
    /// \endcode
582
    /// It is useful if the total cost cannot be stored in the \c Cost
583
    /// type of the algorithm, which is the default return type of the
584
    /// function.
585
    ///
586
    /// \pre \ref run() must be called before using this function.
587
    template <typename Number>
588
    Number totalCost() const {
589
      Number c = 0;
590
      for (ArcIt a(_graph); a != INVALID; ++a) {
591
        int i = _arc_idb[a];
592
        c += static_cast<Number>(_res_cap[i]) *
593
             (-static_cast<Number>(_cost[i]));
594
      }
595
      return c;
596
    }
597

	
598
#ifndef DOXYGEN
599
    Cost totalCost() const {
600
      return totalCost<Cost>();
601
    }
602
#endif
603

	
604
    /// \brief Return the flow on the given arc.
605
    ///
606
    /// This function returns the flow on the given arc.
607
    ///
608
    /// \pre \ref run() must be called before using this function.
609
    Value flow(const Arc& a) const {
610
      return _res_cap[_arc_idb[a]];
611
    }
612

	
613
    /// \brief Return the flow map (the primal solution).
614
    ///
615
    /// This function copies the flow value on each arc into the given
616
    /// map. The \c Value type of the algorithm must be convertible to
617
    /// the \c Value type of the map.
618
    ///
619
    /// \pre \ref run() must be called before using this function.
620
    template <typename FlowMap>
621
    void flowMap(FlowMap &map) const {
622
      for (ArcIt a(_graph); a != INVALID; ++a) {
623
        map.set(a, _res_cap[_arc_idb[a]]);
624
      }
625
    }
626

	
627
    /// \brief Return the potential (dual value) of the given node.
628
    ///
629
    /// This function returns the potential (dual value) of the
630
    /// given node.
631
    ///
632
    /// \pre \ref run() must be called before using this function.
633
    Cost potential(const Node& n) const {
634
      return static_cast<Cost>(_pi[_node_id[n]]);
635
    }
636

	
637
    /// \brief Return the potential map (the dual solution).
638
    ///
639
    /// This function copies the potential (dual value) of each node
640
    /// into the given map.
641
    /// The \c Cost type of the algorithm must be convertible to the
642
    /// \c Value type of the map.
643
    ///
644
    /// \pre \ref run() must be called before using this function.
645
    template <typename PotentialMap>
646
    void potentialMap(PotentialMap &map) const {
647
      for (NodeIt n(_graph); n != INVALID; ++n) {
648
        map.set(n, static_cast<Cost>(_pi[_node_id[n]]));
649
      }
650
    }
651

	
652
    /// @}
653

	
654
  private:
655

	
656
    // Initialize the algorithm
657
    ProblemType init() {
658
      if (_res_node_num <= 1) return INFEASIBLE;
659

	
660
      // Check the sum of supply values
661
      _sum_supply = 0;
662
      for (int i = 0; i != _root; ++i) {
663
        _sum_supply += _supply[i];
664
      }
665
      if (_sum_supply > 0) return INFEASIBLE;
666

	
667

	
668
      // Initialize vectors
669
      for (int i = 0; i != _res_node_num; ++i) {
670
        _pi[i] = 0;
671
      }
672
      ValueVector excess(_supply);
673

	
674
      // Remove infinite upper bounds and check negative arcs
675
      const Value MAX = std::numeric_limits<Value>::max();
676
      int last_out;
677
      if (_have_lower) {
678
        for (int i = 0; i != _root; ++i) {
679
          last_out = _first_out[i+1];
680
          for (int j = _first_out[i]; j != last_out; ++j) {
681
            if (_forward[j]) {
682
              Value c = _cost[j] < 0 ? _upper[j] : _lower[j];
683
              if (c >= MAX) return UNBOUNDED;
684
              excess[i] -= c;
685
              excess[_target[j]] += c;
686
            }
687
          }
688
        }
689
      } else {
690
        for (int i = 0; i != _root; ++i) {
691
          last_out = _first_out[i+1];
692
          for (int j = _first_out[i]; j != last_out; ++j) {
693
            if (_forward[j] && _cost[j] < 0) {
694
              Value c = _upper[j];
695
              if (c >= MAX) return UNBOUNDED;
696
              excess[i] -= c;
697
              excess[_target[j]] += c;
698
            }
699
          }
700
        }
701
      }
702
      Value ex, max_cap = 0;
703
      for (int i = 0; i != _res_node_num; ++i) {
704
        ex = excess[i];
705
        if (ex < 0) max_cap -= ex;
706
      }
707
      for (int j = 0; j != _res_arc_num; ++j) {
708
        if (_upper[j] >= MAX) _upper[j] = max_cap;
709
      }
710

	
711
      // Initialize maps for Circulation and remove non-zero lower bounds
712
      ConstMap<Arc, Value> low(0);
713
      typedef typename Digraph::template ArcMap<Value> ValueArcMap;
714
      typedef typename Digraph::template NodeMap<Value> ValueNodeMap;
715
      ValueArcMap cap(_graph), flow(_graph);
716
      ValueNodeMap sup(_graph);
717
      for (NodeIt n(_graph); n != INVALID; ++n) {
718
        sup[n] = _supply[_node_id[n]];
719
      }
720
      if (_have_lower) {
721
        for (ArcIt a(_graph); a != INVALID; ++a) {
722
          int j = _arc_idf[a];
723
          Value c = _lower[j];
724
          cap[a] = _upper[j] - c;
725
          sup[_graph.source(a)] -= c;
726
          sup[_graph.target(a)] += c;
727
        }
728
      } else {
729
        for (ArcIt a(_graph); a != INVALID; ++a) {
730
          cap[a] = _upper[_arc_idf[a]];
731
        }
732
      }
733

	
734
      // Find a feasible flow using Circulation
735
      Circulation<Digraph, ConstMap<Arc, Value>, ValueArcMap, ValueNodeMap>
736
        circ(_graph, low, cap, sup);
737
      if (!circ.flowMap(flow).run()) return INFEASIBLE;
738

	
739
      // Set residual capacities and handle GEQ supply type
740
      if (_sum_supply < 0) {
741
        for (ArcIt a(_graph); a != INVALID; ++a) {
742
          Value fa = flow[a];
743
          _res_cap[_arc_idf[a]] = cap[a] - fa;
744
          _res_cap[_arc_idb[a]] = fa;
745
          sup[_graph.source(a)] -= fa;
746
          sup[_graph.target(a)] += fa;
747
        }
748
        for (NodeIt n(_graph); n != INVALID; ++n) {
749
          excess[_node_id[n]] = sup[n];
750
        }
751
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
752
          int u = _target[a];
753
          int ra = _reverse[a];
754
          _res_cap[a] = -_sum_supply + 1;
755
          _res_cap[ra] = -excess[u];
756
          _cost[a] = 0;
757
          _cost[ra] = 0;
758
        }
759
      } else {
760
        for (ArcIt a(_graph); a != INVALID; ++a) {
761
          Value fa = flow[a];
762
          _res_cap[_arc_idf[a]] = cap[a] - fa;
763
          _res_cap[_arc_idb[a]] = fa;
764
        }
765
        for (int a = _first_out[_root]; a != _res_arc_num; ++a) {
766
          int ra = _reverse[a];
767
          _res_cap[a] = 1;
768
          _res_cap[ra] = 0;
769
          _cost[a] = 0;
770
          _cost[ra] = 0;
771
        }
772
      }
773

	
774
      return OPTIMAL;
775
    }
776

	
777
    // Build a StaticDigraph structure containing the current
778
    // residual network
779
    void buildResidualNetwork() {
780
      _arc_vec.clear();
781
      _cost_vec.clear();
782
      _id_vec.clear();
783
      for (int j = 0; j != _res_arc_num; ++j) {
784
        if (_res_cap[j] > 0) {
785
          _arc_vec.push_back(IntPair(_source[j], _target[j]));
786
          _cost_vec.push_back(_cost[j]);
787
          _id_vec.push_back(j);
788
        }
789
      }
790
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
791
    }
792

	
793
    // Execute the algorithm and transform the results
794
    void start(Method method) {
795
      // Execute the algorithm
796
      switch (method) {
797
        case SIMPLE_CYCLE_CANCELING:
798
          startSimpleCycleCanceling();
799
          break;
800
        case MINIMUM_MEAN_CYCLE_CANCELING:
801
          startMinMeanCycleCanceling();
802
          break;
803
        case CANCEL_AND_TIGHTEN:
804
          startCancelAndTighten();
805
          break;
806
      }
807

	
808
      // Compute node potentials
809
      if (method != SIMPLE_CYCLE_CANCELING) {
810
        buildResidualNetwork();
811
        typename BellmanFord<StaticDigraph, CostArcMap>
812
          ::template SetDistMap<CostNodeMap>::Create bf(_sgr, _cost_map);
813
        bf.distMap(_pi_map);
814
        bf.init(0);
815
        bf.start();
816
      }
817

	
818
      // Handle non-zero lower bounds
819
      if (_have_lower) {
820
        int limit = _first_out[_root];
821
        for (int j = 0; j != limit; ++j) {
822
          if (!_forward[j]) _res_cap[j] += _lower[j];
823
        }
824
      }
825
    }
826

	
827
    // Execute the "Simple Cycle Canceling" method
828
    void startSimpleCycleCanceling() {
829
      // Constants for computing the iteration limits
830
      const int BF_FIRST_LIMIT  = 2;
831
      const double BF_LIMIT_FACTOR = 1.5;
832

	
833
      typedef StaticVectorMap<StaticDigraph::Arc, Value> FilterMap;
834
      typedef FilterArcs<StaticDigraph, FilterMap> ResDigraph;
835
      typedef StaticVectorMap<StaticDigraph::Node, StaticDigraph::Arc> PredMap;
836
      typedef typename BellmanFord<ResDigraph, CostArcMap>
837
        ::template SetDistMap<CostNodeMap>
838
        ::template SetPredMap<PredMap>::Create BF;
839

	
840
      // Build the residual network
841
      _arc_vec.clear();
842
      _cost_vec.clear();
843
      for (int j = 0; j != _res_arc_num; ++j) {
844
        _arc_vec.push_back(IntPair(_source[j], _target[j]));
845
        _cost_vec.push_back(_cost[j]);
846
      }
847
      _sgr.build(_res_node_num, _arc_vec.begin(), _arc_vec.end());
848

	
849
      FilterMap filter_map(_res_cap);
850
      ResDigraph rgr(_sgr, filter_map);
851
      std::vector<int> cycle;
852
      std::vector<StaticDigraph::Arc> pred(_res_arc_num);
853
      PredMap pred_map(pred);
854
      BF bf(rgr, _cost_map);
855
      bf.distMap(_pi_map).predMap(pred_map);
856

	
857
      int length_bound = BF_FIRST_LIMIT;
858
      bool optimal = false;
859
      while (!optimal) {
860
        bf.init(0);
861
        int iter_num = 0;
862
        bool cycle_found = false;
863
        while (!cycle_found) {
864
          // Perform some iterations of the Bellman-Ford algorithm
865
          int curr_iter_num = iter_num + length_bound <= _node_num ?
866
            length_bound : _node_num - iter_num;
867
          iter_num += curr_iter_num;
868
          int real_iter_num = curr_iter_num;
869
          for (int i = 0; i < curr_iter_num; ++i) {
870
            if (bf.processNextWeakRound()) {
871
              real_iter_num = i;
872
              break;
873
            }
874
          }
875
          if (real_iter_num < curr_iter_num) {
876
            // Optimal flow is found
877
            optimal = true;
878
            break;
879
          } else {
880
            // Search for node disjoint negative cycles
881
            std::vector<int> state(_res_node_num, 0);
882
            int id = 0;
883
            for (int u = 0; u != _res_node_num; ++u) {
884
              if (state[u] != 0) continue;
885
              ++id;
886
              int v = u;
887
              for (; v != -1 && state[v] == 0; v = pred[v] == INVALID ?
888
                   -1 : rgr.id(rgr.source(pred[v]))) {
889
                state[v] = id;
890
              }
891
              if (v != -1 && state[v] == id) {
892
                // A negative cycle is found
893
                cycle_found = true;
894
                cycle.clear();
895
                StaticDigraph::Arc a = pred[v];
896
                Value d, delta = _res_cap[rgr.id(a)];
897
                cycle.push_back(rgr.id(a));
898
                while (rgr.id(rgr.source(a)) != v) {
899
                  a = pred_map[rgr.source(a)];
900
                  d = _res_cap[rgr.id(a)];
901
                  if (d < delta) delta = d;
902
                  cycle.push_back(rgr.id(a));
903
                }
904

	
905
                // Augment along the cycle
906
                for (int i = 0; i < int(cycle.size()); ++i) {
907
                  int j = cycle[i];
908
                  _res_cap[j] -= delta;
909
                  _res_cap[_reverse[j]] += delta;
910
                }
911
              }
912
            }
913
          }
914

	
915
          // Increase iteration limit if no cycle is found
916
          if (!cycle_found) {
917
            length_bound = static_cast<int>(length_bound * BF_LIMIT_FACTOR);
918
          }
919
        }
920
      }
921
    }
922

	
923
    // Execute the "Minimum Mean Cycle Canceling" method
924
    void startMinMeanCycleCanceling() {
925
      typedef SimplePath<StaticDigraph> SPath;
926
      typedef typename SPath::ArcIt SPathArcIt;
927
      typedef typename HowardMmc<StaticDigraph, CostArcMap>
928
        ::template SetPath<SPath>::Create MMC;
929

	
930
      SPath cycle;
931
      MMC mmc(_sgr, _cost_map);
932
      mmc.cycle(cycle);
933
      buildResidualNetwork();
934
      while (mmc.findCycleMean() && mmc.cycleCost() < 0) {
935
        // Find the cycle
936
        mmc.findCycle();
937

	
938
        // Compute delta value
939
        Value delta = INF;
940
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
941
          Value d = _res_cap[_id_vec[_sgr.id(a)]];
942
          if (d < delta) delta = d;
943
        }
944

	
945
        // Augment along the cycle
946
        for (SPathArcIt a(cycle); a != INVALID; ++a) {
947
          int j = _id_vec[_sgr.id(a)];
948
          _res_cap[j] -= delta;
949
          _res_cap[_reverse[j]] += delta;
950
        }
951

	
952
        // Rebuild the residual network
953
        buildResidualNetwork();
954
      }
955
    }
956

	
957
    // Execute the "Cancel And Tighten" method
958
    void startCancelAndTighten() {
959
      // Constants for the min mean cycle computations
960
      const double LIMIT_FACTOR = 1.0;
961
      const int MIN_LIMIT = 5;
962

	
963
      // Contruct auxiliary data vectors
964
      DoubleVector pi(_res_node_num, 0.0);
965
      IntVector level(_res_node_num);
966
      BoolVector reached(_res_node_num);
967
      BoolVector processed(_res_node_num);
968
      IntVector pred_node(_res_node_num);
969
      IntVector pred_arc(_res_node_num);
970
      std::vector<int> stack(_res_node_num);
971
      std::vector<int> proc_vector(_res_node_num);
972

	
973
      // Initialize epsilon
974
      double epsilon = 0;
975
      for (int a = 0; a != _res_arc_num; ++a) {
976
        if (_res_cap[a] > 0 && -_cost[a] > epsilon)
977
          epsilon = -_cost[a];
978
      }
979

	
980
      // Start phases
981
      Tolerance<double> tol;
982
      tol.epsilon(1e-6);
983
      int limit = int(LIMIT_FACTOR * std::sqrt(double(_res_node_num)));
984
      if (limit < MIN_LIMIT) limit = MIN_LIMIT;
985
      int iter = limit;
986
      while (epsilon * _res_node_num >= 1) {
987
        // Find and cancel cycles in the admissible network using DFS
988
        for (int u = 0; u != _res_node_num; ++u) {
989
          reached[u] = false;
990
          processed[u] = false;
991
        }
992
        int stack_head = -1;
993
        int proc_head = -1;
994
        for (int start = 0; start != _res_node_num; ++start) {
995
          if (reached[start]) continue;
996

	
997
          // New start node
998
          reached[start] = true;
999
          pred_arc[start] = -1;
1000
          pred_node[start] = -1;
1001

	
1002
          // Find the first admissible outgoing arc
1003
          double p = pi[start];
1004
          int a = _first_out[start];
1005
          int last_out = _first_out[start+1];
1006
          for (; a != last_out && (_res_cap[a] == 0 ||
1007
               !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1008
          if (a == last_out) {
1009
            processed[start] = true;
1010
            proc_vector[++proc_head] = start;
1011
            continue;
1012
          }
1013
          stack[++stack_head] = a;
1014

	
1015
          while (stack_head >= 0) {
1016
            int sa = stack[stack_head];
1017
            int u = _source[sa];
1018
            int v = _target[sa];
1019

	
1020
            if (!reached[v]) {
1021
              // A new node is reached
1022
              reached[v] = true;
1023
              pred_node[v] = u;
1024
              pred_arc[v] = sa;
1025
              p = pi[v];
1026
              a = _first_out[v];
1027
              last_out = _first_out[v+1];
1028
              for (; a != last_out && (_res_cap[a] == 0 ||
1029
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1030
              stack[++stack_head] = a == last_out ? -1 : a;
1031
            } else {
1032
              if (!processed[v]) {
1033
                // A cycle is found
1034
                int n, w = u;
1035
                Value d, delta = _res_cap[sa];
1036
                for (n = u; n != v; n = pred_node[n]) {
1037
                  d = _res_cap[pred_arc[n]];
1038
                  if (d <= delta) {
1039
                    delta = d;
1040
                    w = pred_node[n];
1041
                  }
1042
                }
1043

	
1044
                // Augment along the cycle
1045
                _res_cap[sa] -= delta;
1046
                _res_cap[_reverse[sa]] += delta;
1047
                for (n = u; n != v; n = pred_node[n]) {
1048
                  int pa = pred_arc[n];
1049
                  _res_cap[pa] -= delta;
1050
                  _res_cap[_reverse[pa]] += delta;
1051
                }
1052
                for (n = u; stack_head > 0 && n != w; n = pred_node[n]) {
1053
                  --stack_head;
1054
                  reached[n] = false;
1055
                }
1056
                u = w;
1057
              }
1058
              v = u;
1059

	
1060
              // Find the next admissible outgoing arc
1061
              p = pi[v];
1062
              a = stack[stack_head] + 1;
1063
              last_out = _first_out[v+1];
1064
              for (; a != last_out && (_res_cap[a] == 0 ||
1065
                   !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1066
              stack[stack_head] = a == last_out ? -1 : a;
1067
            }
1068

	
1069
            while (stack_head >= 0 && stack[stack_head] == -1) {
1070
              processed[v] = true;
1071
              proc_vector[++proc_head] = v;
1072
              if (--stack_head >= 0) {
1073
                // Find the next admissible outgoing arc
1074
                v = _source[stack[stack_head]];
1075
                p = pi[v];
1076
                a = stack[stack_head] + 1;
1077
                last_out = _first_out[v+1];
1078
                for (; a != last_out && (_res_cap[a] == 0 ||
1079
                     !tol.negative(_cost[a] + p - pi[_target[a]])); ++a) ;
1080
                stack[stack_head] = a == last_out ? -1 : a;
1081
              }
1082
            }
1083
          }
1084
        }
1085

	
1086
        // Tighten potentials and epsilon
1087
        if (--iter > 0) {
1088
          for (int u = 0; u != _res_node_num; ++u) {
1089
            level[u] = 0;
1090
          }
1091
          for (int i = proc_head; i > 0; --i) {
1092
            int u = proc_vector[i];
1093
            double p = pi[u];
1094
            int l = level[u] + 1;
1095
            int last_out = _first_out[u+1];
1096
            for (int a = _first_out[u]; a != last_out; ++a) {
1097
              int v = _target[a];
1098
              if (_res_cap[a] > 0 && tol.negative(_cost[a] + p - pi[v]) &&
1099
                  l > level[v]) level[v] = l;
1100
            }
1101
          }
1102

	
1103
          // Modify potentials
1104
          double q = std::numeric_limits<double>::max();
1105
          for (int u = 0; u != _res_node_num; ++u) {
1106
            int lu = level[u];
1107
            double p, pu = pi[u];
1108
            int last_out = _first_out[u+1];
1109
            for (int a = _first_out[u]; a != last_out; ++a) {
1110
              if (_res_cap[a] == 0) continue;
1111
              int v = _target[a];
1112
              int ld = lu - level[v];
1113
              if (ld > 0) {
1114
                p = (_cost[a] + pu - pi[v] + epsilon) / (ld + 1);
1115
                if (p < q) q = p;
1116
              }
1117
            }
1118
          }
1119
          for (int u = 0; u != _res_node_num; ++u) {
1120
            pi[u] -= q * level[u];
1121
          }
1122

	
1123
          // Modify epsilon
1124
          epsilon = 0;
1125
          for (int u = 0; u != _res_node_num; ++u) {
1126
            double curr, pu = pi[u];
1127
            int last_out = _first_out[u+1];
1128
            for (int a = _first_out[u]; a != last_out; ++a) {
1129
              if (_res_cap[a] == 0) continue;
1130
              curr = _cost[a] + pu - pi[_target[a]];
1131
              if (-curr > epsilon) epsilon = -curr;
1132
            }
1133
          }
1134
        } else {
1135
          typedef HowardMmc<StaticDigraph, CostArcMap> MMC;
1136
          typedef typename BellmanFord<StaticDigraph, CostArcMap>
1137
            ::template SetDistMap<CostNodeMap>::Create BF;
1138

	
1139
          // Set epsilon to the minimum cycle mean
1140
          buildResidualNetwork();
1141
          MMC mmc(_sgr, _cost_map);
1142
          mmc.findCycleMean();
1143
          epsilon = -mmc.cycleMean();
1144
          Cost cycle_cost = mmc.cycleCost();
1145
          int cycle_size = mmc.cycleSize();
1146

	
1147
          // Compute feasible potentials for the current epsilon
1148
          for (int i = 0; i != int(_cost_vec.size()); ++i) {
1149
            _cost_vec[i] = cycle_size * _cost_vec[i] - cycle_cost;
1150
          }
1151
          BF bf(_sgr, _cost_map);
1152
          bf.distMap(_pi_map);
1153
          bf.init(0);
1154
          bf.start();
1155
          for (int u = 0; u != _res_node_num; ++u) {
1156
            pi[u] = static_cast<double>(_pi[u]) / cycle_size;
1157
          }
1158

	
1159
          iter = limit;
1160
        }
1161
      }
1162
    }
1163

	
1164
  }; //class CycleCanceling
1165

	
1166
  ///@}
1167

	
1168
} //namespace lemon
1169

	
1170
#endif //LEMON_CYCLE_CANCELING_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
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_DHEAP_H
20
#define LEMON_DHEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief D-ary heap implementation.
25

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

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief D-ary heap data structure.
35
  ///
36
  /// This class implements the \e D-ary \e heap data structure.
37
  /// It fully conforms to the \ref concepts::Heap "heap concept".
38
  ///
39
  /// The \ref DHeap "D-ary heap" is a generalization of the
40
  /// \ref BinHeap "binary heap" structure, its nodes have at most
41
  /// \c D children, instead of two.
42
  /// \ref BinHeap and \ref QuadHeap are specialized implementations
43
  /// of this structure for <tt>D=2</tt> and <tt>D=4</tt>, respectively.
44
  ///
45
  /// \tparam PR Type of the priorities of the items.
46
  /// \tparam IM A read-writable item map with \c int values, used
47
  /// internally to handle the cross references.
48
  /// \tparam D The degree of the heap, each node have at most \e D
49
  /// children. The default is 16. Powers of two are suggested to use
50
  /// so that the multiplications and divisions needed to traverse the
51
  /// nodes of the heap could be performed faster.
52
  /// \tparam CMP A functor class for comparing the priorities.
53
  /// The default is \c std::less<PR>.
54
  ///
55
  ///\sa BinHeap
56
  ///\sa FouraryHeap
57
#ifdef DOXYGEN
58
  template <typename PR, typename IM, int D, typename CMP>
59
#else
60
  template <typename PR, typename IM, int D = 16,
61
            typename CMP = std::less<PR> >
62
#endif
63
  class DHeap {
64
  public:
65
    /// Type of the item-int map.
66
    typedef IM ItemIntMap;
67
    /// Type of the priorities.
68
    typedef PR Prio;
69
    /// Type of the items stored in the heap.
70
    typedef typename ItemIntMap::Key Item;
71
    /// Type of the item-priority pairs.
72
    typedef std::pair<Item,Prio> Pair;
73
    /// Functor type for comparing the priorities.
74
    typedef CMP Compare;
75

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

	
90
  private:
91
    std::vector<Pair> _data;
92
    Compare _comp;
93
    ItemIntMap &_iim;
94

	
95
  public:
96
    /// \brief Constructor.
97
    ///
98
    /// Constructor.
99
    /// \param map A map that assigns \c int values to the items.
100
    /// It is used internally to handle the cross references.
101
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
102
    explicit DHeap(ItemIntMap &map) : _iim(map) {}
103

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

	
114
    /// \brief The number of items stored in the heap.
115
    ///
116
    /// This function returns the number of items stored in the heap.
117
    int size() const { return _data.size(); }
118

	
119
    /// \brief Check if the heap is empty.
120
    ///
121
    /// This function returns \c true if the heap is empty.
122
    bool empty() const { return _data.empty(); }
123

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

	
133
  private:
134
    int parent(int i) { return (i-1)/D; }
135
    int firstChild(int i) { return D*i+1; }
136

	
137
    bool less(const Pair &p1, const Pair &p2) const {
138
      return _comp(p1.second, p2.second);
139
    }
140

	
141
    void bubbleUp(int hole, Pair p) {
142
      int par = parent(hole);
143
      while( hole>0 && less(p,_data[par]) ) {
144
        move(_data[par],hole);
145
        hole = par;
146
        par = parent(hole);
147
      }
148
      move(p, hole);
149
    }
150

	
151
    void bubbleDown(int hole, Pair p, int length) {
152
      if( length>1 ) {
153
        int child = firstChild(hole);
154
        while( child+D<=length ) {
155
          int min=child;
156
          for (int i=1; i<D; ++i) {
157
            if( less(_data[child+i], _data[min]) )
158
              min=child+i;
159
          }
160
          if( !less(_data[min], p) )
161
            goto ok;
162
          move(_data[min], hole);
163
          hole = min;
164
          child = firstChild(hole);
165
        }
166
        if ( child<length ) {
167
          int min = child;
168
          while (++child < length) {
169
            if( less(_data[child], _data[min]) )
170
              min=child;
171
          }
172
          if( less(_data[min], p) ) {
173
            move(_data[min], hole);
174
            hole = min;
175
          }
176
        }
177
      }
178
    ok:
179
      move(p, hole);
180
    }
181

	
182
    void move(const Pair &p, int i) {
183
      _data[i] = p;
184
      _iim.set(p.first, i);
185
    }
186

	
187
  public:
188
    /// \brief Insert a pair of item and priority into the heap.
189
    ///
190
    /// This function inserts \c p.first to the heap with priority
191
    /// \c p.second.
192
    /// \param p The pair to insert.
193
    /// \pre \c p.first must not be stored in the heap.
194
    void push(const Pair &p) {
195
      int n = _data.size();
196
      _data.resize(n+1);
197
      bubbleUp(n, p);
198
    }
199

	
200
    /// \brief Insert an item into the heap with the given priority.
201
    ///
202
    /// This function inserts the given item into the heap with the
203
    /// given priority.
204
    /// \param i The item to insert.
205
    /// \param p The priority of the item.
206
    /// \pre \e i must not be stored in the heap.
207
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
208

	
209
    /// \brief Return the item having minimum priority.
210
    ///
211
    /// This function returns the item having minimum priority.
212
    /// \pre The heap must be non-empty.
213
    Item top() const { return _data[0].first; }
214

	
215
    /// \brief The minimum priority.
216
    ///
217
    /// This function returns the minimum priority.
218
    /// \pre The heap must be non-empty.
219
    Prio prio() const { return _data[0].second; }
220

	
221
    /// \brief Remove the item having minimum priority.
222
    ///
223
    /// This function removes the item having minimum priority.
224
    /// \pre The heap must be non-empty.
225
    void pop() {
226
      int n = _data.size()-1;
227
      _iim.set(_data[0].first, POST_HEAP);
228
      if (n>0) bubbleDown(0, _data[n], n);
229
      _data.pop_back();
230
    }
231

	
232
    /// \brief Remove the given item from the heap.
233
    ///
234
    /// This function removes the given item from the heap if it is
235
    /// already stored.
236
    /// \param i The item to delete.
237
    /// \pre \e i must be in the heap.
238
    void erase(const Item &i) {
239
      int h = _iim[i];
240
      int n = _data.size()-1;
241
      _iim.set(_data[h].first, POST_HEAP);
242
      if( h<n ) {
243
        if( less(_data[parent(h)], _data[n]) )
244
          bubbleDown(h, _data[n], n);
245
        else
246
          bubbleUp(h, _data[n]);
247
      }
248
      _data.pop_back();
249
    }
250

	
251
    /// \brief The priority of the given item.
252
    ///
253
    /// This function returns the priority of the given item.
254
    /// \param i The item.
255
    /// \pre \e i must be in the heap.
256
    Prio operator[](const Item &i) const {
257
      int idx = _iim[i];
258
      return _data[idx].second;
259
    }
260

	
261
    /// \brief Set the priority of an item or insert it, if it is
262
    /// not stored in the heap.
263
    ///
264
    /// This method sets the priority of the given item if it is
265
    /// already stored in the heap. Otherwise it inserts the given
266
    /// item into the heap with the given priority.
267
    /// \param i The item.
268
    /// \param p The priority.
269
    void set(const Item &i, const Prio &p) {
270
      int idx = _iim[i];
271
      if( idx<0 )
272
        push(i,p);
273
      else if( _comp(p, _data[idx].second) )
274
        bubbleUp(idx, Pair(i,p));
275
      else
276
        bubbleDown(idx, Pair(i,p), _data.size());
277
    }
278

	
279
    /// \brief Decrease the priority of an item to the given value.
280
    ///
281
    /// This function decreases the priority of an item to the given value.
282
    /// \param i The item.
283
    /// \param p The priority.
284
    /// \pre \e i must be stored in the heap with priority at least \e p.
285
    void decrease(const Item &i, const Prio &p) {
286
      int idx = _iim[i];
287
      bubbleUp(idx, Pair(i,p));
288
    }
289

	
290
    /// \brief Increase the priority of an item to the given value.
291
    ///
292
    /// This function increases the priority of an item to the given value.
293
    /// \param i The item.
294
    /// \param p The priority.
295
    /// \pre \e i must be stored in the heap with priority at most \e p.
296
    void increase(const Item &i, const Prio &p) {
297
      int idx = _iim[i];
298
      bubbleDown(idx, Pair(i,p), _data.size());
299
    }
300

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

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

	
334
    /// \brief Replace an item in the heap.
335
    ///
336
    /// This function replaces item \c i with item \c j.
337
    /// Item \c i must be in the heap, while \c j must be out of the heap.
338
    /// After calling this method, item \c i will be out of the
339
    /// heap and \c j will be in the heap with the same prioriority
340
    /// as item \c i had before.
341
    void replace(const Item& i, const Item& j) {
342
      int idx=_iim[i];
343
      _iim.set(i, _iim[j]);
344
      _iim.set(j, idx);
345
      _data[idx].first=j;
346
    }
347

	
348
  }; // class DHeap
349

	
350
} // namespace lemon
351

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

	
19
#ifndef LEMON_FRACTIONAL_MATCHING_H
20
#define LEMON_FRACTIONAL_MATCHING_H
21

	
22
#include <vector>
23
#include <queue>
24
#include <set>
25
#include <limits>
26

	
27
#include <lemon/core.h>
28
#include <lemon/unionfind.h>
29
#include <lemon/bin_heap.h>
30
#include <lemon/maps.h>
31
#include <lemon/assert.h>
32
#include <lemon/elevator.h>
33

	
34
///\ingroup matching
35
///\file
36
///\brief Fractional matching algorithms in general graphs.
37

	
38
namespace lemon {
39

	
40
  /// \brief Default traits class of MaxFractionalMatching class.
41
  ///
42
  /// Default traits class of MaxFractionalMatching class.
43
  /// \tparam GR Graph type.
44
  template <typename GR>
45
  struct MaxFractionalMatchingDefaultTraits {
46

	
47
    /// \brief The type of the graph the algorithm runs on.
48
    typedef GR Graph;
49

	
50
    /// \brief The type of the map that stores the matching.
51
    ///
52
    /// The type of the map that stores the matching arcs.
53
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
54
    typedef typename Graph::template NodeMap<typename GR::Arc> MatchingMap;
55

	
56
    /// \brief Instantiates a MatchingMap.
57
    ///
58
    /// This function instantiates a \ref MatchingMap.
59
    /// \param graph The graph for which we would like to define
60
    /// the matching map.
61
    static MatchingMap* createMatchingMap(const Graph& graph) {
62
      return new MatchingMap(graph);
63
    }
64

	
65
    /// \brief The elevator type used by MaxFractionalMatching algorithm.
66
    ///
67
    /// The elevator type used by MaxFractionalMatching algorithm.
68
    ///
69
    /// \sa Elevator
70
    /// \sa LinkedElevator
71
    typedef LinkedElevator<Graph, typename Graph::Node> Elevator;
72

	
73
    /// \brief Instantiates an Elevator.
74
    ///
75
    /// This function instantiates an \ref Elevator.
76
    /// \param graph The graph for which we would like to define
77
    /// the elevator.
78
    /// \param max_level The maximum level of the elevator.
79
    static Elevator* createElevator(const Graph& graph, int max_level) {
80
      return new Elevator(graph, max_level);
81
    }
82
  };
83

	
84
  /// \ingroup matching
85
  ///
86
  /// \brief Max cardinality fractional matching
87
  ///
88
  /// This class provides an implementation of fractional matching
89
  /// algorithm based on push-relabel principle.
90
  ///
91
  /// The maximum cardinality fractional matching is a relaxation of the
92
  /// maximum cardinality matching problem where the odd set constraints
93
  /// are omitted.
94
  /// It can be formulated with the following linear program.
95
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
96
  /// \f[x_e \ge 0\quad \forall e\in E\f]
97
  /// \f[\max \sum_{e\in E}x_e\f]
98
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
99
  /// \f$X\f$. The result can be represented as the union of a
100
  /// matching with one value edges and a set of odd length cycles
101
  /// with half value edges.
102
  ///
103
  /// The algorithm calculates an optimal fractional matching and a
104
  /// barrier. The number of adjacents of any node set minus the size
105
  /// of node set is a lower bound on the uncovered nodes in the
106
  /// graph. For maximum matching a barrier is computed which
107
  /// maximizes this difference.
108
  ///
109
  /// The algorithm can be executed with the run() function.  After it
110
  /// the matching (the primal solution) and the barrier (the dual
111
  /// solution) can be obtained using the query functions.
112
  ///
113
  /// The primal solution is multiplied by
114
  /// \ref MaxFractionalMatching::primalScale "2".
115
  ///
116
  /// \tparam GR The undirected graph type the algorithm runs on.
117
#ifdef DOXYGEN
118
  template <typename GR, typename TR>
119
#else
120
  template <typename GR,
121
            typename TR = MaxFractionalMatchingDefaultTraits<GR> >
122
#endif
123
  class MaxFractionalMatching {
124
  public:
125

	
126
    /// \brief The \ref MaxFractionalMatchingDefaultTraits "traits
127
    /// class" of the algorithm.
128
    typedef TR Traits;
129
    /// The type of the graph the algorithm runs on.
130
    typedef typename TR::Graph Graph;
131
    /// The type of the matching map.
132
    typedef typename TR::MatchingMap MatchingMap;
133
    /// The type of the elevator.
134
    typedef typename TR::Elevator Elevator;
135

	
136
    /// \brief Scaling factor for primal solution
137
    ///
138
    /// Scaling factor for primal solution.
139
    static const int primalScale = 2;
140

	
141
  private:
142

	
143
    const Graph &_graph;
144
    int _node_num;
145
    bool _allow_loops;
146
    int _empty_level;
147

	
148
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
149

	
150
    bool _local_matching;
151
    MatchingMap *_matching;
152

	
153
    bool _local_level;
154
    Elevator *_level;
155

	
156
    typedef typename Graph::template NodeMap<int> InDegMap;
157
    InDegMap *_indeg;
158

	
159
    void createStructures() {
160
      _node_num = countNodes(_graph);
161

	
162
      if (!_matching) {
163
        _local_matching = true;
164
        _matching = Traits::createMatchingMap(_graph);
165
      }
166
      if (!_level) {
167
        _local_level = true;
168
        _level = Traits::createElevator(_graph, _node_num);
169
      }
170
      if (!_indeg) {
171
        _indeg = new InDegMap(_graph);
172
      }
173
    }
174

	
175
    void destroyStructures() {
176
      if (_local_matching) {
177
        delete _matching;
178
      }
179
      if (_local_level) {
180
        delete _level;
181
      }
182
      if (_indeg) {
183
        delete _indeg;
184
      }
185
    }
186

	
187
    void postprocessing() {
188
      for (NodeIt n(_graph); n != INVALID; ++n) {
189
        if ((*_indeg)[n] != 0) continue;
190
        _indeg->set(n, -1);
191
        Node u = n;
192
        while ((*_matching)[u] != INVALID) {
193
          Node v = _graph.target((*_matching)[u]);
194
          _indeg->set(v, -1);
195
          Arc a = _graph.oppositeArc((*_matching)[u]);
196
          u = _graph.target((*_matching)[v]);
197
          _indeg->set(u, -1);
198
          _matching->set(v, a);
199
        }
200
      }
201

	
202
      for (NodeIt n(_graph); n != INVALID; ++n) {
203
        if ((*_indeg)[n] != 1) continue;
204
        _indeg->set(n, -1);
205

	
206
        int num = 1;
207
        Node u = _graph.target((*_matching)[n]);
208
        while (u != n) {
209
          _indeg->set(u, -1);
210
          u = _graph.target((*_matching)[u]);
211
          ++num;
212
        }
213
        if (num % 2 == 0 && num > 2) {
214
          Arc prev = _graph.oppositeArc((*_matching)[n]);
215
          Node v = _graph.target((*_matching)[n]);
216
          u = _graph.target((*_matching)[v]);
217
          _matching->set(v, prev);
218
          while (u != n) {
219
            prev = _graph.oppositeArc((*_matching)[u]);
220
            v = _graph.target((*_matching)[u]);
221
            u = _graph.target((*_matching)[v]);
222
            _matching->set(v, prev);
223
          }
224
        }
225
      }
226
    }
227

	
228
  public:
229

	
230
    typedef MaxFractionalMatching Create;
231

	
232
    ///\name Named Template Parameters
233

	
234
    ///@{
235

	
236
    template <typename T>
237
    struct SetMatchingMapTraits : public Traits {
238
      typedef T MatchingMap;
239
      static MatchingMap *createMatchingMap(const Graph&) {
240
        LEMON_ASSERT(false, "MatchingMap is not initialized");
241
        return 0; // ignore warnings
242
      }
243
    };
244

	
245
    /// \brief \ref named-templ-param "Named parameter" for setting
246
    /// MatchingMap type
247
    ///
248
    /// \ref named-templ-param "Named parameter" for setting MatchingMap
249
    /// type.
250
    template <typename T>
251
    struct SetMatchingMap
252
      : public MaxFractionalMatching<Graph, SetMatchingMapTraits<T> > {
253
      typedef MaxFractionalMatching<Graph, SetMatchingMapTraits<T> > Create;
254
    };
255

	
256
    template <typename T>
257
    struct SetElevatorTraits : public Traits {
258
      typedef T Elevator;
259
      static Elevator *createElevator(const Graph&, int) {
260
        LEMON_ASSERT(false, "Elevator is not initialized");
261
        return 0; // ignore warnings
262
      }
263
    };
264

	
265
    /// \brief \ref named-templ-param "Named parameter" for setting
266
    /// Elevator type
267
    ///
268
    /// \ref named-templ-param "Named parameter" for setting Elevator
269
    /// type. If this named parameter is used, then an external
270
    /// elevator object must be passed to the algorithm using the
271
    /// \ref elevator(Elevator&) "elevator()" function before calling
272
    /// \ref run() or \ref init().
273
    /// \sa SetStandardElevator
274
    template <typename T>
275
    struct SetElevator
276
      : public MaxFractionalMatching<Graph, SetElevatorTraits<T> > {
277
      typedef MaxFractionalMatching<Graph, SetElevatorTraits<T> > Create;
278
    };
279

	
280
    template <typename T>
281
    struct SetStandardElevatorTraits : public Traits {
282
      typedef T Elevator;
283
      static Elevator *createElevator(const Graph& graph, int max_level) {
284
        return new Elevator(graph, max_level);
285
      }
286
    };
287

	
288
    /// \brief \ref named-templ-param "Named parameter" for setting
289
    /// Elevator type with automatic allocation
290
    ///
291
    /// \ref named-templ-param "Named parameter" for setting Elevator
292
    /// type with automatic allocation.
293
    /// The Elevator should have standard constructor interface to be
294
    /// able to automatically created by the algorithm (i.e. the
295
    /// graph and the maximum level should be passed to it).
296
    /// However an external elevator object could also be passed to the
297
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
298
    /// before calling \ref run() or \ref init().
299
    /// \sa SetElevator
300
    template <typename T>
301
    struct SetStandardElevator
302
      : public MaxFractionalMatching<Graph, SetStandardElevatorTraits<T> > {
303
      typedef MaxFractionalMatching<Graph,
304
                                    SetStandardElevatorTraits<T> > Create;
305
    };
306

	
307
    /// @}
308

	
309
  protected:
310

	
311
    MaxFractionalMatching() {}
312

	
313
  public:
314

	
315
    /// \brief Constructor
316
    ///
317
    /// Constructor.
318
    ///
319
    MaxFractionalMatching(const Graph &graph, bool allow_loops = true)
320
      : _graph(graph), _allow_loops(allow_loops),
321
        _local_matching(false), _matching(0),
322
        _local_level(false), _level(0),  _indeg(0)
323
    {}
324

	
325
    ~MaxFractionalMatching() {
326
      destroyStructures();
327
    }
328

	
329
    /// \brief Sets the matching map.
330
    ///
331
    /// Sets the matching map.
332
    /// If you don't use this function before calling \ref run() or
333
    /// \ref init(), an instance will be allocated automatically.
334
    /// The destructor deallocates this automatically allocated map,
335
    /// of course.
336
    /// \return <tt>(*this)</tt>
337
    MaxFractionalMatching& matchingMap(MatchingMap& map) {
338
      if (_local_matching) {
339
        delete _matching;
340
        _local_matching = false;
341
      }
342
      _matching = &map;
343
      return *this;
344
    }
345

	
346
    /// \brief Sets the elevator used by algorithm.
347
    ///
348
    /// Sets the elevator used by algorithm.
349
    /// If you don't use this function before calling \ref run() or
350
    /// \ref init(), an instance will be allocated automatically.
351
    /// The destructor deallocates this automatically allocated elevator,
352
    /// of course.
353
    /// \return <tt>(*this)</tt>
354
    MaxFractionalMatching& elevator(Elevator& elevator) {
355
      if (_local_level) {
356
        delete _level;
357
        _local_level = false;
358
      }
359
      _level = &elevator;
360
      return *this;
361
    }
362

	
363
    /// \brief Returns a const reference to the elevator.
364
    ///
365
    /// Returns a const reference to the elevator.
366
    ///
367
    /// \pre Either \ref run() or \ref init() must be called before
368
    /// using this function.
369
    const Elevator& elevator() const {
370
      return *_level;
371
    }
372

	
373
    /// \name Execution control
374
    /// The simplest way to execute the algorithm is to use one of the
375
    /// member functions called \c run(). \n
376
    /// If you need more control on the execution, first
377
    /// you must call \ref init() and then one variant of the start()
378
    /// member.
379

	
380
    /// @{
381

	
382
    /// \brief Initializes the internal data structures.
383
    ///
384
    /// Initializes the internal data structures and sets the initial
385
    /// matching.
386
    void init() {
387
      createStructures();
388

	
389
      _level->initStart();
390
      for (NodeIt n(_graph); n != INVALID; ++n) {
391
        _indeg->set(n, 0);
392
        _matching->set(n, INVALID);
393
        _level->initAddItem(n);
394
      }
395
      _level->initFinish();
396

	
397
      _empty_level = _node_num;
398
      for (NodeIt n(_graph); n != INVALID; ++n) {
399
        for (OutArcIt a(_graph, n); a != INVALID; ++a) {
400
          if (_graph.target(a) == n && !_allow_loops) continue;
401
          _matching->set(n, a);
402
          Node v = _graph.target((*_matching)[n]);
403
          _indeg->set(v, (*_indeg)[v] + 1);
404
          break;
405
        }
406
      }
407

	
408
      for (NodeIt n(_graph); n != INVALID; ++n) {
409
        if ((*_indeg)[n] == 0) {
410
          _level->activate(n);
411
        }
412
      }
413
    }
414

	
415
    /// \brief Starts the algorithm and computes a fractional matching
416
    ///
417
    /// The algorithm computes a maximum fractional matching.
418
    ///
419
    /// \param postprocess The algorithm computes first a matching
420
    /// which is a union of a matching with one value edges, cycles
421
    /// with half value edges and even length paths with half value
422
    /// edges. If the parameter is true, then after the push-relabel
423
    /// algorithm it postprocesses the matching to contain only
424
    /// matching edges and half value odd cycles.
425
    void start(bool postprocess = true) {
426
      Node n;
427
      while ((n = _level->highestActive()) != INVALID) {
428
        int level = _level->highestActiveLevel();
429
        int new_level = _level->maxLevel();
430
        for (InArcIt a(_graph, n); a != INVALID; ++a) {
431
          Node u = _graph.source(a);
432
          if (n == u && !_allow_loops) continue;
433
          Node v = _graph.target((*_matching)[u]);
434
          if ((*_level)[v] < level) {
435
            _indeg->set(v, (*_indeg)[v] - 1);
436
            if ((*_indeg)[v] == 0) {
437
              _level->activate(v);
438
            }
439
            _matching->set(u, a);
440
            _indeg->set(n, (*_indeg)[n] + 1);
441
            _level->deactivate(n);
442
            goto no_more_push;
443
          } else if (new_level > (*_level)[v]) {
444
            new_level = (*_level)[v];
445
          }
446
        }
447

	
448
        if (new_level + 1 < _level->maxLevel()) {
449
          _level->liftHighestActive(new_level + 1);
450
        } else {
451
          _level->liftHighestActiveToTop();
452
        }
453
        if (_level->emptyLevel(level)) {
454
          _level->liftToTop(level);
455
        }
456
      no_more_push:
457
        ;
458
      }
459
      for (NodeIt n(_graph); n != INVALID; ++n) {
460
        if ((*_matching)[n] == INVALID) continue;
461
        Node u = _graph.target((*_matching)[n]);
462
        if ((*_indeg)[u] > 1) {
463
          _indeg->set(u, (*_indeg)[u] - 1);
464
          _matching->set(n, INVALID);
465
        }
466
      }
467
      if (postprocess) {
468
        postprocessing();
469
      }
470
    }
471

	
472
    /// \brief Starts the algorithm and computes a perfect fractional
473
    /// matching
474
    ///
475
    /// The algorithm computes a perfect fractional matching. If it
476
    /// does not exists, then the algorithm returns false and the
477
    /// matching is undefined and the barrier.
478
    ///
479
    /// \param postprocess The algorithm computes first a matching
480
    /// which is a union of a matching with one value edges, cycles
481
    /// with half value edges and even length paths with half value
482
    /// edges. If the parameter is true, then after the push-relabel
483
    /// algorithm it postprocesses the matching to contain only
484
    /// matching edges and half value odd cycles.
485
    bool startPerfect(bool postprocess = true) {
486
      Node n;
487
      while ((n = _level->highestActive()) != INVALID) {
488
        int level = _level->highestActiveLevel();
489
        int new_level = _level->maxLevel();
490
        for (InArcIt a(_graph, n); a != INVALID; ++a) {
491
          Node u = _graph.source(a);
492
          if (n == u && !_allow_loops) continue;
493
          Node v = _graph.target((*_matching)[u]);
494
          if ((*_level)[v] < level) {
495
            _indeg->set(v, (*_indeg)[v] - 1);
496
            if ((*_indeg)[v] == 0) {
497
              _level->activate(v);
498
            }
499
            _matching->set(u, a);
500
            _indeg->set(n, (*_indeg)[n] + 1);
501
            _level->deactivate(n);
502
            goto no_more_push;
503
          } else if (new_level > (*_level)[v]) {
504
            new_level = (*_level)[v];
505
          }
506
        }
507

	
508
        if (new_level + 1 < _level->maxLevel()) {
509
          _level->liftHighestActive(new_level + 1);
510
        } else {
511
          _level->liftHighestActiveToTop();
512
          _empty_level = _level->maxLevel() - 1;
513
          return false;
514
        }
515
        if (_level->emptyLevel(level)) {
516
          _level->liftToTop(level);
517
          _empty_level = level;
518
          return false;
519
        }
520
      no_more_push:
521
        ;
522
      }
523
      if (postprocess) {
524
        postprocessing();
525
      }
526
      return true;
527
    }
528

	
529
    /// \brief Runs the algorithm
530
    ///
531
    /// Just a shortcut for the next code:
532
    ///\code
533
    /// init();
534
    /// start();
535
    ///\endcode
536
    void run(bool postprocess = true) {
537
      init();
538
      start(postprocess);
539
    }
540

	
541
    /// \brief Runs the algorithm to find a perfect fractional matching
542
    ///
543
    /// Just a shortcut for the next code:
544
    ///\code
545
    /// init();
546
    /// startPerfect();
547
    ///\endcode
548
    bool runPerfect(bool postprocess = true) {
549
      init();
550
      return startPerfect(postprocess);
551
    }
552

	
553
    ///@}
554

	
555
    /// \name Query Functions
556
    /// The result of the %Matching algorithm can be obtained using these
557
    /// functions.\n
558
    /// Before the use of these functions,
559
    /// either run() or start() must be called.
560
    ///@{
561

	
562

	
563
    /// \brief Return the number of covered nodes in the matching.
564
    ///
565
    /// This function returns the number of covered nodes in the matching.
566
    ///
567
    /// \pre Either run() or start() must be called before using this function.
568
    int matchingSize() const {
569
      int num = 0;
570
      for (NodeIt n(_graph); n != INVALID; ++n) {
571
        if ((*_matching)[n] != INVALID) {
572
          ++num;
573
        }
574
      }
575
      return num;
576
    }
577

	
578
    /// \brief Returns a const reference to the matching map.
579
    ///
580
    /// Returns a const reference to the node map storing the found
581
    /// fractional matching. This method can be called after
582
    /// running the algorithm.
583
    ///
584
    /// \pre Either \ref run() or \ref init() must be called before
585
    /// using this function.
586
    const MatchingMap& matchingMap() const {
587
      return *_matching;
588
    }
589

	
590
    /// \brief Return \c true if the given edge is in the matching.
591
    ///
592
    /// This function returns \c true if the given edge is in the
593
    /// found matching. The result is scaled by \ref primalScale
594
    /// "primal scale".
595
    ///
596
    /// \pre Either run() or start() must be called before using this function.
597
    int matching(const Edge& edge) const {
598
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0) +
599
        (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
600
    }
601

	
602
    /// \brief Return the fractional matching arc (or edge) incident
603
    /// to the given node.
604
    ///
605
    /// This function returns one of the fractional matching arc (or
606
    /// edge) incident to the given node in the found matching or \c
607
    /// INVALID if the node is not covered by the matching or if the
608
    /// node is on an odd length cycle then it is the successor edge
609
    /// on the cycle.
610
    ///
611
    /// \pre Either run() or start() must be called before using this function.
612
    Arc matching(const Node& node) const {
613
      return (*_matching)[node];
614
    }
615

	
616
    /// \brief Returns true if the node is in the barrier
617
    ///
618
    /// The barrier is a subset of the nodes. If the nodes in the
619
    /// barrier have less adjacent nodes than the size of the barrier,
620
    /// then at least as much nodes cannot be covered as the
621
    /// difference of the two subsets.
622
    bool barrier(const Node& node) const {
623
      return (*_level)[node] >= _empty_level;
624
    }
625

	
626
    /// @}
627

	
628
  };
629

	
630
  /// \ingroup matching
631
  ///
632
  /// \brief Weighted fractional matching in general graphs
633
  ///
634
  /// This class provides an efficient implementation of fractional
635
  /// matching algorithm. The implementation uses priority queues and
636
  /// provides \f$O(nm\log n)\f$ time complexity.
637
  ///
638
  /// The maximum weighted fractional matching is a relaxation of the
639
  /// maximum weighted matching problem where the odd set constraints
640
  /// are omitted.
641
  /// It can be formulated with the following linear program.
642
  /// \f[ \sum_{e \in \delta(u)}x_e \le 1 \quad \forall u\in V\f]
643
  /// \f[x_e \ge 0\quad \forall e\in E\f]
644
  /// \f[\max \sum_{e\in E}x_ew_e\f]
645
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
646
  /// \f$X\f$. The result must be the union of a matching with one
647
  /// value edges and a set of odd length cycles with half value edges.
648
  ///
649
  /// The algorithm calculates an optimal fractional matching and a
650
  /// proof of the optimality. The solution of the dual problem can be
651
  /// used to check the result of the algorithm. The dual linear
652
  /// problem is the following.
653
  /// \f[ y_u + y_v \ge w_{uv} \quad \forall uv\in E\f]
654
  /// \f[y_u \ge 0 \quad \forall u \in V\f]
655
  /// \f[\min \sum_{u \in V}y_u \f]
656
  ///
657
  /// The algorithm can be executed with the run() function.
658
  /// After it the matching (the primal solution) and the dual solution
659
  /// can be obtained using the query functions.
660
  ///
661
  /// The primal solution is multiplied by
662
  /// \ref MaxWeightedFractionalMatching::primalScale "2".
663
  /// If the value type is integer, then the dual
664
  /// solution is scaled by
665
  /// \ref MaxWeightedFractionalMatching::dualScale "4".
666
  ///
667
  /// \tparam GR The undirected graph type the algorithm runs on.
668
  /// \tparam WM The type edge weight map. The default type is
669
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
670
#ifdef DOXYGEN
671
  template <typename GR, typename WM>
672
#else
673
  template <typename GR,
674
            typename WM = typename GR::template EdgeMap<int> >
675
#endif
676
  class MaxWeightedFractionalMatching {
677
  public:
678

	
679
    /// The graph type of the algorithm
680
    typedef GR Graph;
681
    /// The type of the edge weight map
682
    typedef WM WeightMap;
683
    /// The value type of the edge weights
684
    typedef typename WeightMap::Value Value;
685

	
686
    /// The type of the matching map
687
    typedef typename Graph::template NodeMap<typename Graph::Arc>
688
    MatchingMap;
689

	
690
    /// \brief Scaling factor for primal solution
691
    ///
692
    /// Scaling factor for primal solution.
693
    static const int primalScale = 2;
694

	
695
    /// \brief Scaling factor for dual solution
696
    ///
697
    /// Scaling factor for dual solution. It is equal to 4 or 1
698
    /// according to the value type.
699
    static const int dualScale =
700
      std::numeric_limits<Value>::is_integer ? 4 : 1;
701

	
702
  private:
703

	
704
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
705

	
706
    typedef typename Graph::template NodeMap<Value> NodePotential;
707

	
708
    const Graph& _graph;
709
    const WeightMap& _weight;
710

	
711
    MatchingMap* _matching;
712
    NodePotential* _node_potential;
713

	
714
    int _node_num;
715
    bool _allow_loops;
716

	
717
    enum Status {
718
      EVEN = -1, MATCHED = 0, ODD = 1
719
    };
720

	
721
    typedef typename Graph::template NodeMap<Status> StatusMap;
722
    StatusMap* _status;
723

	
724
    typedef typename Graph::template NodeMap<Arc> PredMap;
725
    PredMap* _pred;
726

	
727
    typedef ExtendFindEnum<IntNodeMap> TreeSet;
728

	
729
    IntNodeMap *_tree_set_index;
730
    TreeSet *_tree_set;
731

	
732
    IntNodeMap *_delta1_index;
733
    BinHeap<Value, IntNodeMap> *_delta1;
734

	
735
    IntNodeMap *_delta2_index;
736
    BinHeap<Value, IntNodeMap> *_delta2;
737

	
738
    IntEdgeMap *_delta3_index;
739
    BinHeap<Value, IntEdgeMap> *_delta3;
740

	
741
    Value _delta_sum;
742

	
743
    void createStructures() {
744
      _node_num = countNodes(_graph);
745

	
746
      if (!_matching) {
747
        _matching = new MatchingMap(_graph);
748
      }
749
      if (!_node_potential) {
750
        _node_potential = new NodePotential(_graph);
751
      }
752
      if (!_status) {
753
        _status = new StatusMap(_graph);
754
      }
755
      if (!_pred) {
756
        _pred = new PredMap(_graph);
757
      }
758
      if (!_tree_set) {
759
        _tree_set_index = new IntNodeMap(_graph);
760
        _tree_set = new TreeSet(*_tree_set_index);
761
      }
762
      if (!_delta1) {
763
        _delta1_index = new IntNodeMap(_graph);
764
        _delta1 = new BinHeap<Value, IntNodeMap>(*_delta1_index);
765
      }
766
      if (!_delta2) {
767
        _delta2_index = new IntNodeMap(_graph);
768
        _delta2 = new BinHeap<Value, IntNodeMap>(*_delta2_index);
769
      }
770
      if (!_delta3) {
771
        _delta3_index = new IntEdgeMap(_graph);
772
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
773
      }
774
    }
775

	
776
    void destroyStructures() {
777
      if (_matching) {
778
        delete _matching;
779
      }
780
      if (_node_potential) {
781
        delete _node_potential;
782
      }
783
      if (_status) {
784
        delete _status;
785
      }
786
      if (_pred) {
787
        delete _pred;
788
      }
789
      if (_tree_set) {
790
        delete _tree_set_index;
791
        delete _tree_set;
792
      }
793
      if (_delta1) {
794
        delete _delta1_index;
795
        delete _delta1;
796
      }
797
      if (_delta2) {
798
        delete _delta2_index;
799
        delete _delta2;
800
      }
801
      if (_delta3) {
802
        delete _delta3_index;
803
        delete _delta3;
804
      }
805
    }
806

	
807
    void matchedToEven(Node node, int tree) {
808
      _tree_set->insert(node, tree);
809
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
810
      _delta1->push(node, (*_node_potential)[node]);
811

	
812
      if (_delta2->state(node) == _delta2->IN_HEAP) {
813
        _delta2->erase(node);
814
      }
815

	
816
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
817
        Node v = _graph.source(a);
818
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
819
          dualScale * _weight[a];
820
        if (node == v) {
821
          if (_allow_loops && _graph.direction(a)) {
822
            _delta3->push(a, rw / 2);
823
          }
824
        } else if ((*_status)[v] == EVEN) {
825
          _delta3->push(a, rw / 2);
826
        } else if ((*_status)[v] == MATCHED) {
827
          if (_delta2->state(v) != _delta2->IN_HEAP) {
828
            _pred->set(v, a);
829
            _delta2->push(v, rw);
830
          } else if ((*_delta2)[v] > rw) {
831
            _pred->set(v, a);
832
            _delta2->decrease(v, rw);
833
          }
834
        }
835
      }
836
    }
837

	
838
    void matchedToOdd(Node node, int tree) {
839
      _tree_set->insert(node, tree);
840
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
841

	
842
      if (_delta2->state(node) == _delta2->IN_HEAP) {
843
        _delta2->erase(node);
844
      }
845
    }
846

	
847
    void evenToMatched(Node node, int tree) {
848
      _delta1->erase(node);
849
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
850
      Arc min = INVALID;
851
      Value minrw = std::numeric_limits<Value>::max();
852
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
853
        Node v = _graph.source(a);
854
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
855
          dualScale * _weight[a];
856

	
857
        if (node == v) {
858
          if (_allow_loops && _graph.direction(a)) {
859
            _delta3->erase(a);
860
          }
861
        } else if ((*_status)[v] == EVEN) {
862
          _delta3->erase(a);
863
          if (minrw > rw) {
864
            min = _graph.oppositeArc(a);
865
            minrw = rw;
866
          }
867
        } else if ((*_status)[v]  == MATCHED) {
868
          if ((*_pred)[v] == a) {
869
            Arc mina = INVALID;
870
            Value minrwa = std::numeric_limits<Value>::max();
871
            for (OutArcIt aa(_graph, v); aa != INVALID; ++aa) {
872
              Node va = _graph.target(aa);
873
              if ((*_status)[va] != EVEN ||
874
                  _tree_set->find(va) == tree) continue;
875
              Value rwa = (*_node_potential)[v] + (*_node_potential)[va] -
876
                dualScale * _weight[aa];
877
              if (minrwa > rwa) {
878
                minrwa = rwa;
879
                mina = aa;
880
              }
881
            }
882
            if (mina != INVALID) {
883
              _pred->set(v, mina);
884
              _delta2->increase(v, minrwa);
885
            } else {
886
              _pred->set(v, INVALID);
887
              _delta2->erase(v);
888
            }
889
          }
890
        }
891
      }
892
      if (min != INVALID) {
893
        _pred->set(node, min);
894
        _delta2->push(node, minrw);
895
      } else {
896
        _pred->set(node, INVALID);
897
      }
898
    }
899

	
900
    void oddToMatched(Node node) {
901
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
902
      Arc min = INVALID;
903
      Value minrw = std::numeric_limits<Value>::max();
904
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
905
        Node v = _graph.source(a);
906
        if ((*_status)[v] != EVEN) continue;
907
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
908
          dualScale * _weight[a];
909

	
910
        if (minrw > rw) {
911
          min = _graph.oppositeArc(a);
912
          minrw = rw;
913
        }
914
      }
915
      if (min != INVALID) {
916
        _pred->set(node, min);
917
        _delta2->push(node, minrw);
918
      } else {
919
        _pred->set(node, INVALID);
920
      }
921
    }
922

	
923
    void alternatePath(Node even, int tree) {
924
      Node odd;
925

	
926
      _status->set(even, MATCHED);
927
      evenToMatched(even, tree);
928

	
929
      Arc prev = (*_matching)[even];
930
      while (prev != INVALID) {
931
        odd = _graph.target(prev);
932
        even = _graph.target((*_pred)[odd]);
933
        _matching->set(odd, (*_pred)[odd]);
934
        _status->set(odd, MATCHED);
935
        oddToMatched(odd);
936

	
937
        prev = (*_matching)[even];
938
        _status->set(even, MATCHED);
939
        _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
940
        evenToMatched(even, tree);
941
      }
942
    }
943

	
944
    void destroyTree(int tree) {
945
      for (typename TreeSet::ItemIt n(*_tree_set, tree); n != INVALID; ++n) {
946
        if ((*_status)[n] == EVEN) {
947
          _status->set(n, MATCHED);
948
          evenToMatched(n, tree);
949
        } else if ((*_status)[n] == ODD) {
950
          _status->set(n, MATCHED);
951
          oddToMatched(n);
952
        }
953
      }
954
      _tree_set->eraseClass(tree);
955
    }
956

	
957

	
958
    void unmatchNode(const Node& node) {
959
      int tree = _tree_set->find(node);
960

	
961
      alternatePath(node, tree);
962
      destroyTree(tree);
963

	
964
      _matching->set(node, INVALID);
965
    }
966

	
967

	
968
    void augmentOnEdge(const Edge& edge) {
969
      Node left = _graph.u(edge);
970
      int left_tree = _tree_set->find(left);
971

	
972
      alternatePath(left, left_tree);
973
      destroyTree(left_tree);
974
      _matching->set(left, _graph.direct(edge, true));
975

	
976
      Node right = _graph.v(edge);
977
      int right_tree = _tree_set->find(right);
978

	
979
      alternatePath(right, right_tree);
980
      destroyTree(right_tree);
981
      _matching->set(right, _graph.direct(edge, false));
982
    }
983

	
984
    void augmentOnArc(const Arc& arc) {
985
      Node left = _graph.source(arc);
986
      _status->set(left, MATCHED);
987
      _matching->set(left, arc);
988
      _pred->set(left, arc);
989

	
990
      Node right = _graph.target(arc);
991
      int right_tree = _tree_set->find(right);
992

	
993
      alternatePath(right, right_tree);
994
      destroyTree(right_tree);
995
      _matching->set(right, _graph.oppositeArc(arc));
996
    }
997

	
998
    void extendOnArc(const Arc& arc) {
999
      Node base = _graph.target(arc);
1000
      int tree = _tree_set->find(base);
1001

	
1002
      Node odd = _graph.source(arc);
1003
      _tree_set->insert(odd, tree);
1004
      _status->set(odd, ODD);
1005
      matchedToOdd(odd, tree);
1006
      _pred->set(odd, arc);
1007

	
1008
      Node even = _graph.target((*_matching)[odd]);
1009
      _tree_set->insert(even, tree);
1010
      _status->set(even, EVEN);
1011
      matchedToEven(even, tree);
1012
    }
1013

	
1014
    void cycleOnEdge(const Edge& edge, int tree) {
1015
      Node nca = INVALID;
1016
      std::vector<Node> left_path, right_path;
1017

	
1018
      {
1019
        std::set<Node> left_set, right_set;
1020
        Node left = _graph.u(edge);
1021
        left_path.push_back(left);
1022
        left_set.insert(left);
1023

	
1024
        Node right = _graph.v(edge);
1025
        right_path.push_back(right);
1026
        right_set.insert(right);
1027

	
1028
        while (true) {
1029

	
1030
          if (left_set.find(right) != left_set.end()) {
1031
            nca = right;
1032
            break;
1033
          }
1034

	
1035
          if ((*_matching)[left] == INVALID) break;
1036

	
1037
          left = _graph.target((*_matching)[left]);
1038
          left_path.push_back(left);
1039
          left = _graph.target((*_pred)[left]);
1040
          left_path.push_back(left);
1041

	
1042
          left_set.insert(left);
1043

	
1044
          if (right_set.find(left) != right_set.end()) {
1045
            nca = left;
1046
            break;
1047
          }
1048

	
1049
          if ((*_matching)[right] == INVALID) break;
1050

	
1051
          right = _graph.target((*_matching)[right]);
1052
          right_path.push_back(right);
1053
          right = _graph.target((*_pred)[right]);
1054
          right_path.push_back(right);
1055

	
1056
          right_set.insert(right);
1057

	
1058
        }
1059

	
1060
        if (nca == INVALID) {
1061
          if ((*_matching)[left] == INVALID) {
1062
            nca = right;
1063
            while (left_set.find(nca) == left_set.end()) {
1064
              nca = _graph.target((*_matching)[nca]);
1065
              right_path.push_back(nca);
1066
              nca = _graph.target((*_pred)[nca]);
1067
              right_path.push_back(nca);
1068
            }
1069
          } else {
1070
            nca = left;
1071
            while (right_set.find(nca) == right_set.end()) {
1072
              nca = _graph.target((*_matching)[nca]);
1073
              left_path.push_back(nca);
1074
              nca = _graph.target((*_pred)[nca]);
1075
              left_path.push_back(nca);
1076
            }
1077
          }
1078
        }
1079
      }
1080

	
1081
      alternatePath(nca, tree);
1082
      Arc prev;
1083

	
1084
      prev = _graph.direct(edge, true);
1085
      for (int i = 0; left_path[i] != nca; i += 2) {
1086
        _matching->set(left_path[i], prev);
1087
        _status->set(left_path[i], MATCHED);
1088
        evenToMatched(left_path[i], tree);
1089

	
1090
        prev = _graph.oppositeArc((*_pred)[left_path[i + 1]]);
1091
        _status->set(left_path[i + 1], MATCHED);
1092
        oddToMatched(left_path[i + 1]);
1093
      }
1094
      _matching->set(nca, prev);
1095

	
1096
      for (int i = 0; right_path[i] != nca; i += 2) {
1097
        _status->set(right_path[i], MATCHED);
1098
        evenToMatched(right_path[i], tree);
1099

	
1100
        _matching->set(right_path[i + 1], (*_pred)[right_path[i + 1]]);
1101
        _status->set(right_path[i + 1], MATCHED);
1102
        oddToMatched(right_path[i + 1]);
1103
      }
1104

	
1105
      destroyTree(tree);
1106
    }
1107

	
1108
    void extractCycle(const Arc &arc) {
1109
      Node left = _graph.source(arc);
1110
      Node odd = _graph.target((*_matching)[left]);
1111
      Arc prev;
1112
      while (odd != left) {
1113
        Node even = _graph.target((*_matching)[odd]);
1114
        prev = (*_matching)[odd];
1115
        odd = _graph.target((*_matching)[even]);
1116
        _matching->set(even, _graph.oppositeArc(prev));
1117
      }
1118
      _matching->set(left, arc);
1119

	
1120
      Node right = _graph.target(arc);
1121
      int right_tree = _tree_set->find(right);
1122
      alternatePath(right, right_tree);
1123
      destroyTree(right_tree);
1124
      _matching->set(right, _graph.oppositeArc(arc));
1125
    }
1126

	
1127
  public:
1128

	
1129
    /// \brief Constructor
1130
    ///
1131
    /// Constructor.
1132
    MaxWeightedFractionalMatching(const Graph& graph, const WeightMap& weight,
1133
                                  bool allow_loops = true)
1134
      : _graph(graph), _weight(weight), _matching(0),
1135
      _node_potential(0), _node_num(0), _allow_loops(allow_loops),
1136
      _status(0),  _pred(0),
1137
      _tree_set_index(0), _tree_set(0),
1138

	
1139
      _delta1_index(0), _delta1(0),
1140
      _delta2_index(0), _delta2(0),
1141
      _delta3_index(0), _delta3(0),
1142

	
1143
      _delta_sum() {}
1144

	
1145
    ~MaxWeightedFractionalMatching() {
1146
      destroyStructures();
1147
    }
1148

	
1149
    /// \name Execution Control
1150
    /// The simplest way to execute the algorithm is to use the
1151
    /// \ref run() member function.
1152

	
1153
    ///@{
1154

	
1155
    /// \brief Initialize the algorithm
1156
    ///
1157
    /// This function initializes the algorithm.
1158
    void init() {
1159
      createStructures();
1160

	
1161
      for (NodeIt n(_graph); n != INVALID; ++n) {
1162
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1163
        (*_delta2_index)[n] = _delta2->PRE_HEAP;
1164
      }
1165
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1166
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1167
      }
1168

	
1169
      _delta1->clear();
1170
      _delta2->clear();
1171
      _delta3->clear();
1172
      _tree_set->clear();
1173

	
1174
      for (NodeIt n(_graph); n != INVALID; ++n) {
1175
        Value max = 0;
1176
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1177
          if (_graph.target(e) == n && !_allow_loops) continue;
1178
          if ((dualScale * _weight[e]) / 2 > max) {
1179
            max = (dualScale * _weight[e]) / 2;
1180
          }
1181
        }
1182
        _node_potential->set(n, max);
1183
        _delta1->push(n, max);
1184

	
1185
        _tree_set->insert(n);
1186

	
1187
        _matching->set(n, INVALID);
1188
        _status->set(n, EVEN);
1189
      }
1190

	
1191
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1192
        Node left = _graph.u(e);
1193
        Node right = _graph.v(e);
1194
        if (left == right && !_allow_loops) continue;
1195
        _delta3->push(e, ((*_node_potential)[left] +
1196
                          (*_node_potential)[right] -
1197
                          dualScale * _weight[e]) / 2);
1198
      }
1199
    }
1200

	
1201
    /// \brief Start the algorithm
1202
    ///
1203
    /// This function starts the algorithm.
1204
    ///
1205
    /// \pre \ref init() must be called before using this function.
1206
    void start() {
1207
      enum OpType {
1208
        D1, D2, D3
1209
      };
1210

	
1211
      int unmatched = _node_num;
1212
      while (unmatched > 0) {
1213
        Value d1 = !_delta1->empty() ?
1214
          _delta1->prio() : std::numeric_limits<Value>::max();
1215

	
1216
        Value d2 = !_delta2->empty() ?
1217
          _delta2->prio() : std::numeric_limits<Value>::max();
1218

	
1219
        Value d3 = !_delta3->empty() ?
1220
          _delta3->prio() : std::numeric_limits<Value>::max();
1221

	
1222
        _delta_sum = d3; OpType ot = D3;
1223
        if (d1 < _delta_sum) { _delta_sum = d1; ot = D1; }
1224
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1225

	
1226
        switch (ot) {
1227
        case D1:
1228
          {
1229
            Node n = _delta1->top();
1230
            unmatchNode(n);
1231
            --unmatched;
1232
          }
1233
          break;
1234
        case D2:
1235
          {
1236
            Node n = _delta2->top();
1237
            Arc a = (*_pred)[n];
1238
            if ((*_matching)[n] == INVALID) {
1239
              augmentOnArc(a);
1240
              --unmatched;
1241
            } else {
1242
              Node v = _graph.target((*_matching)[n]);
1243
              if ((*_matching)[n] !=
1244
                  _graph.oppositeArc((*_matching)[v])) {
1245
                extractCycle(a);
1246
                --unmatched;
1247
              } else {
1248
                extendOnArc(a);
1249
              }
1250
            }
1251
          } break;
1252
        case D3:
1253
          {
1254
            Edge e = _delta3->top();
1255

	
1256
            Node left = _graph.u(e);
1257
            Node right = _graph.v(e);
1258

	
1259
            int left_tree = _tree_set->find(left);
1260
            int right_tree = _tree_set->find(right);
1261

	
1262
            if (left_tree == right_tree) {
1263
              cycleOnEdge(e, left_tree);
1264
              --unmatched;
1265
            } else {
1266
              augmentOnEdge(e);
1267
              unmatched -= 2;
1268
            }
1269
          } break;
1270
        }
1271
      }
1272
    }
1273

	
1274
    /// \brief Run the algorithm.
1275
    ///
1276
    /// This method runs the \c %MaxWeightedFractionalMatching algorithm.
1277
    ///
1278
    /// \note mwfm.run() is just a shortcut of the following code.
1279
    /// \code
1280
    ///   mwfm.init();
1281
    ///   mwfm.start();
1282
    /// \endcode
1283
    void run() {
1284
      init();
1285
      start();
1286
    }
1287

	
1288
    /// @}
1289

	
1290
    /// \name Primal Solution
1291
    /// Functions to get the primal solution, i.e. the maximum weighted
1292
    /// matching.\n
1293
    /// Either \ref run() or \ref start() function should be called before
1294
    /// using them.
1295

	
1296
    /// @{
1297

	
1298
    /// \brief Return the weight of the matching.
1299
    ///
1300
    /// This function returns the weight of the found matching. This
1301
    /// value is scaled by \ref primalScale "primal scale".
1302
    ///
1303
    /// \pre Either run() or start() must be called before using this function.
1304
    Value matchingWeight() const {
1305
      Value sum = 0;
1306
      for (NodeIt n(_graph); n != INVALID; ++n) {
1307
        if ((*_matching)[n] != INVALID) {
1308
          sum += _weight[(*_matching)[n]];
1309
        }
1310
      }
1311
      return sum * primalScale / 2;
1312
    }
1313

	
1314
    /// \brief Return the number of covered nodes in the matching.
1315
    ///
1316
    /// This function returns the number of covered nodes in the matching.
1317
    ///
1318
    /// \pre Either run() or start() must be called before using this function.
1319
    int matchingSize() const {
1320
      int num = 0;
1321
      for (NodeIt n(_graph); n != INVALID; ++n) {
1322
        if ((*_matching)[n] != INVALID) {
1323
          ++num;
1324
        }
1325
      }
1326
      return num;
1327
    }
1328

	
1329
    /// \brief Return \c true if the given edge is in the matching.
1330
    ///
1331
    /// This function returns \c true if the given edge is in the
1332
    /// found matching. The result is scaled by \ref primalScale
1333
    /// "primal scale".
1334
    ///
1335
    /// \pre Either run() or start() must be called before using this function.
1336
    int matching(const Edge& edge) const {
1337
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0)
1338
        + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
1339
    }
1340

	
1341
    /// \brief Return the fractional matching arc (or edge) incident
1342
    /// to the given node.
1343
    ///
1344
    /// This function returns one of the fractional matching arc (or
1345
    /// edge) incident to the given node in the found matching or \c
1346
    /// INVALID if the node is not covered by the matching or if the
1347
    /// node is on an odd length cycle then it is the successor edge
1348
    /// on the cycle.
1349
    ///
1350
    /// \pre Either run() or start() must be called before using this function.
1351
    Arc matching(const Node& node) const {
1352
      return (*_matching)[node];
1353
    }
1354

	
1355
    /// \brief Return a const reference to the matching map.
1356
    ///
1357
    /// This function returns a const reference to a node map that stores
1358
    /// the matching arc (or edge) incident to each node.
1359
    const MatchingMap& matchingMap() const {
1360
      return *_matching;
1361
    }
1362

	
1363
    /// @}
1364

	
1365
    /// \name Dual Solution
1366
    /// Functions to get the dual solution.\n
1367
    /// Either \ref run() or \ref start() function should be called before
1368
    /// using them.
1369

	
1370
    /// @{
1371

	
1372
    /// \brief Return the value of the dual solution.
1373
    ///
1374
    /// This function returns the value of the dual solution.
1375
    /// It should be equal to the primal value scaled by \ref dualScale
1376
    /// "dual scale".
1377
    ///
1378
    /// \pre Either run() or start() must be called before using this function.
1379
    Value dualValue() const {
1380
      Value sum = 0;
1381
      for (NodeIt n(_graph); n != INVALID; ++n) {
1382
        sum += nodeValue(n);
1383
      }
1384
      return sum;
1385
    }
1386

	
1387
    /// \brief Return the dual value (potential) of the given node.
1388
    ///
1389
    /// This function returns the dual value (potential) of the given node.
1390
    ///
1391
    /// \pre Either run() or start() must be called before using this function.
1392
    Value nodeValue(const Node& n) const {
1393
      return (*_node_potential)[n];
1394
    }
1395

	
1396
    /// @}
1397

	
1398
  };
1399

	
1400
  /// \ingroup matching
1401
  ///
1402
  /// \brief Weighted fractional perfect matching in general graphs
1403
  ///
1404
  /// This class provides an efficient implementation of fractional
1405
  /// matching algorithm. The implementation uses priority queues and
1406
  /// provides \f$O(nm\log n)\f$ time complexity.
1407
  ///
1408
  /// The maximum weighted fractional perfect matching is a relaxation
1409
  /// of the maximum weighted perfect matching problem where the odd
1410
  /// set constraints are omitted.
1411
  /// It can be formulated with the following linear program.
1412
  /// \f[ \sum_{e \in \delta(u)}x_e = 1 \quad \forall u\in V\f]
1413
  /// \f[x_e \ge 0\quad \forall e\in E\f]
1414
  /// \f[\max \sum_{e\in E}x_ew_e\f]
1415
  /// where \f$\delta(X)\f$ is the set of edges incident to a node in
1416
  /// \f$X\f$. The result must be the union of a matching with one
1417
  /// value edges and a set of odd length cycles with half value edges.
1418
  ///
1419
  /// The algorithm calculates an optimal fractional matching and a
1420
  /// proof of the optimality. The solution of the dual problem can be
1421
  /// used to check the result of the algorithm. The dual linear
1422
  /// problem is the following.
1423
  /// \f[ y_u + y_v \ge w_{uv} \quad \forall uv\in E\f]
1424
  /// \f[\min \sum_{u \in V}y_u \f]
1425
  ///
1426
  /// The algorithm can be executed with the run() function.
1427
  /// After it the matching (the primal solution) and the dual solution
1428
  /// can be obtained using the query functions.
1429
  ///
1430
  /// The primal solution is multiplied by
1431
  /// \ref MaxWeightedPerfectFractionalMatching::primalScale "2".
1432
  /// If the value type is integer, then the dual
1433
  /// solution is scaled by
1434
  /// \ref MaxWeightedPerfectFractionalMatching::dualScale "4".
1435
  ///
1436
  /// \tparam GR The undirected graph type the algorithm runs on.
1437
  /// \tparam WM The type edge weight map. The default type is
1438
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
1439
#ifdef DOXYGEN
1440
  template <typename GR, typename WM>
1441
#else
1442
  template <typename GR,
1443
            typename WM = typename GR::template EdgeMap<int> >
1444
#endif
1445
  class MaxWeightedPerfectFractionalMatching {
1446
  public:
1447

	
1448
    /// The graph type of the algorithm
1449
    typedef GR Graph;
1450
    /// The type of the edge weight map
1451
    typedef WM WeightMap;
1452
    /// The value type of the edge weights
1453
    typedef typename WeightMap::Value Value;
1454

	
1455
    /// The type of the matching map
1456
    typedef typename Graph::template NodeMap<typename Graph::Arc>
1457
    MatchingMap;
1458

	
1459
    /// \brief Scaling factor for primal solution
1460
    ///
1461
    /// Scaling factor for primal solution.
1462
    static const int primalScale = 2;
1463

	
1464
    /// \brief Scaling factor for dual solution
1465
    ///
1466
    /// Scaling factor for dual solution. It is equal to 4 or 1
1467
    /// according to the value type.
1468
    static const int dualScale =
1469
      std::numeric_limits<Value>::is_integer ? 4 : 1;
1470

	
1471
  private:
1472

	
1473
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1474

	
1475
    typedef typename Graph::template NodeMap<Value> NodePotential;
1476

	
1477
    const Graph& _graph;
1478
    const WeightMap& _weight;
1479

	
1480
    MatchingMap* _matching;
1481
    NodePotential* _node_potential;
1482

	
1483
    int _node_num;
1484
    bool _allow_loops;
1485

	
1486
    enum Status {
1487
      EVEN = -1, MATCHED = 0, ODD = 1
1488
    };
1489

	
1490
    typedef typename Graph::template NodeMap<Status> StatusMap;
1491
    StatusMap* _status;
1492

	
1493
    typedef typename Graph::template NodeMap<Arc> PredMap;
1494
    PredMap* _pred;
1495

	
1496
    typedef ExtendFindEnum<IntNodeMap> TreeSet;
1497

	
1498
    IntNodeMap *_tree_set_index;
1499
    TreeSet *_tree_set;
1500

	
1501
    IntNodeMap *_delta2_index;
1502
    BinHeap<Value, IntNodeMap> *_delta2;
1503

	
1504
    IntEdgeMap *_delta3_index;
1505
    BinHeap<Value, IntEdgeMap> *_delta3;
1506

	
1507
    Value _delta_sum;
1508

	
1509
    void createStructures() {
1510
      _node_num = countNodes(_graph);
1511

	
1512
      if (!_matching) {
1513
        _matching = new MatchingMap(_graph);
1514
      }
1515
      if (!_node_potential) {
1516
        _node_potential = new NodePotential(_graph);
1517
      }
1518
      if (!_status) {
1519
        _status = new StatusMap(_graph);
1520
      }
1521
      if (!_pred) {
1522
        _pred = new PredMap(_graph);
1523
      }
1524
      if (!_tree_set) {
1525
        _tree_set_index = new IntNodeMap(_graph);
1526
        _tree_set = new TreeSet(*_tree_set_index);
1527
      }
1528
      if (!_delta2) {
1529
        _delta2_index = new IntNodeMap(_graph);
1530
        _delta2 = new BinHeap<Value, IntNodeMap>(*_delta2_index);
1531
      }
1532
      if (!_delta3) {
1533
        _delta3_index = new IntEdgeMap(_graph);
1534
        _delta3 = new BinHeap<Value, IntEdgeMap>(*_delta3_index);
1535
      }
1536
    }
1537

	
1538
    void destroyStructures() {
1539
      if (_matching) {
1540
        delete _matching;
1541
      }
1542
      if (_node_potential) {
1543
        delete _node_potential;
1544
      }
1545
      if (_status) {
1546
        delete _status;
1547
      }
1548
      if (_pred) {
1549
        delete _pred;
1550
      }
1551
      if (_tree_set) {
1552
        delete _tree_set_index;
1553
        delete _tree_set;
1554
      }
1555
      if (_delta2) {
1556
        delete _delta2_index;
1557
        delete _delta2;
1558
      }
1559
      if (_delta3) {
1560
        delete _delta3_index;
1561
        delete _delta3;
1562
      }
1563
    }
1564

	
1565
    void matchedToEven(Node node, int tree) {
1566
      _tree_set->insert(node, tree);
1567
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
1568

	
1569
      if (_delta2->state(node) == _delta2->IN_HEAP) {
1570
        _delta2->erase(node);
1571
      }
1572

	
1573
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1574
        Node v = _graph.source(a);
1575
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1576
          dualScale * _weight[a];
1577
        if (node == v) {
1578
          if (_allow_loops && _graph.direction(a)) {
1579
            _delta3->push(a, rw / 2);
1580
          }
1581
        } else if ((*_status)[v] == EVEN) {
1582
          _delta3->push(a, rw / 2);
1583
        } else if ((*_status)[v] == MATCHED) {
1584
          if (_delta2->state(v) != _delta2->IN_HEAP) {
1585
            _pred->set(v, a);
1586
            _delta2->push(v, rw);
1587
          } else if ((*_delta2)[v] > rw) {
1588
            _pred->set(v, a);
1589
            _delta2->decrease(v, rw);
1590
          }
1591
        }
1592
      }
1593
    }
1594

	
1595
    void matchedToOdd(Node node, int tree) {
1596
      _tree_set->insert(node, tree);
1597
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
1598

	
1599
      if (_delta2->state(node) == _delta2->IN_HEAP) {
1600
        _delta2->erase(node);
1601
      }
1602
    }
1603

	
1604
    void evenToMatched(Node node, int tree) {
1605
      _node_potential->set(node, (*_node_potential)[node] - _delta_sum);
1606
      Arc min = INVALID;
1607
      Value minrw = std::numeric_limits<Value>::max();
1608
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1609
        Node v = _graph.source(a);
1610
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1611
          dualScale * _weight[a];
1612

	
1613
        if (node == v) {
1614
          if (_allow_loops && _graph.direction(a)) {
1615
            _delta3->erase(a);
1616
          }
1617
        } else if ((*_status)[v] == EVEN) {
1618
          _delta3->erase(a);
1619
          if (minrw > rw) {
1620
            min = _graph.oppositeArc(a);
1621
            minrw = rw;
1622
          }
1623
        } else if ((*_status)[v]  == MATCHED) {
1624
          if ((*_pred)[v] == a) {
1625
            Arc mina = INVALID;
1626
            Value minrwa = std::numeric_limits<Value>::max();
1627
            for (OutArcIt aa(_graph, v); aa != INVALID; ++aa) {
1628
              Node va = _graph.target(aa);
1629
              if ((*_status)[va] != EVEN ||
1630
                  _tree_set->find(va) == tree) continue;
1631
              Value rwa = (*_node_potential)[v] + (*_node_potential)[va] -
1632
                dualScale * _weight[aa];
1633
              if (minrwa > rwa) {
1634
                minrwa = rwa;
1635
                mina = aa;
1636
              }
1637
            }
1638
            if (mina != INVALID) {
1639
              _pred->set(v, mina);
1640
              _delta2->increase(v, minrwa);
1641
            } else {
1642
              _pred->set(v, INVALID);
1643
              _delta2->erase(v);
1644
            }
1645
          }
1646
        }
1647
      }
1648
      if (min != INVALID) {
1649
        _pred->set(node, min);
1650
        _delta2->push(node, minrw);
1651
      } else {
1652
        _pred->set(node, INVALID);
1653
      }
1654
    }
1655

	
1656
    void oddToMatched(Node node) {
1657
      _node_potential->set(node, (*_node_potential)[node] + _delta_sum);
1658
      Arc min = INVALID;
1659
      Value minrw = std::numeric_limits<Value>::max();
1660
      for (InArcIt a(_graph, node); a != INVALID; ++a) {
1661
        Node v = _graph.source(a);
1662
        if ((*_status)[v] != EVEN) continue;
1663
        Value rw = (*_node_potential)[node] + (*_node_potential)[v] -
1664
          dualScale * _weight[a];
1665

	
1666
        if (minrw > rw) {
1667
          min = _graph.oppositeArc(a);
1668
          minrw = rw;
1669
        }
1670
      }
1671
      if (min != INVALID) {
1672
        _pred->set(node, min);
1673
        _delta2->push(node, minrw);
1674
      } else {
1675
        _pred->set(node, INVALID);
1676
      }
1677
    }
1678

	
1679
    void alternatePath(Node even, int tree) {
1680
      Node odd;
1681

	
1682
      _status->set(even, MATCHED);
1683
      evenToMatched(even, tree);
1684

	
1685
      Arc prev = (*_matching)[even];
1686
      while (prev != INVALID) {
1687
        odd = _graph.target(prev);
1688
        even = _graph.target((*_pred)[odd]);
1689
        _matching->set(odd, (*_pred)[odd]);
1690
        _status->set(odd, MATCHED);
1691
        oddToMatched(odd);
1692

	
1693
        prev = (*_matching)[even];
1694
        _status->set(even, MATCHED);
1695
        _matching->set(even, _graph.oppositeArc((*_matching)[odd]));
1696
        evenToMatched(even, tree);
1697
      }
1698
    }
1699

	
1700
    void destroyTree(int tree) {
1701
      for (typename TreeSet::ItemIt n(*_tree_set, tree); n != INVALID; ++n) {
1702
        if ((*_status)[n] == EVEN) {
1703
          _status->set(n, MATCHED);
1704
          evenToMatched(n, tree);
1705
        } else if ((*_status)[n] == ODD) {
1706
          _status->set(n, MATCHED);
1707
          oddToMatched(n);
1708
        }
1709
      }
1710
      _tree_set->eraseClass(tree);
1711
    }
1712

	
1713
    void augmentOnEdge(const Edge& edge) {
1714
      Node left = _graph.u(edge);
1715
      int left_tree = _tree_set->find(left);
1716

	
1717
      alternatePath(left, left_tree);
1718
      destroyTree(left_tree);
1719
      _matching->set(left, _graph.direct(edge, true));
1720

	
1721
      Node right = _graph.v(edge);
1722
      int right_tree = _tree_set->find(right);
1723

	
1724
      alternatePath(right, right_tree);
1725
      destroyTree(right_tree);
1726
      _matching->set(right, _graph.direct(edge, false));
1727
    }
1728

	
1729
    void augmentOnArc(const Arc& arc) {
1730
      Node left = _graph.source(arc);
1731
      _status->set(left, MATCHED);
1732
      _matching->set(left, arc);
1733
      _pred->set(left, arc);
1734

	
1735
      Node right = _graph.target(arc);
1736
      int right_tree = _tree_set->find(right);
1737

	
1738
      alternatePath(right, right_tree);
1739
      destroyTree(right_tree);
1740
      _matching->set(right, _graph.oppositeArc(arc));
1741
    }
1742

	
1743
    void extendOnArc(const Arc& arc) {
1744
      Node base = _graph.target(arc);
1745
      int tree = _tree_set->find(base);
1746

	
1747
      Node odd = _graph.source(arc);
1748
      _tree_set->insert(odd, tree);
1749
      _status->set(odd, ODD);
1750
      matchedToOdd(odd, tree);
1751
      _pred->set(odd, arc);
1752

	
1753
      Node even = _graph.target((*_matching)[odd]);
1754
      _tree_set->insert(even, tree);
1755
      _status->set(even, EVEN);
1756
      matchedToEven(even, tree);
1757
    }
1758

	
1759
    void cycleOnEdge(const Edge& edge, int tree) {
1760
      Node nca = INVALID;
1761
      std::vector<Node> left_path, right_path;
1762

	
1763
      {
1764
        std::set<Node> left_set, right_set;
1765
        Node left = _graph.u(edge);
1766
        left_path.push_back(left);
1767
        left_set.insert(left);
1768

	
1769
        Node right = _graph.v(edge);
1770
        right_path.push_back(right);
1771
        right_set.insert(right);
1772

	
1773
        while (true) {
1774

	
1775
          if (left_set.find(right) != left_set.end()) {
1776
            nca = right;
1777
            break;
1778
          }
1779

	
1780
          if ((*_matching)[left] == INVALID) break;
1781

	
1782
          left = _graph.target((*_matching)[left]);
1783
          left_path.push_back(left);
1784
          left = _graph.target((*_pred)[left]);
1785
          left_path.push_back(left);
1786

	
1787
          left_set.insert(left);
1788

	
1789
          if (right_set.find(left) != right_set.end()) {
1790
            nca = left;
1791
            break;
1792
          }
1793

	
1794
          if ((*_matching)[right] == INVALID) break;
1795

	
1796
          right = _graph.target((*_matching)[right]);
1797
          right_path.push_back(right);
1798
          right = _graph.target((*_pred)[right]);
1799
          right_path.push_back(right);
1800

	
1801
          right_set.insert(right);
1802

	
1803
        }
1804

	
1805
        if (nca == INVALID) {
1806
          if ((*_matching)[left] == INVALID) {
1807
            nca = right;
1808
            while (left_set.find(nca) == left_set.end()) {
1809
              nca = _graph.target((*_matching)[nca]);
1810
              right_path.push_back(nca);
1811
              nca = _graph.target((*_pred)[nca]);
1812
              right_path.push_back(nca);
1813
            }
1814
          } else {
1815
            nca = left;
1816
            while (right_set.find(nca) == right_set.end()) {
1817
              nca = _graph.target((*_matching)[nca]);
1818
              left_path.push_back(nca);
1819
              nca = _graph.target((*_pred)[nca]);
1820
              left_path.push_back(nca);
1821
            }
1822
          }
1823
        }
1824
      }
1825

	
1826
      alternatePath(nca, tree);
1827
      Arc prev;
1828

	
1829
      prev = _graph.direct(edge, true);
1830
      for (int i = 0; left_path[i] != nca; i += 2) {
1831
        _matching->set(left_path[i], prev);
1832
        _status->set(left_path[i], MATCHED);
1833
        evenToMatched(left_path[i], tree);
1834

	
1835
        prev = _graph.oppositeArc((*_pred)[left_path[i + 1]]);
1836
        _status->set(left_path[i + 1], MATCHED);
1837
        oddToMatched(left_path[i + 1]);
1838
      }
1839
      _matching->set(nca, prev);
1840

	
1841
      for (int i = 0; right_path[i] != nca; i += 2) {
1842
        _status->set(right_path[i], MATCHED);
1843
        evenToMatched(right_path[i], tree);
1844

	
1845
        _matching->set(right_path[i + 1], (*_pred)[right_path[i + 1]]);
1846
        _status->set(right_path[i + 1], MATCHED);
1847
        oddToMatched(right_path[i + 1]);
1848
      }
1849

	
1850
      destroyTree(tree);
1851
    }
1852

	
1853
    void extractCycle(const Arc &arc) {
1854
      Node left = _graph.source(arc);
1855
      Node odd = _graph.target((*_matching)[left]);
1856
      Arc prev;
1857
      while (odd != left) {
1858
        Node even = _graph.target((*_matching)[odd]);
1859
        prev = (*_matching)[odd];
1860
        odd = _graph.target((*_matching)[even]);
1861
        _matching->set(even, _graph.oppositeArc(prev));
1862
      }
1863
      _matching->set(left, arc);
1864

	
1865
      Node right = _graph.target(arc);
1866
      int right_tree = _tree_set->find(right);
1867
      alternatePath(right, right_tree);
1868
      destroyTree(right_tree);
1869
      _matching->set(right, _graph.oppositeArc(arc));
1870
    }
1871

	
1872
  public:
1873

	
1874
    /// \brief Constructor
1875
    ///
1876
    /// Constructor.
1877
    MaxWeightedPerfectFractionalMatching(const Graph& graph,
1878
                                         const WeightMap& weight,
1879
                                         bool allow_loops = true)
1880
      : _graph(graph), _weight(weight), _matching(0),
1881
      _node_potential(0), _node_num(0), _allow_loops(allow_loops),
1882
      _status(0),  _pred(0),
1883
      _tree_set_index(0), _tree_set(0),
1884

	
1885
      _delta2_index(0), _delta2(0),
1886
      _delta3_index(0), _delta3(0),
1887

	
1888
      _delta_sum() {}
1889

	
1890
    ~MaxWeightedPerfectFractionalMatching() {
1891
      destroyStructures();
1892
    }
1893

	
1894
    /// \name Execution Control
1895
    /// The simplest way to execute the algorithm is to use the
1896
    /// \ref run() member function.
1897

	
1898
    ///@{
1899

	
1900
    /// \brief Initialize the algorithm
1901
    ///
1902
    /// This function initializes the algorithm.
1903
    void init() {
1904
      createStructures();
1905

	
1906
      for (NodeIt n(_graph); n != INVALID; ++n) {
1907
        (*_delta2_index)[n] = _delta2->PRE_HEAP;
1908
      }
1909
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1910
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1911
      }
1912

	
1913
      _delta2->clear();
1914
      _delta3->clear();
1915
      _tree_set->clear();
1916

	
1917
      for (NodeIt n(_graph); n != INVALID; ++n) {
1918
        Value max = - std::numeric_limits<Value>::max();
1919
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1920
          if (_graph.target(e) == n && !_allow_loops) continue;
1921
          if ((dualScale * _weight[e]) / 2 > max) {
1922
            max = (dualScale * _weight[e]) / 2;
1923
          }
1924
        }
1925
        _node_potential->set(n, max);
1926

	
1927
        _tree_set->insert(n);
1928

	
1929
        _matching->set(n, INVALID);
1930
        _status->set(n, EVEN);
1931
      }
1932

	
1933
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1934
        Node left = _graph.u(e);
1935
        Node right = _graph.v(e);
1936
        if (left == right && !_allow_loops) continue;
1937
        _delta3->push(e, ((*_node_potential)[left] +
1938
                          (*_node_potential)[right] -
1939
                          dualScale * _weight[e]) / 2);
1940
      }
1941
    }
1942

	
1943
    /// \brief Start the algorithm
1944
    ///
1945
    /// This function starts the algorithm.
1946
    ///
1947
    /// \pre \ref init() must be called before using this function.
1948
    bool start() {
1949
      enum OpType {
1950
        D2, D3
1951
      };
1952

	
1953
      int unmatched = _node_num;
1954
      while (unmatched > 0) {
1955
        Value d2 = !_delta2->empty() ?
1956
          _delta2->prio() : std::numeric_limits<Value>::max();
1957

	
1958
        Value d3 = !_delta3->empty() ?
1959
          _delta3->prio() : std::numeric_limits<Value>::max();
1960

	
1961
        _delta_sum = d3; OpType ot = D3;
1962
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1963

	
1964
        if (_delta_sum == std::numeric_limits<Value>::max()) {
1965
          return false;
1966
        }
1967

	
1968
        switch (ot) {
1969
        case D2:
1970
          {
1971
            Node n = _delta2->top();
1972
            Arc a = (*_pred)[n];
1973
            if ((*_matching)[n] == INVALID) {
1974
              augmentOnArc(a);
1975
              --unmatched;
1976
            } else {
1977
              Node v = _graph.target((*_matching)[n]);
1978
              if ((*_matching)[n] !=
1979
                  _graph.oppositeArc((*_matching)[v])) {
1980
                extractCycle(a);
1981
                --unmatched;
1982
              } else {
1983
                extendOnArc(a);
1984
              }
1985
            }
1986
          } break;
1987
        case D3:
1988
          {
1989
            Edge e = _delta3->top();
1990

	
1991
            Node left = _graph.u(e);
1992
            Node right = _graph.v(e);
1993

	
1994
            int left_tree = _tree_set->find(left);
1995
            int right_tree = _tree_set->find(right);
1996

	
1997
            if (left_tree == right_tree) {
1998
              cycleOnEdge(e, left_tree);
1999
              --unmatched;
2000
            } else {
2001
              augmentOnEdge(e);
2002
              unmatched -= 2;
2003
            }
2004
          } break;
2005
        }
2006
      }
2007
      return true;
2008
    }
2009

	
2010
    /// \brief Run the algorithm.
2011
    ///
2012
    /// This method runs the \c %MaxWeightedPerfectFractionalMatching
2013
    /// algorithm.
2014
    ///
2015
    /// \note mwfm.run() is just a shortcut of the following code.
2016
    /// \code
2017
    ///   mwpfm.init();
2018
    ///   mwpfm.start();
2019
    /// \endcode
2020
    bool run() {
2021
      init();
2022
      return start();
2023
    }
2024

	
2025
    /// @}
2026

	
2027
    /// \name Primal Solution
2028
    /// Functions to get the primal solution, i.e. the maximum weighted
2029
    /// matching.\n
2030
    /// Either \ref run() or \ref start() function should be called before
2031
    /// using them.
2032

	
2033
    /// @{
2034

	
2035
    /// \brief Return the weight of the matching.
2036
    ///
2037
    /// This function returns the weight of the found matching. This
2038
    /// value is scaled by \ref primalScale "primal scale".
2039
    ///
2040
    /// \pre Either run() or start() must be called before using this function.
2041
    Value matchingWeight() const {
2042
      Value sum = 0;
2043
      for (NodeIt n(_graph); n != INVALID; ++n) {
2044
        if ((*_matching)[n] != INVALID) {
2045
          sum += _weight[(*_matching)[n]];
2046
        }
2047
      }
2048
      return sum * primalScale / 2;
2049
    }
2050

	
2051
    /// \brief Return the number of covered nodes in the matching.
2052
    ///
2053
    /// This function returns the number of covered nodes in the matching.
2054
    ///
2055
    /// \pre Either run() or start() must be called before using this function.
2056
    int matchingSize() const {
2057
      int num = 0;
2058
      for (NodeIt n(_graph); n != INVALID; ++n) {
2059
        if ((*_matching)[n] != INVALID) {
2060
          ++num;
2061
        }
2062
      }
2063
      return num;
2064
    }
2065

	
2066
    /// \brief Return \c true if the given edge is in the matching.
2067
    ///
2068
    /// This function returns \c true if the given edge is in the
2069
    /// found matching. The result is scaled by \ref primalScale
2070
    /// "primal scale".
2071
    ///
2072
    /// \pre Either run() or start() must be called before using this function.
2073
    int matching(const Edge& edge) const {
2074
      return (edge == (*_matching)[_graph.u(edge)] ? 1 : 0)
2075
        + (edge == (*_matching)[_graph.v(edge)] ? 1 : 0);
2076
    }
2077

	
2078
    /// \brief Return the fractional matching arc (or edge) incident
2079
    /// to the given node.
2080
    ///
2081
    /// This function returns one of the fractional matching arc (or
2082
    /// edge) incident to the given node in the found matching or \c
2083
    /// INVALID if the node is not covered by the matching or if the
2084
    /// node is on an odd length cycle then it is the successor edge
2085
    /// on the cycle.
2086
    ///
2087
    /// \pre Either run() or start() must be called before using this function.
2088
    Arc matching(const Node& node) const {
2089
      return (*_matching)[node];
2090
    }
2091

	
2092
    /// \brief Return a const reference to the matching map.
2093
    ///
2094
    /// This function returns a const reference to a node map that stores
2095
    /// the matching arc (or edge) incident to each node.
2096
    const MatchingMap& matchingMap() const {
2097
      return *_matching;
2098
    }
2099

	
2100
    /// @}
2101

	
2102
    /// \name Dual Solution
2103
    /// Functions to get the dual solution.\n
2104
    /// Either \ref run() or \ref start() function should be called before
2105
    /// using them.
2106

	
2107
    /// @{
2108

	
2109
    /// \brief Return the value of the dual solution.
2110
    ///
2111
    /// This function returns the value of the dual solution.
2112
    /// It should be equal to the primal value scaled by \ref dualScale
2113
    /// "dual scale".
2114
    ///
2115
    /// \pre Either run() or start() must be called before using this function.
2116
    Value dualValue() const {
2117
      Value sum = 0;
2118
      for (NodeIt n(_graph); n != INVALID; ++n) {
2119
        sum += nodeValue(n);
2120
      }
2121
      return sum;
2122
    }
2123

	
2124
    /// \brief Return the dual value (potential) of the given node.
2125
    ///
2126
    /// This function returns the dual value (potential) of the given node.
2127
    ///
2128
    /// \pre Either run() or start() must be called before using this function.
2129
    Value nodeValue(const Node& n) const {
2130
      return (*_node_potential)[n];
2131
    }
2132

	
2133
    /// @}
2134

	
2135
  };
2136

	
2137
} //END OF NAMESPACE LEMON
2138

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

	
19
#ifndef LEMON_HARTMANN_ORLIN_MMC_H
20
#define LEMON_HARTMANN_ORLIN_MMC_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Hartmann-Orlin's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of HartmannOrlinMmc class.
37
  ///
38
  /// Default traits class of HartmannOrlinMmc class.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam CM The type of the cost map.
41
  /// It must conform to the \ref concepts::Rea_data "Rea_data" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename CM>
44
#else
45
  template <typename GR, typename CM,
46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47
#endif
48
  struct HartmannOrlinMmcDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the cost map
53
    typedef CM CostMap;
54
    /// The type of the arc costs
55
    typedef typename CostMap::Value Cost;
56

	
57
    /// \brief The large cost type used for internal computations
58
    ///
59
    /// The large cost type used for internal computations.
60
    /// It is \c long \c long if the \c Cost type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Cost must be convertible to \c LargeCost.
63
    typedef double LargeCost;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addFront() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer cost types
77
  template <typename GR, typename CM>
78
  struct HartmannOrlinMmcDefaultTraits<GR, CM, true>
79
  {
80
    typedef GR Digraph;
81
    typedef CM CostMap;
82
    typedef typename CostMap::Value Cost;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeCost;
85
#else
86
    typedef long LargeCost;
87
#endif
88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of the Hartmann-Orlin algorithm for finding
97
  /// a minimum mean cycle.
98
  ///
99
  /// This class implements the Hartmann-Orlin algorithm for finding
100
  /// a directed cycle of minimum mean cost in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// It is an improved version of \ref Karp "Karp"'s original algorithm,
103
  /// it applies an efficient early termination scheme.
104
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
105
  ///
106
  /// \tparam GR The type of the digraph the algorithm runs on.
107
  /// \tparam CM The type of the cost map. The default
108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109
  /// \tparam TR The traits class that defines various types used by the
110
  /// algorithm. By default, it is \ref HartmannOrlinMmcDefaultTraits
111
  /// "HartmannOrlinMmcDefaultTraits<GR, CM>".
112
  /// In most cases, this parameter should not be set directly,
113
  /// consider to use the named template parameters instead.
114
#ifdef DOXYGEN
115
  template <typename GR, typename CM, typename TR>
116
#else
117
  template < typename GR,
118
             typename CM = typename GR::template ArcMap<int>,
119
             typename TR = HartmannOrlinMmcDefaultTraits<GR, CM> >
120
#endif
121
  class HartmannOrlinMmc
122
  {
123
  public:
124

	
125
    /// The type of the digraph
126
    typedef typename TR::Digraph Digraph;
127
    /// The type of the cost map
128
    typedef typename TR::CostMap CostMap;
129
    /// The type of the arc costs
130
    typedef typename TR::Cost Cost;
131

	
132
    /// \brief The large cost type
133
    ///
134
    /// The large cost type used for internal computations.
135
    /// By default, it is \c long \c long if the \c Cost type is integer,
136
    /// otherwise it is \c double.
137
    typedef typename TR::LargeCost LargeCost;
138

	
139
    /// The tolerance type
140
    typedef typename TR::Tolerance Tolerance;
141

	
142
    /// \brief The path type of the found cycles
143
    ///
144
    /// The path type of the found cycles.
145
    /// Using the \ref HartmannOrlinMmcDefaultTraits "default traits class",
146
    /// it is \ref lemon::Path "Path<Digraph>".
147
    typedef typename TR::Path Path;
148

	
149
    /// The \ref HartmannOrlinMmcDefaultTraits "traits class" of the algorithm
150
    typedef TR Traits;
151

	
152
  private:
153

	
154
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
155

	
156
    // Data sturcture for path data
157
    struct PathData
158
    {
159
      LargeCost dist;
160
      Arc pred;
161
      PathData(LargeCost d, Arc p = INVALID) :
162
        dist(d), pred(p) {}
163
    };
164

	
165
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
166
      PathDataNodeMap;
167

	
168
  private:
169

	
170
    // The digraph the algorithm runs on
171
    const Digraph &_gr;
172
    // The cost of the arcs
173
    const CostMap &_cost;
174

	
175
    // Data for storing the strongly connected components
176
    int _comp_num;
177
    typename Digraph::template NodeMap<int> _comp;
178
    std::vector<std::vector<Node> > _comp_nodes;
179
    std::vector<Node>* _nodes;
180
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
181

	
182
    // Data for the found cycles
183
    bool _curr_found, _best_found;
184
    LargeCost _curr_cost, _best_cost;
185
    int _curr_size, _best_size;
186
    Node _curr_node, _best_node;
187
    int _curr_level, _best_level;
188

	
189
    Path *_cycle_path;
190
    bool _local_path;
191

	
192
    // Node map for storing path data
193
    PathDataNodeMap _data;
194
    // The processed nodes in the last round
195
    std::vector<Node> _process;
196

	
197
    Tolerance _tolerance;
198

	
199
    // Infinite constant
200
    const LargeCost INF;
201

	
202
  public:
203

	
204
    /// \name Named Template Parameters
205
    /// @{
206

	
207
    template <typename T>
208
    struct SetLargeCostTraits : public Traits {
209
      typedef T LargeCost;
210
      typedef lemon::Tolerance<T> Tolerance;
211
    };
212

	
213
    /// \brief \ref named-templ-param "Named parameter" for setting
214
    /// \c LargeCost type.
215
    ///
216
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
217
    /// type. It is used for internal computations in the algorithm.
218
    template <typename T>
219
    struct SetLargeCost
220
      : public HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > {
221
      typedef HartmannOrlinMmc<GR, CM, SetLargeCostTraits<T> > Create;
222
    };
223

	
224
    template <typename T>
225
    struct SetPathTraits : public Traits {
226
      typedef T Path;
227
    };
228

	
229
    /// \brief \ref named-templ-param "Named parameter" for setting
230
    /// \c %Path type.
231
    ///
232
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
233
    /// type of the found cycles.
234
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
235
    /// and it must have an \c addFront() function.
236
    template <typename T>
237
    struct SetPath
238
      : public HartmannOrlinMmc<GR, CM, SetPathTraits<T> > {
239
      typedef HartmannOrlinMmc<GR, CM, SetPathTraits<T> > Create;
240
    };
241

	
242
    /// @}
243

	
244
  protected:
245

	
246
    HartmannOrlinMmc() {}
247

	
248
  public:
249

	
250
    /// \brief Constructor.
251
    ///
252
    /// The constructor of the class.
253
    ///
254
    /// \param digraph The digraph the algorithm runs on.
255
    /// \param cost The costs of the arcs.
256
    HartmannOrlinMmc( const Digraph &digraph,
257
                      const CostMap &cost ) :
258
      _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph),
259
      _best_found(false), _best_cost(0), _best_size(1),
260
      _cycle_path(NULL), _local_path(false), _data(digraph),
261
      INF(std::numeric_limits<LargeCost>::has_infinity ?
262
          std::numeric_limits<LargeCost>::infinity() :
263
          std::numeric_limits<LargeCost>::max())
264
    {}
265

	
266
    /// Destructor.
267
    ~HartmannOrlinMmc() {
268
      if (_local_path) delete _cycle_path;
269
    }
270

	
271
    /// \brief Set the path structure for storing the found cycle.
272
    ///
273
    /// This function sets an external path structure for storing the
274
    /// found cycle.
275
    ///
276
    /// If you don't call this function before calling \ref run() or
277
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
278
    /// structure. The destuctor deallocates this automatically
279
    /// allocated object, of course.
280
    ///
281
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
282
    /// "addFront()" function of the given path structure.
283
    ///
284
    /// \return <tt>(*this)</tt>
285
    HartmannOrlinMmc& cycle(Path &path) {
286
      if (_local_path) {
287
        delete _cycle_path;
288
        _local_path = false;
289
      }
290
      _cycle_path = &path;
291
      return *this;
292
    }
293

	
294
    /// \brief Set the tolerance used by the algorithm.
295
    ///
296
    /// This function sets the tolerance object used by the algorithm.
297
    ///
298
    /// \return <tt>(*this)</tt>
299
    HartmannOrlinMmc& tolerance(const Tolerance& tolerance) {
300
      _tolerance = tolerance;
301
      return *this;
302
    }
303

	
304
    /// \brief Return a const reference to the tolerance.
305
    ///
306
    /// This function returns a const reference to the tolerance object
307
    /// used by the algorithm.
308
    const Tolerance& tolerance() const {
309
      return _tolerance;
310
    }
311

	
312
    /// \name Execution control
313
    /// The simplest way to execute the algorithm is to call the \ref run()
314
    /// function.\n
315
    /// If you only need the minimum mean cost, you may call
316
    /// \ref findCycleMean().
317

	
318
    /// @{
319

	
320
    /// \brief Run the algorithm.
321
    ///
322
    /// This function runs the algorithm.
323
    /// It can be called more than once (e.g. if the underlying digraph
324
    /// and/or the arc costs have been modified).
325
    ///
326
    /// \return \c true if a directed cycle exists in the digraph.
327
    ///
328
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
329
    /// \code
330
    ///   return mmc.findCycleMean() && mmc.findCycle();
331
    /// \endcode
332
    bool run() {
333
      return findCycleMean() && findCycle();
334
    }
335

	
336
    /// \brief Find the minimum cycle mean.
337
    ///
338
    /// This function finds the minimum mean cost of the directed
339
    /// cycles in the digraph.
340
    ///
341
    /// \return \c true if a directed cycle exists in the digraph.
342
    bool findCycleMean() {
343
      // Initialization and find strongly connected components
344
      init();
345
      findComponents();
346

	
347
      // Find the minimum cycle mean in the components
348
      for (int comp = 0; comp < _comp_num; ++comp) {
349
        if (!initComponent(comp)) continue;
350
        processRounds();
351

	
352
        // Update the best cycle (global minimum mean cycle)
353
        if ( _curr_found && (!_best_found ||
354
             _curr_cost * _best_size < _best_cost * _curr_size) ) {
355
          _best_found = true;
356
          _best_cost = _curr_cost;
357
          _best_size = _curr_size;
358
          _best_node = _curr_node;
359
          _best_level = _curr_level;
360
        }
361
      }
362
      return _best_found;
363
    }
364

	
365
    /// \brief Find a minimum mean directed cycle.
366
    ///
367
    /// This function finds a directed cycle of minimum mean cost
368
    /// in the digraph using the data computed by findCycleMean().
369
    ///
370
    /// \return \c true if a directed cycle exists in the digraph.
371
    ///
372
    /// \pre \ref findCycleMean() must be called before using this function.
373
    bool findCycle() {
374
      if (!_best_found) return false;
375
      IntNodeMap reached(_gr, -1);
376
      int r = _best_level + 1;
377
      Node u = _best_node;
378
      while (reached[u] < 0) {
379
        reached[u] = --r;
380
        u = _gr.source(_data[u][r].pred);
381
      }
382
      r = reached[u];
383
      Arc e = _data[u][r].pred;
384
      _cycle_path->addFront(e);
385
      _best_cost = _cost[e];
386
      _best_size = 1;
387
      Node v;
388
      while ((v = _gr.source(e)) != u) {
389
        e = _data[v][--r].pred;
390
        _cycle_path->addFront(e);
391
        _best_cost += _cost[e];
392
        ++_best_size;
393
      }
394
      return true;
395
    }
396

	
397
    /// @}
398

	
399
    /// \name Query Functions
400
    /// The results of the algorithm can be obtained using these
401
    /// functions.\n
402
    /// The algorithm should be executed before using them.
403

	
404
    /// @{
405

	
406
    /// \brief Return the total cost of the found cycle.
407
    ///
408
    /// This function returns the total cost of the found cycle.
409
    ///
410
    /// \pre \ref run() or \ref findCycleMean() must be called before
411
    /// using this function.
412
    Cost cycleCost() const {
413
      return static_cast<Cost>(_best_cost);
414
    }
415

	
416
    /// \brief Return the number of arcs on the found cycle.
417
    ///
418
    /// This function returns the number of arcs on the found cycle.
419
    ///
420
    /// \pre \ref run() or \ref findCycleMean() must be called before
421
    /// using this function.
422
    int cycleSize() const {
423
      return _best_size;
424
    }
425

	
426
    /// \brief Return the mean cost of the found cycle.
427
    ///
428
    /// This function returns the mean cost of the found cycle.
429
    ///
430
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
431
    /// following code.
432
    /// \code
433
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
434
    /// \endcode
435
    ///
436
    /// \pre \ref run() or \ref findCycleMean() must be called before
437
    /// using this function.
438
    double cycleMean() const {
439
      return static_cast<double>(_best_cost) / _best_size;
440
    }
441

	
442
    /// \brief Return the found cycle.
443
    ///
444
    /// This function returns a const reference to the path structure
445
    /// storing the found cycle.
446
    ///
447
    /// \pre \ref run() or \ref findCycle() must be called before using
448
    /// this function.
449
    const Path& cycle() const {
450
      return *_cycle_path;
451
    }
452

	
453
    ///@}
454

	
455
  private:
456

	
457
    // Initialization
458
    void init() {
459
      if (!_cycle_path) {
460
        _local_path = true;
461
        _cycle_path = new Path;
462
      }
463
      _cycle_path->clear();
464
      _best_found = false;
465
      _best_cost = 0;
466
      _best_size = 1;
467
      _cycle_path->clear();
468
      for (NodeIt u(_gr); u != INVALID; ++u)
469
        _data[u].clear();
470
    }
471

	
472
    // Find strongly connected components and initialize _comp_nodes
473
    // and _out_arcs
474
    void findComponents() {
475
      _comp_num = stronglyConnectedComponents(_gr, _comp);
476
      _comp_nodes.resize(_comp_num);
477
      if (_comp_num == 1) {
478
        _comp_nodes[0].clear();
479
        for (NodeIt n(_gr); n != INVALID; ++n) {
480
          _comp_nodes[0].push_back(n);
481
          _out_arcs[n].clear();
482
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
483
            _out_arcs[n].push_back(a);
484
          }
485
        }
486
      } else {
487
        for (int i = 0; i < _comp_num; ++i)
488
          _comp_nodes[i].clear();
489
        for (NodeIt n(_gr); n != INVALID; ++n) {
490
          int k = _comp[n];
491
          _comp_nodes[k].push_back(n);
492
          _out_arcs[n].clear();
493
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
494
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
495
          }
496
        }
497
      }
498
    }
499

	
500
    // Initialize path data for the current component
501
    bool initComponent(int comp) {
502
      _nodes = &(_comp_nodes[comp]);
503
      int n = _nodes->size();
504
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
505
        return false;
506
      }
507
      for (int i = 0; i < n; ++i) {
508
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
509
      }
510
      return true;
511
    }
512

	
513
    // Process all rounds of computing path data for the current component.
514
    // _data[v][k] is the cost of a shortest directed walk from the root
515
    // node to node v containing exactly k arcs.
516
    void processRounds() {
517
      Node start = (*_nodes)[0];
518
      _data[start][0] = PathData(0);
519
      _process.clear();
520
      _process.push_back(start);
521

	
522
      int k, n = _nodes->size();
523
      int next_check = 4;
524
      bool terminate = false;
525
      for (k = 1; k <= n && int(_process.size()) < n && !terminate; ++k) {
526
        processNextBuildRound(k);
527
        if (k == next_check || k == n) {
528
          terminate = checkTermination(k);
529
          next_check = next_check * 3 / 2;
530
        }
531
      }
532
      for ( ; k <= n && !terminate; ++k) {
533
        processNextFullRound(k);
534
        if (k == next_check || k == n) {
535
          terminate = checkTermination(k);
536
          next_check = next_check * 3 / 2;
537
        }
538
      }
539
    }
540

	
541
    // Process one round and rebuild _process
542
    void processNextBuildRound(int k) {
543
      std::vector<Node> next;
544
      Node u, v;
545
      Arc e;
546
      LargeCost d;
547
      for (int i = 0; i < int(_process.size()); ++i) {
548
        u = _process[i];
549
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
550
          e = _out_arcs[u][j];
551
          v = _gr.target(e);
552
          d = _data[u][k-1].dist + _cost[e];
553
          if (_tolerance.less(d, _data[v][k].dist)) {
554
            if (_data[v][k].dist == INF) next.push_back(v);
555
            _data[v][k] = PathData(d, e);
556
          }
557
        }
558
      }
559
      _process.swap(next);
560
    }
561

	
562
    // Process one round using _nodes instead of _process
563
    void processNextFullRound(int k) {
564
      Node u, v;
565
      Arc e;
566
      LargeCost d;
567
      for (int i = 0; i < int(_nodes->size()); ++i) {
568
        u = (*_nodes)[i];
569
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
570
          e = _out_arcs[u][j];
571
          v = _gr.target(e);
572
          d = _data[u][k-1].dist + _cost[e];
573
          if (_tolerance.less(d, _data[v][k].dist)) {
574
            _data[v][k] = PathData(d, e);
575
          }
576
        }
577
      }
578
    }
579

	
580
    // Check early termination
581
    bool checkTermination(int k) {
582
      typedef std::pair<int, int> Pair;
583
      typename GR::template NodeMap<Pair> level(_gr, Pair(-1, 0));
584
      typename GR::template NodeMap<LargeCost> pi(_gr);
585
      int n = _nodes->size();
586
      LargeCost cost;
587
      int size;
588
      Node u;
589

	
590
      // Search for cycles that are already found
591
      _curr_found = false;
592
      for (int i = 0; i < n; ++i) {
593
        u = (*_nodes)[i];
594
        if (_data[u][k].dist == INF) continue;
595
        for (int j = k; j >= 0; --j) {
596
          if (level[u].first == i && level[u].second > 0) {
597
            // A cycle is found
598
            cost = _data[u][level[u].second].dist - _data[u][j].dist;
599
            size = level[u].second - j;
600
            if (!_curr_found || cost * _curr_size < _curr_cost * size) {
601
              _curr_cost = cost;
602
              _curr_size = size;
603
              _curr_node = u;
604
              _curr_level = level[u].second;
605
              _curr_found = true;
606
            }
607
          }
608
          level[u] = Pair(i, j);
609
          if (j != 0) {
610
            u = _gr.source(_data[u][j].pred);
611
          }
612
        }
613
      }
614

	
615
      // If at least one cycle is found, check the optimality condition
616
      LargeCost d;
617
      if (_curr_found && k < n) {
618
        // Find node potentials
619
        for (int i = 0; i < n; ++i) {
620
          u = (*_nodes)[i];
621
          pi[u] = INF;
622
          for (int j = 0; j <= k; ++j) {
623
            if (_data[u][j].dist < INF) {
624
              d = _data[u][j].dist * _curr_size - j * _curr_cost;
625
              if (_tolerance.less(d, pi[u])) pi[u] = d;
626
            }
627
          }
628
        }
629

	
630
        // Check the optimality condition for all arcs
631
        bool done = true;
632
        for (ArcIt a(_gr); a != INVALID; ++a) {
633
          if (_tolerance.less(_cost[a] * _curr_size - _curr_cost,
634
                              pi[_gr.target(a)] - pi[_gr.source(a)]) ) {
635
            done = false;
636
            break;
637
          }
638
        }
639
        return done;
640
      }
641
      return (k == n);
642
    }
643

	
644
  }; //class HartmannOrlinMmc
645

	
646
  ///@}
647

	
648
} //namespace lemon
649

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

	
19
#ifndef LEMON_HOWARD_MMC_H
20
#define LEMON_HOWARD_MMC_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Howard's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of HowardMmc class.
37
  ///
38
  /// Default traits class of HowardMmc class.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam CM The type of the cost map.
41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename CM>
44
#else
45
  template <typename GR, typename CM,
46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47
#endif
48
  struct HowardMmcDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the cost map
53
    typedef CM CostMap;
54
    /// The type of the arc costs
55
    typedef typename CostMap::Value Cost;
56

	
57
    /// \brief The large cost type used for internal computations
58
    ///
59
    /// The large cost type used for internal computations.
60
    /// It is \c long \c long if the \c Cost type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Cost must be convertible to \c LargeCost.
63
    typedef double LargeCost;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addBack() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer cost types
77
  template <typename GR, typename CM>
78
  struct HowardMmcDefaultTraits<GR, CM, true>
79
  {
80
    typedef GR Digraph;
81
    typedef CM CostMap;
82
    typedef typename CostMap::Value Cost;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeCost;
85
#else
86
    typedef long LargeCost;
87
#endif
88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of Howard's algorithm for finding a minimum
97
  /// mean cycle.
98
  ///
99
  /// This class implements Howard's policy iteration algorithm for finding
100
  /// a directed cycle of minimum mean cost in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// This class provides the most efficient algorithm for the
103
  /// minimum mean cycle problem, though the best known theoretical
104
  /// bound on its running time is exponential.
105
  ///
106
  /// \tparam GR The type of the digraph the algorithm runs on.
107
  /// \tparam CM The type of the cost map. The default
108
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
109
  /// \tparam TR The traits class that defines various types used by the
110
  /// algorithm. By default, it is \ref HowardMmcDefaultTraits
111
  /// "HowardMmcDefaultTraits<GR, CM>".
112
  /// In most cases, this parameter should not be set directly,
113
  /// consider to use the named template parameters instead.
114
#ifdef DOXYGEN
115
  template <typename GR, typename CM, typename TR>
116
#else
117
  template < typename GR,
118
             typename CM = typename GR::template ArcMap<int>,
119
             typename TR = HowardMmcDefaultTraits<GR, CM> >
120
#endif
121
  class HowardMmc
122
  {
123
  public:
124

	
125
    /// The type of the digraph
126
    typedef typename TR::Digraph Digraph;
127
    /// The type of the cost map
128
    typedef typename TR::CostMap CostMap;
129
    /// The type of the arc costs
130
    typedef typename TR::Cost Cost;
131

	
132
    /// \brief The large cost type
133
    ///
134
    /// The large cost type used for internal computations.
135
    /// By default, it is \c long \c long if the \c Cost type is integer,
136
    /// otherwise it is \c double.
137
    typedef typename TR::LargeCost LargeCost;
138

	
139
    /// The tolerance type
140
    typedef typename TR::Tolerance Tolerance;
141

	
142
    /// \brief The path type of the found cycles
143
    ///
144
    /// The path type of the found cycles.
145
    /// Using the \ref HowardMmcDefaultTraits "default traits class",
146
    /// it is \ref lemon::Path "Path<Digraph>".
147
    typedef typename TR::Path Path;
148

	
149
    /// The \ref HowardMmcDefaultTraits "traits class" of the algorithm
150
    typedef TR Traits;
151

	
152
  private:
153

	
154
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
155

	
156
    // The digraph the algorithm runs on
157
    const Digraph &_gr;
158
    // The cost of the arcs
159
    const CostMap &_cost;
160

	
161
    // Data for the found cycles
162
    bool _curr_found, _best_found;
163
    LargeCost _curr_cost, _best_cost;
164
    int _curr_size, _best_size;
165
    Node _curr_node, _best_node;
166

	
167
    Path *_cycle_path;
168
    bool _local_path;
169

	
170
    // Internal data used by the algorithm
171
    typename Digraph::template NodeMap<Arc> _policy;
172
    typename Digraph::template NodeMap<bool> _reached;
173
    typename Digraph::template NodeMap<int> _level;
174
    typename Digraph::template NodeMap<LargeCost> _dist;
175

	
176
    // Data for storing the strongly connected components
177
    int _comp_num;
178
    typename Digraph::template NodeMap<int> _comp;
179
    std::vector<std::vector<Node> > _comp_nodes;
180
    std::vector<Node>* _nodes;
181
    typename Digraph::template NodeMap<std::vector<Arc> > _in_arcs;
182

	
183
    // Queue used for BFS search
184
    std::vector<Node> _queue;
185
    int _qfront, _qback;
186

	
187
    Tolerance _tolerance;
188

	
189
    // Infinite constant
190
    const LargeCost INF;
191

	
192
  public:
193

	
194
    /// \name Named Template Parameters
195
    /// @{
196

	
197
    template <typename T>
198
    struct SetLargeCostTraits : public Traits {
199
      typedef T LargeCost;
200
      typedef lemon::Tolerance<T> Tolerance;
201
    };
202

	
203
    /// \brief \ref named-templ-param "Named parameter" for setting
204
    /// \c LargeCost type.
205
    ///
206
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
207
    /// type. It is used for internal computations in the algorithm.
208
    template <typename T>
209
    struct SetLargeCost
210
      : public HowardMmc<GR, CM, SetLargeCostTraits<T> > {
211
      typedef HowardMmc<GR, CM, SetLargeCostTraits<T> > Create;
212
    };
213

	
214
    template <typename T>
215
    struct SetPathTraits : public Traits {
216
      typedef T Path;
217
    };
218

	
219
    /// \brief \ref named-templ-param "Named parameter" for setting
220
    /// \c %Path type.
221
    ///
222
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
223
    /// type of the found cycles.
224
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
225
    /// and it must have an \c addBack() function.
226
    template <typename T>
227
    struct SetPath
228
      : public HowardMmc<GR, CM, SetPathTraits<T> > {
229
      typedef HowardMmc<GR, CM, SetPathTraits<T> > Create;
230
    };
231

	
232
    /// @}
233

	
234
  protected:
235

	
236
    HowardMmc() {}
237

	
238
  public:
239

	
240
    /// \brief Constructor.
241
    ///
242
    /// The constructor of the class.
243
    ///
244
    /// \param digraph The digraph the algorithm runs on.
245
    /// \param cost The costs of the arcs.
246
    HowardMmc( const Digraph &digraph,
247
               const CostMap &cost ) :
248
      _gr(digraph), _cost(cost), _best_found(false),
249
      _best_cost(0), _best_size(1), _cycle_path(NULL), _local_path(false),
250
      _policy(digraph), _reached(digraph), _level(digraph), _dist(digraph),
251
      _comp(digraph), _in_arcs(digraph),
252
      INF(std::numeric_limits<LargeCost>::has_infinity ?
253
          std::numeric_limits<LargeCost>::infinity() :
254
          std::numeric_limits<LargeCost>::max())
255
    {}
256

	
257
    /// Destructor.
258
    ~HowardMmc() {
259
      if (_local_path) delete _cycle_path;
260
    }
261

	
262
    /// \brief Set the path structure for storing the found cycle.
263
    ///
264
    /// This function sets an external path structure for storing the
265
    /// found cycle.
266
    ///
267
    /// If you don't call this function before calling \ref run() or
268
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
269
    /// structure. The destuctor deallocates this automatically
270
    /// allocated object, of course.
271
    ///
272
    /// \note The algorithm calls only the \ref lemon::Path::addBack()
273
    /// "addBack()" function of the given path structure.
274
    ///
275
    /// \return <tt>(*this)</tt>
276
    HowardMmc& cycle(Path &path) {
277
      if (_local_path) {
278
        delete _cycle_path;
279
        _local_path = false;
280
      }
281
      _cycle_path = &path;
282
      return *this;
283
    }
284

	
285
    /// \brief Set the tolerance used by the algorithm.
286
    ///
287
    /// This function sets the tolerance object used by the algorithm.
288
    ///
289
    /// \return <tt>(*this)</tt>
290
    HowardMmc& tolerance(const Tolerance& tolerance) {
291
      _tolerance = tolerance;
292
      return *this;
293
    }
294

	
295
    /// \brief Return a const reference to the tolerance.
296
    ///
297
    /// This function returns a const reference to the tolerance object
298
    /// used by the algorithm.
299
    const Tolerance& tolerance() const {
300
      return _tolerance;
301
    }
302

	
303
    /// \name Execution control
304
    /// The simplest way to execute the algorithm is to call the \ref run()
305
    /// function.\n
306
    /// If you only need the minimum mean cost, you may call
307
    /// \ref findCycleMean().
308

	
309
    /// @{
310

	
311
    /// \brief Run the algorithm.
312
    ///
313
    /// This function runs the algorithm.
314
    /// It can be called more than once (e.g. if the underlying digraph
315
    /// and/or the arc costs have been modified).
316
    ///
317
    /// \return \c true if a directed cycle exists in the digraph.
318
    ///
319
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
320
    /// \code
321
    ///   return mmc.findCycleMean() && mmc.findCycle();
322
    /// \endcode
323
    bool run() {
324
      return findCycleMean() && findCycle();
325
    }
326

	
327
    /// \brief Find the minimum cycle mean.
328
    ///
329
    /// This function finds the minimum mean cost of the directed
330
    /// cycles in the digraph.
331
    ///
332
    /// \return \c true if a directed cycle exists in the digraph.
333
    bool findCycleMean() {
334
      // Initialize and find strongly connected components
335
      init();
336
      findComponents();
337

	
338
      // Find the minimum cycle mean in the components
339
      for (int comp = 0; comp < _comp_num; ++comp) {
340
        // Find the minimum mean cycle in the current component
341
        if (!buildPolicyGraph(comp)) continue;
342
        while (true) {
343
          findPolicyCycle();
344
          if (!computeNodeDistances()) break;
345
        }
346
        // Update the best cycle (global minimum mean cycle)
347
        if ( _curr_found && (!_best_found ||
348
             _curr_cost * _best_size < _best_cost * _curr_size) ) {
349
          _best_found = true;
350
          _best_cost = _curr_cost;
351
          _best_size = _curr_size;
352
          _best_node = _curr_node;
353
        }
354
      }
355
      return _best_found;
356
    }
357

	
358
    /// \brief Find a minimum mean directed cycle.
359
    ///
360
    /// This function finds a directed cycle of minimum mean cost
361
    /// in the digraph using the data computed by findCycleMean().
362
    ///
363
    /// \return \c true if a directed cycle exists in the digraph.
364
    ///
365
    /// \pre \ref findCycleMean() must be called before using this function.
366
    bool findCycle() {
367
      if (!_best_found) return false;
368
      _cycle_path->addBack(_policy[_best_node]);
369
      for ( Node v = _best_node;
370
            (v = _gr.target(_policy[v])) != _best_node; ) {
371
        _cycle_path->addBack(_policy[v]);
372
      }
373
      return true;
374
    }
375

	
376
    /// @}
377

	
378
    /// \name Query Functions
379
    /// The results of the algorithm can be obtained using these
380
    /// functions.\n
381
    /// The algorithm should be executed before using them.
382

	
383
    /// @{
384

	
385
    /// \brief Return the total cost of the found cycle.
386
    ///
387
    /// This function returns the total cost of the found cycle.
388
    ///
389
    /// \pre \ref run() or \ref findCycleMean() must be called before
390
    /// using this function.
391
    Cost cycleCost() const {
392
      return static_cast<Cost>(_best_cost);
393
    }
394

	
395
    /// \brief Return the number of arcs on the found cycle.
396
    ///
397
    /// This function returns the number of arcs on the found cycle.
398
    ///
399
    /// \pre \ref run() or \ref findCycleMean() must be called before
400
    /// using this function.
401
    int cycleSize() const {
402
      return _best_size;
403
    }
404

	
405
    /// \brief Return the mean cost of the found cycle.
406
    ///
407
    /// This function returns the mean cost of the found cycle.
408
    ///
409
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
410
    /// following code.
411
    /// \code
412
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
413
    /// \endcode
414
    ///
415
    /// \pre \ref run() or \ref findCycleMean() must be called before
416
    /// using this function.
417
    double cycleMean() const {
418
      return static_cast<double>(_best_cost) / _best_size;
419
    }
420

	
421
    /// \brief Return the found cycle.
422
    ///
423
    /// This function returns a const reference to the path structure
424
    /// storing the found cycle.
425
    ///
426
    /// \pre \ref run() or \ref findCycle() must be called before using
427
    /// this function.
428
    const Path& cycle() const {
429
      return *_cycle_path;
430
    }
431

	
432
    ///@}
433

	
434
  private:
435

	
436
    // Initialize
437
    void init() {
438
      if (!_cycle_path) {
439
        _local_path = true;
440
        _cycle_path = new Path;
441
      }
442
      _queue.resize(countNodes(_gr));
443
      _best_found = false;
444
      _best_cost = 0;
445
      _best_size = 1;
446
      _cycle_path->clear();
447
    }
448

	
449
    // Find strongly connected components and initialize _comp_nodes
450
    // and _in_arcs
451
    void findComponents() {
452
      _comp_num = stronglyConnectedComponents(_gr, _comp);
453
      _comp_nodes.resize(_comp_num);
454
      if (_comp_num == 1) {
455
        _comp_nodes[0].clear();
456
        for (NodeIt n(_gr); n != INVALID; ++n) {
457
          _comp_nodes[0].push_back(n);
458
          _in_arcs[n].clear();
459
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
460
            _in_arcs[n].push_back(a);
461
          }
462
        }
463
      } else {
464
        for (int i = 0; i < _comp_num; ++i)
465
          _comp_nodes[i].clear();
466
        for (NodeIt n(_gr); n != INVALID; ++n) {
467
          int k = _comp[n];
468
          _comp_nodes[k].push_back(n);
469
          _in_arcs[n].clear();
470
          for (InArcIt a(_gr, n); a != INVALID; ++a) {
471
            if (_comp[_gr.source(a)] == k) _in_arcs[n].push_back(a);
472
          }
473
        }
474
      }
475
    }
476

	
477
    // Build the policy graph in the given strongly connected component
478
    // (the out-degree of every node is 1)
479
    bool buildPolicyGraph(int comp) {
480
      _nodes = &(_comp_nodes[comp]);
481
      if (_nodes->size() < 1 ||
482
          (_nodes->size() == 1 && _in_arcs[(*_nodes)[0]].size() == 0)) {
483
        return false;
484
      }
485
      for (int i = 0; i < int(_nodes->size()); ++i) {
486
        _dist[(*_nodes)[i]] = INF;
487
      }
488
      Node u, v;
489
      Arc e;
490
      for (int i = 0; i < int(_nodes->size()); ++i) {
491
        v = (*_nodes)[i];
492
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
493
          e = _in_arcs[v][j];
494
          u = _gr.source(e);
495
          if (_cost[e] < _dist[u]) {
496
            _dist[u] = _cost[e];
497
            _policy[u] = e;
498
          }
499
        }
500
      }
501
      return true;
502
    }
503

	
504
    // Find the minimum mean cycle in the policy graph
505
    void findPolicyCycle() {
506
      for (int i = 0; i < int(_nodes->size()); ++i) {
507
        _level[(*_nodes)[i]] = -1;
508
      }
509
      LargeCost ccost;
510
      int csize;
511
      Node u, v;
512
      _curr_found = false;
513
      for (int i = 0; i < int(_nodes->size()); ++i) {
514
        u = (*_nodes)[i];
515
        if (_level[u] >= 0) continue;
516
        for (; _level[u] < 0; u = _gr.target(_policy[u])) {
517
          _level[u] = i;
518
        }
519
        if (_level[u] == i) {
520
          // A cycle is found
521
          ccost = _cost[_policy[u]];
522
          csize = 1;
523
          for (v = u; (v = _gr.target(_policy[v])) != u; ) {
524
            ccost += _cost[_policy[v]];
525
            ++csize;
526
          }
527
          if ( !_curr_found ||
528
               (ccost * _curr_size < _curr_cost * csize) ) {
529
            _curr_found = true;
530
            _curr_cost = ccost;
531
            _curr_size = csize;
532
            _curr_node = u;
533
          }
534
        }
535
      }
536
    }
537

	
538
    // Contract the policy graph and compute node distances
539
    bool computeNodeDistances() {
540
      // Find the component of the main cycle and compute node distances
541
      // using reverse BFS
542
      for (int i = 0; i < int(_nodes->size()); ++i) {
543
        _reached[(*_nodes)[i]] = false;
544
      }
545
      _qfront = _qback = 0;
546
      _queue[0] = _curr_node;
547
      _reached[_curr_node] = true;
548
      _dist[_curr_node] = 0;
549
      Node u, v;
550
      Arc e;
551
      while (_qfront <= _qback) {
552
        v = _queue[_qfront++];
553
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
554
          e = _in_arcs[v][j];
555
          u = _gr.source(e);
556
          if (_policy[u] == e && !_reached[u]) {
557
            _reached[u] = true;
558
            _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost;
559
            _queue[++_qback] = u;
560
          }
561
        }
562
      }
563

	
564
      // Connect all other nodes to this component and compute node
565
      // distances using reverse BFS
566
      _qfront = 0;
567
      while (_qback < int(_nodes->size())-1) {
568
        v = _queue[_qfront++];
569
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
570
          e = _in_arcs[v][j];
571
          u = _gr.source(e);
572
          if (!_reached[u]) {
573
            _reached[u] = true;
574
            _policy[u] = e;
575
            _dist[u] = _dist[v] + _cost[e] * _curr_size - _curr_cost;
576
            _queue[++_qback] = u;
577
          }
578
        }
579
      }
580

	
581
      // Improve node distances
582
      bool improved = false;
583
      for (int i = 0; i < int(_nodes->size()); ++i) {
584
        v = (*_nodes)[i];
585
        for (int j = 0; j < int(_in_arcs[v].size()); ++j) {
586
          e = _in_arcs[v][j];
587
          u = _gr.source(e);
588
          LargeCost delta = _dist[v] + _cost[e] * _curr_size - _curr_cost;
589
          if (_tolerance.less(delta, _dist[u])) {
590
            _dist[u] = delta;
591
            _policy[u] = e;
592
            improved = true;
593
          }
594
        }
595
      }
596
      return improved;
597
    }
598

	
599
  }; //class HowardMmc
600

	
601
  ///@}
602

	
603
} //namespace lemon
604

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

	
19
#ifndef LEMON_KARP_MMC_H
20
#define LEMON_KARP_MMC_H
21

	
22
/// \ingroup min_mean_cycle
23
///
24
/// \file
25
/// \brief Karp's algorithm for finding a minimum mean cycle.
26

	
27
#include <vector>
28
#include <limits>
29
#include <lemon/core.h>
30
#include <lemon/path.h>
31
#include <lemon/tolerance.h>
32
#include <lemon/connectivity.h>
33

	
34
namespace lemon {
35

	
36
  /// \brief Default traits class of KarpMmc class.
37
  ///
38
  /// Default traits class of KarpMmc class.
39
  /// \tparam GR The type of the digraph.
40
  /// \tparam CM The type of the cost map.
41
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
42
#ifdef DOXYGEN
43
  template <typename GR, typename CM>
44
#else
45
  template <typename GR, typename CM,
46
    bool integer = std::numeric_limits<typename CM::Value>::is_integer>
47
#endif
48
  struct KarpMmcDefaultTraits
49
  {
50
    /// The type of the digraph
51
    typedef GR Digraph;
52
    /// The type of the cost map
53
    typedef CM CostMap;
54
    /// The type of the arc costs
55
    typedef typename CostMap::Value Cost;
56

	
57
    /// \brief The large cost type used for internal computations
58
    ///
59
    /// The large cost type used for internal computations.
60
    /// It is \c long \c long if the \c Cost type is integer,
61
    /// otherwise it is \c double.
62
    /// \c Cost must be convertible to \c LargeCost.
63
    typedef double LargeCost;
64

	
65
    /// The tolerance type used for internal computations
66
    typedef lemon::Tolerance<LargeCost> Tolerance;
67

	
68
    /// \brief The path type of the found cycles
69
    ///
70
    /// The path type of the found cycles.
71
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
72
    /// and it must have an \c addFront() function.
73
    typedef lemon::Path<Digraph> Path;
74
  };
75

	
76
  // Default traits class for integer cost types
77
  template <typename GR, typename CM>
78
  struct KarpMmcDefaultTraits<GR, CM, true>
79
  {
80
    typedef GR Digraph;
81
    typedef CM CostMap;
82
    typedef typename CostMap::Value Cost;
83
#ifdef LEMON_HAVE_LONG_LONG
84
    typedef long long LargeCost;
85
#else
86
    typedef long LargeCost;
87
#endif
88
    typedef lemon::Tolerance<LargeCost> Tolerance;
89
    typedef lemon::Path<Digraph> Path;
90
  };
91

	
92

	
93
  /// \addtogroup min_mean_cycle
94
  /// @{
95

	
96
  /// \brief Implementation of Karp's algorithm for finding a minimum
97
  /// mean cycle.
98
  ///
99
  /// This class implements Karp's algorithm for finding a directed
100
  /// cycle of minimum mean cost in a digraph
101
  /// \ref amo93networkflows, \ref dasdan98minmeancycle.
102
  /// It runs in time O(ne) and uses space O(n<sup>2</sup>+e).
103
  ///
104
  /// \tparam GR The type of the digraph the algorithm runs on.
105
  /// \tparam CM The type of the cost map. The default
106
  /// map type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
107
  /// \tparam TR The traits class that defines various types used by the
108
  /// algorithm. By default, it is \ref KarpMmcDefaultTraits
109
  /// "KarpMmcDefaultTraits<GR, CM>".
110
  /// In most cases, this parameter should not be set directly,
111
  /// consider to use the named template parameters instead.
112
#ifdef DOXYGEN
113
  template <typename GR, typename CM, typename TR>
114
#else
115
  template < typename GR,
116
             typename CM = typename GR::template ArcMap<int>,
117
             typename TR = KarpMmcDefaultTraits<GR, CM> >
118
#endif
119
  class KarpMmc
120
  {
121
  public:
122

	
123
    /// The type of the digraph
124
    typedef typename TR::Digraph Digraph;
125
    /// The type of the cost map
126
    typedef typename TR::CostMap CostMap;
127
    /// The type of the arc costs
128
    typedef typename TR::Cost Cost;
129

	
130
    /// \brief The large cost type
131
    ///
132
    /// The large cost type used for internal computations.
133
    /// By default, it is \c long \c long if the \c Cost type is integer,
134
    /// otherwise it is \c double.
135
    typedef typename TR::LargeCost LargeCost;
136

	
137
    /// The tolerance type
138
    typedef typename TR::Tolerance Tolerance;
139

	
140
    /// \brief The path type of the found cycles
141
    ///
142
    /// The path type of the found cycles.
143
    /// Using the \ref KarpMmcDefaultTraits "default traits class",
144
    /// it is \ref lemon::Path "Path<Digraph>".
145
    typedef typename TR::Path Path;
146

	
147
    /// The \ref KarpMmcDefaultTraits "traits class" of the algorithm
148
    typedef TR Traits;
149

	
150
  private:
151

	
152
    TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
153

	
154
    // Data sturcture for path data
155
    struct PathData
156
    {
157
      LargeCost dist;
158
      Arc pred;
159
      PathData(LargeCost d, Arc p = INVALID) :
160
        dist(d), pred(p) {}
161
    };
162

	
163
    typedef typename Digraph::template NodeMap<std::vector<PathData> >
164
      PathDataNodeMap;
165

	
166
  private:
167

	
168
    // The digraph the algorithm runs on
169
    const Digraph &_gr;
170
    // The cost of the arcs
171
    const CostMap &_cost;
172

	
173
    // Data for storing the strongly connected components
174
    int _comp_num;
175
    typename Digraph::template NodeMap<int> _comp;
176
    std::vector<std::vector<Node> > _comp_nodes;
177
    std::vector<Node>* _nodes;
178
    typename Digraph::template NodeMap<std::vector<Arc> > _out_arcs;
179

	
180
    // Data for the found cycle
181
    LargeCost _cycle_cost;
182
    int _cycle_size;
183
    Node _cycle_node;
184

	
185
    Path *_cycle_path;
186
    bool _local_path;
187

	
188
    // Node map for storing path data
189
    PathDataNodeMap _data;
190
    // The processed nodes in the last round
191
    std::vector<Node> _process;
192

	
193
    Tolerance _tolerance;
194

	
195
    // Infinite constant
196
    const LargeCost INF;
197

	
198
  public:
199

	
200
    /// \name Named Template Parameters
201
    /// @{
202

	
203
    template <typename T>
204
    struct SetLargeCostTraits : public Traits {
205
      typedef T LargeCost;
206
      typedef lemon::Tolerance<T> Tolerance;
207
    };
208

	
209
    /// \brief \ref named-templ-param "Named parameter" for setting
210
    /// \c LargeCost type.
211
    ///
212
    /// \ref named-templ-param "Named parameter" for setting \c LargeCost
213
    /// type. It is used for internal computations in the algorithm.
214
    template <typename T>
215
    struct SetLargeCost
216
      : public KarpMmc<GR, CM, SetLargeCostTraits<T> > {
217
      typedef KarpMmc<GR, CM, SetLargeCostTraits<T> > Create;
218
    };
219

	
220
    template <typename T>
221
    struct SetPathTraits : public Traits {
222
      typedef T Path;
223
    };
224

	
225
    /// \brief \ref named-templ-param "Named parameter" for setting
226
    /// \c %Path type.
227
    ///
228
    /// \ref named-templ-param "Named parameter" for setting the \c %Path
229
    /// type of the found cycles.
230
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
231
    /// and it must have an \c addFront() function.
232
    template <typename T>
233
    struct SetPath
234
      : public KarpMmc<GR, CM, SetPathTraits<T> > {
235
      typedef KarpMmc<GR, CM, SetPathTraits<T> > Create;
236
    };
237

	
238
    /// @}
239

	
240
  protected:
241

	
242
    KarpMmc() {}
243

	
244
  public:
245

	
246
    /// \brief Constructor.
247
    ///
248
    /// The constructor of the class.
249
    ///
250
    /// \param digraph The digraph the algorithm runs on.
251
    /// \param cost The costs of the arcs.
252
    KarpMmc( const Digraph &digraph,
253
             const CostMap &cost ) :
254
      _gr(digraph), _cost(cost), _comp(digraph), _out_arcs(digraph),
255
      _cycle_cost(0), _cycle_size(1), _cycle_node(INVALID),
256
      _cycle_path(NULL), _local_path(false), _data(digraph),
257
      INF(std::numeric_limits<LargeCost>::has_infinity ?
258
          std::numeric_limits<LargeCost>::infinity() :
259
          std::numeric_limits<LargeCost>::max())
260
    {}
261

	
262
    /// Destructor.
263
    ~KarpMmc() {
264
      if (_local_path) delete _cycle_path;
265
    }
266

	
267
    /// \brief Set the path structure for storing the found cycle.
268
    ///
269
    /// This function sets an external path structure for storing the
270
    /// found cycle.
271
    ///
272
    /// If you don't call this function before calling \ref run() or
273
    /// \ref findCycleMean(), it will allocate a local \ref Path "path"
274
    /// structure. The destuctor deallocates this automatically
275
    /// allocated object, of course.
276
    ///
277
    /// \note The algorithm calls only the \ref lemon::Path::addFront()
278
    /// "addFront()" function of the given path structure.
279
    ///
280
    /// \return <tt>(*this)</tt>
281
    KarpMmc& cycle(Path &path) {
282
      if (_local_path) {
283
        delete _cycle_path;
284
        _local_path = false;
285
      }
286
      _cycle_path = &path;
287
      return *this;
288
    }
289

	
290
    /// \brief Set the tolerance used by the algorithm.
291
    ///
292
    /// This function sets the tolerance object used by the algorithm.
293
    ///
294
    /// \return <tt>(*this)</tt>
295
    KarpMmc& tolerance(const Tolerance& tolerance) {
296
      _tolerance = tolerance;
297
      return *this;
298
    }
299

	
300
    /// \brief Return a const reference to the tolerance.
301
    ///
302
    /// This function returns a const reference to the tolerance object
303
    /// used by the algorithm.
304
    const Tolerance& tolerance() const {
305
      return _tolerance;
306
    }
307

	
308
    /// \name Execution control
309
    /// The simplest way to execute the algorithm is to call the \ref run()
310
    /// function.\n
311
    /// If you only need the minimum mean cost, you may call
312
    /// \ref findCycleMean().
313

	
314
    /// @{
315

	
316
    /// \brief Run the algorithm.
317
    ///
318
    /// This function runs the algorithm.
319
    /// It can be called more than once (e.g. if the underlying digraph
320
    /// and/or the arc costs have been modified).
321
    ///
322
    /// \return \c true if a directed cycle exists in the digraph.
323
    ///
324
    /// \note <tt>mmc.run()</tt> is just a shortcut of the following code.
325
    /// \code
326
    ///   return mmc.findCycleMean() && mmc.findCycle();
327
    /// \endcode
328
    bool run() {
329
      return findCycleMean() && findCycle();
330
    }
331

	
332
    /// \brief Find the minimum cycle mean.
333
    ///
334
    /// This function finds the minimum mean cost of the directed
335
    /// cycles in the digraph.
336
    ///
337
    /// \return \c true if a directed cycle exists in the digraph.
338
    bool findCycleMean() {
339
      // Initialization and find strongly connected components
340
      init();
341
      findComponents();
342

	
343
      // Find the minimum cycle mean in the components
344
      for (int comp = 0; comp < _comp_num; ++comp) {
345
        if (!initComponent(comp)) continue;
346
        processRounds();
347
        updateMinMean();
348
      }
349
      return (_cycle_node != INVALID);
350
    }
351

	
352
    /// \brief Find a minimum mean directed cycle.
353
    ///
354
    /// This function finds a directed cycle of minimum mean cost
355
    /// in the digraph using the data computed by findCycleMean().
356
    ///
357
    /// \return \c true if a directed cycle exists in the digraph.
358
    ///
359
    /// \pre \ref findCycleMean() must be called before using this function.
360
    bool findCycle() {
361
      if (_cycle_node == INVALID) return false;
362
      IntNodeMap reached(_gr, -1);
363
      int r = _data[_cycle_node].size();
364
      Node u = _cycle_node;
365
      while (reached[u] < 0) {
366
        reached[u] = --r;
367
        u = _gr.source(_data[u][r].pred);
368
      }
369
      r = reached[u];
370
      Arc e = _data[u][r].pred;
371
      _cycle_path->addFront(e);
372
      _cycle_cost = _cost[e];
373
      _cycle_size = 1;
374
      Node v;
375
      while ((v = _gr.source(e)) != u) {
376
        e = _data[v][--r].pred;
377
        _cycle_path->addFront(e);
378
        _cycle_cost += _cost[e];
379
        ++_cycle_size;
380
      }
381
      return true;
382
    }
383

	
384
    /// @}
385

	
386
    /// \name Query Functions
387
    /// The results of the algorithm can be obtained using these
388
    /// functions.\n
389
    /// The algorithm should be executed before using them.
390

	
391
    /// @{
392

	
393
    /// \brief Return the total cost of the found cycle.
394
    ///
395
    /// This function returns the total cost of the found cycle.
396
    ///
397
    /// \pre \ref run() or \ref findCycleMean() must be called before
398
    /// using this function.
399
    Cost cycleCost() const {
400
      return static_cast<Cost>(_cycle_cost);
401
    }
402

	
403
    /// \brief Return the number of arcs on the found cycle.
404
    ///
405
    /// This function returns the number of arcs on the found cycle.
406
    ///
407
    /// \pre \ref run() or \ref findCycleMean() must be called before
408
    /// using this function.
409
    int cycleSize() const {
410
      return _cycle_size;
411
    }
412

	
413
    /// \brief Return the mean cost of the found cycle.
414
    ///
415
    /// This function returns the mean cost of the found cycle.
416
    ///
417
    /// \note <tt>alg.cycleMean()</tt> is just a shortcut of the
418
    /// following code.
419
    /// \code
420
    ///   return static_cast<double>(alg.cycleCost()) / alg.cycleSize();
421
    /// \endcode
422
    ///
423
    /// \pre \ref run() or \ref findCycleMean() must be called before
424
    /// using this function.
425
    double cycleMean() const {
426
      return static_cast<double>(_cycle_cost) / _cycle_size;
427
    }
428

	
429
    /// \brief Return the found cycle.
430
    ///
431
    /// This function returns a const reference to the path structure
432
    /// storing the found cycle.
433
    ///
434
    /// \pre \ref run() or \ref findCycle() must be called before using
435
    /// this function.
436
    const Path& cycle() const {
437
      return *_cycle_path;
438
    }
439

	
440
    ///@}
441

	
442
  private:
443

	
444
    // Initialization
445
    void init() {
446
      if (!_cycle_path) {
447
        _local_path = true;
448
        _cycle_path = new Path;
449
      }
450
      _cycle_path->clear();
451
      _cycle_cost = 0;
452
      _cycle_size = 1;
453
      _cycle_node = INVALID;
454
      for (NodeIt u(_gr); u != INVALID; ++u)
455
        _data[u].clear();
456
    }
457

	
458
    // Find strongly connected components and initialize _comp_nodes
459
    // and _out_arcs
460
    void findComponents() {
461
      _comp_num = stronglyConnectedComponents(_gr, _comp);
462
      _comp_nodes.resize(_comp_num);
463
      if (_comp_num == 1) {
464
        _comp_nodes[0].clear();
465
        for (NodeIt n(_gr); n != INVALID; ++n) {
466
          _comp_nodes[0].push_back(n);
467
          _out_arcs[n].clear();
468
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
469
            _out_arcs[n].push_back(a);
470
          }
471
        }
472
      } else {
473
        for (int i = 0; i < _comp_num; ++i)
474
          _comp_nodes[i].clear();
475
        for (NodeIt n(_gr); n != INVALID; ++n) {
476
          int k = _comp[n];
477
          _comp_nodes[k].push_back(n);
478
          _out_arcs[n].clear();
479
          for (OutArcIt a(_gr, n); a != INVALID; ++a) {
480
            if (_comp[_gr.target(a)] == k) _out_arcs[n].push_back(a);
481
          }
482
        }
483
      }
484
    }
485

	
486
    // Initialize path data for the current component
487
    bool initComponent(int comp) {
488
      _nodes = &(_comp_nodes[comp]);
489
      int n = _nodes->size();
490
      if (n < 1 || (n == 1 && _out_arcs[(*_nodes)[0]].size() == 0)) {
491
        return false;
492
      }
493
      for (int i = 0; i < n; ++i) {
494
        _data[(*_nodes)[i]].resize(n + 1, PathData(INF));
495
      }
496
      return true;
497
    }
498

	
499
    // Process all rounds of computing path data for the current component.
500
    // _data[v][k] is the cost of a shortest directed walk from the root
501
    // node to node v containing exactly k arcs.
502
    void processRounds() {
503
      Node start = (*_nodes)[0];
504
      _data[start][0] = PathData(0);
505
      _process.clear();
506
      _process.push_back(start);
507

	
508
      int k, n = _nodes->size();
509
      for (k = 1; k <= n && int(_process.size()) < n; ++k) {
510
        processNextBuildRound(k);
511
      }
512
      for ( ; k <= n; ++k) {
513
        processNextFullRound(k);
514
      }
515
    }
516

	
517
    // Process one round and rebuild _process
518
    void processNextBuildRound(int k) {
519
      std::vector<Node> next;
520
      Node u, v;
521
      Arc e;
522
      LargeCost d;
523
      for (int i = 0; i < int(_process.size()); ++i) {
524
        u = _process[i];
525
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
526
          e = _out_arcs[u][j];
527
          v = _gr.target(e);
528
          d = _data[u][k-1].dist + _cost[e];
529
          if (_tolerance.less(d, _data[v][k].dist)) {
530
            if (_data[v][k].dist == INF) next.push_back(v);
531
            _data[v][k] = PathData(d, e);
532
          }
533
        }
534
      }
535
      _process.swap(next);
536
    }
537

	
538
    // Process one round using _nodes instead of _process
539
    void processNextFullRound(int k) {
540
      Node u, v;
541
      Arc e;
542
      LargeCost d;
543
      for (int i = 0; i < int(_nodes->size()); ++i) {
544
        u = (*_nodes)[i];
545
        for (int j = 0; j < int(_out_arcs[u].size()); ++j) {
546
          e = _out_arcs[u][j];
547
          v = _gr.target(e);
548
          d = _data[u][k-1].dist + _cost[e];
549
          if (_tolerance.less(d, _data[v][k].dist)) {
550
            _data[v][k] = PathData(d, e);
551
          }
552
        }
553
      }
554
    }
555

	
556
    // Update the minimum cycle mean
557
    void updateMinMean() {
558
      int n = _nodes->size();
559
      for (int i = 0; i < n; ++i) {
560
        Node u = (*_nodes)[i];
561
        if (_data[u][n].dist == INF) continue;
562
        LargeCost cost, max_cost = 0;
563
        int size, max_size = 1;
564
        bool found_curr = false;
565
        for (int k = 0; k < n; ++k) {
566
          if (_data[u][k].dist == INF) continue;
567
          cost = _data[u][n].dist - _data[u][k].dist;
568
          size = n - k;
569
          if (!found_curr || cost * max_size > max_cost * size) {
570
            found_curr = true;
571
            max_cost = cost;
572
            max_size = size;
573
          }
574
        }
575
        if ( found_curr && (_cycle_node == INVALID ||
576
             max_cost * _cycle_size < _cycle_cost * max_size) ) {
577
          _cycle_cost = max_cost;
578
          _cycle_size = max_size;
579
          _cycle_node = u;
580
        }
581
      }
582
    }
583

	
584
  }; //class KarpMmc
585

	
586
  ///@}
587

	
588
} //namespace lemon
589

	
590
#endif //LEMON_KARP_MMC_H
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
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_PAIRING_HEAP_H
20
#define LEMON_PAIRING_HEAP_H
21

	
22
///\file
23
///\ingroup heaps
24
///\brief Pairing heap implementation.
25

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

	
31
namespace lemon {
32

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

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

	
80
  private:
81
    class store;
82

	
83
    std::vector<store> _data;
84
    int _min;
85
    ItemIntMap &_iim;
86
    Compare _comp;
87
    int _num_items;
88

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

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

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

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

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

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

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

	
171
      _data[i].prio=value;
172

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

	
182
      ++_num_items;
183
    }
184

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

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

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

	
206
    /// \brief Remove the item having minimum priority.
207
    ///
208
    /// This function removes the item having minimum priority.
209
    /// \pre The heap must be non-empty.
210
    void pop() {
211
      std::vector<int> trees;
212
      int i=0, child_right = 0;
213
      _data[_min].in=false;
214

	
215
      if( -1!=_data[_min].child ) {
216
        i=_data[_min].child;
217
        trees.push_back(i);
218
        _data[i].parent = -1;
219
        _data[_min].child = -1;
220

	
221
        int ch=-1;
222
        while( _data[i].child!=-1 ) {
223
          ch=_data[i].child;
224
          if( _data[ch].left_child && i==_data[ch].parent ) {
225
            break;
226
          } else {
227
            if( _data[ch].left_child ) {
228
              child_right=_data[ch].parent;
229
              _data[ch].parent = i;
230
              --_data[i].degree;
231
            }
232
            else {
233
              child_right=ch;
234
              _data[i].child=-1;
235
              _data[i].degree=0;
236
            }
237
            _data[child_right].parent = -1;
238
            trees.push_back(child_right);
239
            i = child_right;
240
          }
241
        }
242

	
243
        int num_child = trees.size();
244
        int other;
245
        for( i=0; i<num_child-1; i+=2 ) {
246
          if ( !_comp(_data[trees[i]].prio, _data[trees[i+1]].prio) ) {
247
            other=trees[i];
248
            trees[i]=trees[i+1];
249
            trees[i+1]=other;
250
          }
251
          fuse( trees[i], trees[i+1] );
252
        }
253

	
254
        i = (0==(num_child % 2)) ? num_child-2 : num_child-1;
255
        while(i>=2) {
256
          if ( _comp(_data[trees[i]].prio, _data[trees[i-2]].prio) ) {
257
            other=trees[i];
258
            trees[i]=trees[i-2];
259
            trees[i-2]=other;
260
          }
261
          fuse( trees[i-2], trees[i] );
262
          i-=2;
263
        }
264
        _min = trees[0];
265
      }
266
      else {
267
        _min = _data[_min].child;
268
      }
269

	
270
      if (_min >= 0) _data[_min].left_child = false;
271
      --_num_items;
272
    }
273

	
274
    /// \brief Remove the given item from the heap.
275
    ///
276
    /// This function removes the given item from the heap if it is
277
    /// already stored.
278
    /// \param item The item to delete.
279
    /// \pre \e item must be in the heap.
280
    void erase (const Item& item) {
281
      int i=_iim[item];
282
      if ( i>=0 && _data[i].in ) {
283
        decrease( item, _data[_min].prio-1 );
284
        pop();
285
      }
286
    }
287

	
288
    /// \brief Decrease the priority of an item to the given value.
289
    ///
290
    /// This function decreases the priority of an item to the given value.
291
    /// \param item The item.
292
    /// \param value The priority.
293
    /// \pre \e item must be stored in the heap with priority at least \e value.
294
    void decrease (Item item, const Prio& value) {
295
      int i=_iim[item];
296
      _data[i].prio=value;
297
      int p=_data[i].parent;
298

	
299
      if( _data[i].left_child && i!=_data[p].child ) {
300
        p=_data[p].parent;
301
      }
302

	
303
      if ( p!=-1 && _comp(value,_data[p].prio) ) {
304
        cut(i,p);
305
        if ( _comp(_data[_min].prio,value) ) {
306
          fuse(_min,i);
307
        } else {
308
          fuse(i,_min);
309
          _min=i;
310
        }
311
      }
312
    }
313

	
314
    /// \brief Increase the priority of an item to the given value.
315
    ///
316
    /// This function increases the priority of an item to the given value.
317
    /// \param item The item.
318
    /// \param value The priority.
319
    /// \pre \e item must be stored in the heap with priority at most \e value.
320
    void increase (Item item, const Prio& value) {
321
      erase(item);
322
      push(item,value);
323
    }
324

	
325
    /// \brief Return the state of an item.
326
    ///
327
    /// This method returns \c PRE_HEAP if the given item has never
328
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
329
    /// and \c POST_HEAP otherwise.
330
    /// In the latter case it is possible that the item will get back
331
    /// to the heap again.
332
    /// \param item The item.
333
    State state(const Item &item) const {
334
      int i=_iim[item];
335
      if( i>=0 ) {
336
        if( _data[i].in ) i=0;
337
        else i=-2;
338
      }
339
      return State(i);
340
    }
341

	
342
    /// \brief Set the state of an item in the heap.
343
    ///
344
    /// This function sets the state of the given item in the heap.
345
    /// It can be used to manually clear the heap when it is important
346
    /// to achive better time complexity.
347
    /// \param i The item.
348
    /// \param st The state. It should not be \c IN_HEAP.
349
    void state(const Item& i, State st) {
350
      switch (st) {
351
      case POST_HEAP:
352
      case PRE_HEAP:
353
        if (state(i) == IN_HEAP) erase(i);
354
        _iim[i]=st;
355
        break;
356
      case IN_HEAP:
357
        break;
358
      }
359
    }
360

	
361
  private:
362

	
363
    void cut(int a, int b) {
364
      int child_a;
365
      switch (_data[a].degree) {
366
        case 2:
367
          child_a = _data[_data[a].child].parent;
368
          if( _data[a].left_child ) {
369
            _data[child_a].left_child=true;
370
            _data[b].child=child_a;
371
            _data[child_a].parent=_data[a].parent;
372
          }
373
          else {
374
            _data[child_a].left_child=false;
375
            _data[child_a].parent=b;
376
            if( a!=_data[b].child )
377
              _data[_data[b].child].parent=child_a;
378
            else
379
              _data[b].child=child_a;
380
          }
381
          --_data[a].degree;
382
          _data[_data[a].child].parent=a;
383
          break;
384

	
385
        case 1:
386
          child_a = _data[a].child;
387
          if( !_data[child_a].left_child ) {
388
            --_data[a].degree;
389
            if( _data[a].left_child ) {
390
              _data[child_a].left_child=true;
391
              _data[child_a].parent=_data[a].parent;
392
              _data[b].child=child_a;
393
            }
394
            else {
395
              _data[child_a].left_child=false;
396
              _data[child_a].parent=b;
397
              if( a!=_data[b].child )
398
                _data[_data[b].child].parent=child_a;
399
              else
400
                _data[b].child=child_a;
401
            }
402
            _data[a].child=-1;
403
          }
404
          else {
405
            --_data[b].degree;
406
            if( _data[a].left_child ) {
407
              _data[b].child =
408
                (1==_data[b].degree) ? _data[a].parent : -1;
409
            } else {
410
              if (1==_data[b].degree)
411
                _data[_data[b].child].parent=b;
412
              else
413
                _data[b].child=-1;
414
            }
415
          }
416
          break;
417

	
418
        case 0:
419
          --_data[b].degree;
420
          if( _data[a].left_child ) {
421
            _data[b].child =
422
              (0!=_data[b].degree) ? _data[a].parent : -1;
423
          } else {
424
            if( 0!=_data[b].degree )
425
              _data[_data[b].child].parent=b;
426
            else
427
              _data[b].child=-1;
428
          }
429
          break;
430
      }
431
      _data[a].parent=-1;
432
      _data[a].left_child=false;
433
    }
434

	
435
    void fuse(int a, int b) {
436
      int child_a = _data[a].child;
437
      int child_b = _data[b].child;
438
      _data[a].child=b;
439
      _data[b].parent=a;
440
      _data[b].left_child=true;
441

	
442
      if( -1!=child_a ) {
443
        _data[b].child=child_a;
444
        _data[child_a].parent=b;
445
        _data[child_a].left_child=false;
446
        ++_data[b].degree;
447

	
448
        if( -1!=child_b ) {
449
           _data[b].child=child_b;
450
           _data[child_b].parent=child_a;
451
        }
452
      }
453
      else { ++_data[a].degree; }
454
    }
455

	
456
    class store {
457
      friend class PairingHeap;
458

	
459
      Item name;
460
      int parent;
461
      int child;
462
      bool left_child;
463
      int degree;
464
      bool in;
465
      Prio prio;
466

	
467
      store() : parent(-1), child(-1), left_child(false), degree(0), in(true) {}
468
    };
469
  };
470

	
471
} //namespace lemon
472

	
473
#endif //LEMON_PAIRING_HEAP_H
474

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

	
19
#ifndef LEMON_PLANARITY_H
20
#define LEMON_PLANARITY_H
21

	
22
/// \ingroup planar
23
/// \file
24
/// \brief Planarity checking, embedding, drawing and coloring
25

	
26
#include <vector>
27
#include <list>
28

	
29
#include <lemon/dfs.h>
30
#include <lemon/bfs.h>
31
#include <lemon/radix_sort.h>
32
#include <lemon/maps.h>
33
#include <lemon/path.h>
34
#include <lemon/bucket_heap.h>
35
#include <lemon/adaptors.h>
36
#include <lemon/edge_set.h>
37
#include <lemon/color.h>
38
#include <lemon/dim2.h>
39

	
40
namespace lemon {
41

	
42
  namespace _planarity_bits {
43

	
44
    template <typename Graph>
45
    struct PlanarityVisitor : DfsVisitor<Graph> {
46

	
47
      TEMPLATE_GRAPH_TYPEDEFS(Graph);
48

	
49
      typedef typename Graph::template NodeMap<Arc> PredMap;
50

	
51
      typedef typename Graph::template EdgeMap<bool> TreeMap;
52

	
53
      typedef typename Graph::template NodeMap<int> OrderMap;
54
      typedef std::vector<Node> OrderList;
55

	
56
      typedef typename Graph::template NodeMap<int> LowMap;
57
      typedef typename Graph::template NodeMap<int> AncestorMap;
58

	
59
      PlanarityVisitor(const Graph& graph,
60
                       PredMap& pred_map, TreeMap& tree_map,
61
                       OrderMap& order_map, OrderList& order_list,
62
                       AncestorMap& ancestor_map, LowMap& low_map)
63
        : _graph(graph), _pred_map(pred_map), _tree_map(tree_map),
64
          _order_map(order_map), _order_list(order_list),
65
          _ancestor_map(ancestor_map), _low_map(low_map) {}
66

	
67
      void reach(const Node& node) {
68
        _order_map[node] = _order_list.size();
69
        _low_map[node] = _order_list.size();
70
        _ancestor_map[node] = _order_list.size();
71
        _order_list.push_back(node);
72
      }
73

	
74
      void discover(const Arc& arc) {
75
        Node source = _graph.source(arc);
76
        Node target = _graph.target(arc);
77

	
78
        _tree_map[arc] = true;
79
        _pred_map[target] = arc;
80
      }
81

	
82
      void examine(const Arc& arc) {
83
        Node source = _graph.source(arc);
84
        Node target = _graph.target(arc);
85

	
86
        if (_order_map[target] < _order_map[source] && !_tree_map[arc]) {
87
          if (_low_map[source] > _order_map[target]) {
88
            _low_map[source] = _order_map[target];
89
          }
90
          if (_ancestor_map[source] > _order_map[target]) {
91
            _ancestor_map[source] = _order_map[target];
92
          }
93
        }
94
      }
95

	
96
      void backtrack(const Arc& arc) {
97
        Node source = _graph.source(arc);
98
        Node target = _graph.target(arc);
99

	
100
        if (_low_map[source] > _low_map[target]) {
101
          _low_map[source] = _low_map[target];
102
        }
103
      }
104

	
105
      const Graph& _graph;
106
      PredMap& _pred_map;
107
      TreeMap& _tree_map;
108
      OrderMap& _order_map;
109
      OrderList& _order_list;
110
      AncestorMap& _ancestor_map;
111
      LowMap& _low_map;
112
    };
113

	
114
    template <typename Graph, bool embedding = true>
115
    struct NodeDataNode {
116
      int prev, next;
117
      int visited;
118
      typename Graph::Arc first;
119
      bool inverted;
120
    };
121

	
122
    template <typename Graph>
123
    struct NodeDataNode<Graph, false> {
124
      int prev, next;
125
      int visited;
126
    };
127

	
128
    template <typename Graph>
129
    struct ChildListNode {
130
      typedef typename Graph::Node Node;
131
      Node first;
132
      Node prev, next;
133
    };
134

	
135
    template <typename Graph>
136
    struct ArcListNode {
137
      typename Graph::Arc prev, next;
138
    };
139

	
140
    template <typename Graph>
141
    class PlanarityChecking {
142
    private:
143

	
144
      TEMPLATE_GRAPH_TYPEDEFS(Graph);
145

	
146
      const Graph& _graph;
147

	
148
    private:
149

	
150
      typedef typename Graph::template NodeMap<Arc> PredMap;
151

	
152
      typedef typename Graph::template EdgeMap<bool> TreeMap;
153

	
154
      typedef typename Graph::template NodeMap<int> OrderMap;
155
      typedef std::vector<Node> OrderList;
156

	
157
      typedef typename Graph::template NodeMap<int> LowMap;
158
      typedef typename Graph::template NodeMap<int> AncestorMap;
159

	
160
      typedef _planarity_bits::NodeDataNode<Graph> NodeDataNode;
161
      typedef std::vector<NodeDataNode> NodeData;
162

	
163
      typedef _planarity_bits::ChildListNode<Graph> ChildListNode;
164
      typedef typename Graph::template NodeMap<ChildListNode> ChildLists;
165

	
166
      typedef typename Graph::template NodeMap<std::list<int> > MergeRoots;
167

	
168
      typedef typename Graph::template NodeMap<bool> EmbedArc;
169

	
170
    public:
171

	
172
      PlanarityChecking(const Graph& graph) : _graph(graph) {}
173

	
174
      bool run() {
175
        typedef _planarity_bits::PlanarityVisitor<Graph> Visitor;
176

	
177
        PredMap pred_map(_graph, INVALID);
178
        TreeMap tree_map(_graph, false);
179

	
180
        OrderMap order_map(_graph, -1);
181
        OrderList order_list;
182

	
183
        AncestorMap ancestor_map(_graph, -1);
184
        LowMap low_map(_graph, -1);
185

	
186
        Visitor visitor(_graph, pred_map, tree_map,
187
                        order_map, order_list, ancestor_map, low_map);
188
        DfsVisit<Graph, Visitor> visit(_graph, visitor);
189
        visit.run();
190

	
191
        ChildLists child_lists(_graph);
192
        createChildLists(tree_map, order_map, low_map, child_lists);
193

	
194
        NodeData node_data(2 * order_list.size());
195

	
196
        EmbedArc embed_arc(_graph, false);
197

	
198
        MergeRoots merge_roots(_graph);
199

	
200
        for (int i = order_list.size() - 1; i >= 0; --i) {
201

	
202
          Node node = order_list[i];
203

	
204
          Node source = node;
205
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
206
            Node target = _graph.target(e);
207

	
208
            if (order_map[source] < order_map[target] && tree_map[e]) {
209
              initFace(target, node_data, order_map, order_list);
210
            }
211
          }
212

	
213
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
214
            Node target = _graph.target(e);
215

	
216
            if (order_map[source] < order_map[target] && !tree_map[e]) {
217
              embed_arc[target] = true;
218
              walkUp(target, source, i, pred_map, low_map,
219
                     order_map, order_list, node_data, merge_roots);
220
            }
221
          }
222

	
223
          for (typename MergeRoots::Value::iterator it =
224
                 merge_roots[node].begin();
225
               it != merge_roots[node].end(); ++it) {
226
            int rn = *it;
227
            walkDown(rn, i, node_data, order_list, child_lists,
228
                     ancestor_map, low_map, embed_arc, merge_roots);
229
          }
230
          merge_roots[node].clear();
231

	
232
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
233
            Node target = _graph.target(e);
234

	
235
            if (order_map[source] < order_map[target] && !tree_map[e]) {
236
              if (embed_arc[target]) {
237
                return false;
238
              }
239
            }
240
          }
241
        }
242

	
243
        return true;
244
      }
245

	
246
    private:
247

	
248
      void createChildLists(const TreeMap& tree_map, const OrderMap& order_map,
249
                            const LowMap& low_map, ChildLists& child_lists) {
250

	
251
        for (NodeIt n(_graph); n != INVALID; ++n) {
252
          Node source = n;
253

	
254
          std::vector<Node> targets;
255
          for (OutArcIt e(_graph, n); e != INVALID; ++e) {
256
            Node target = _graph.target(e);
257

	
258
            if (order_map[source] < order_map[target] && tree_map[e]) {
259
              targets.push_back(target);
260
            }
261
          }
262

	
263
          if (targets.size() == 0) {
264
            child_lists[source].first = INVALID;
265
          } else if (targets.size() == 1) {
266
            child_lists[source].first = targets[0];
267
            child_lists[targets[0]].prev = INVALID;
268
            child_lists[targets[0]].next = INVALID;
269
          } else {
270
            radixSort(targets.begin(), targets.end(), mapToFunctor(low_map));
271
            for (int i = 1; i < int(targets.size()); ++i) {
272
              child_lists[targets[i]].prev = targets[i - 1];
273
              child_lists[targets[i - 1]].next = targets[i];
274
            }
275
            child_lists[targets.back()].next = INVALID;
276
            child_lists[targets.front()].prev = INVALID;
277
            child_lists[source].first = targets.front();
278
          }
279
        }
280
      }
281

	
282
      void walkUp(const Node& node, Node root, int rorder,
283
                  const PredMap& pred_map, const LowMap& low_map,
284
                  const OrderMap& order_map, const OrderList& order_list,
285
                  NodeData& node_data, MergeRoots& merge_roots) {
286

	
287
        int na, nb;
288
        bool da, db;
289

	
290
        na = nb = order_map[node];
291
        da = true; db = false;
292

	
293
        while (true) {
294

	
295
          if (node_data[na].visited == rorder) break;
296
          if (node_data[nb].visited == rorder) break;
297

	
298
          node_data[na].visited = rorder;
299
          node_data[nb].visited = rorder;
300

	
301
          int rn = -1;
302

	
303
          if (na >= int(order_list.size())) {
304
            rn = na;
305
          } else if (nb >= int(order_list.size())) {
306
            rn = nb;
307
          }
308

	
309
          if (rn == -1) {
310
            int nn;
311

	
312
            nn = da ? node_data[na].prev : node_data[na].next;
313
            da = node_data[nn].prev != na;
314
            na = nn;
315

	
316
            nn = db ? node_data[nb].prev : node_data[nb].next;
317
            db = node_data[nn].prev != nb;
318
            nb = nn;
319

	
320
          } else {
321

	
322
            Node rep = order_list[rn - order_list.size()];
323
            Node parent = _graph.source(pred_map[rep]);
324

	
325
            if (low_map[rep] < rorder) {
326
              merge_roots[parent].push_back(rn);
327
            } else {
328
              merge_roots[parent].push_front(rn);
329
            }
330

	
331
            if (parent != root) {
332
              na = nb = order_map[parent];
333
              da = true; db = false;
334
            } else {
335
              break;
336
            }
337
          }
338
        }
339
      }
340

	
341
      void walkDown(int rn, int rorder, NodeData& node_data,
342
                    OrderList& order_list, ChildLists& child_lists,
343
                    AncestorMap& ancestor_map, LowMap& low_map,
344
                    EmbedArc& embed_arc, MergeRoots& merge_roots) {
345

	
346
        std::vector<std::pair<int, bool> > merge_stack;
347

	
348
        for (int di = 0; di < 2; ++di) {
349
          bool rd = di == 0;
350
          int pn = rn;
351
          int n = rd ? node_data[rn].next : node_data[rn].prev;
352

	
353
          while (n != rn) {
354

	
355
            Node node = order_list[n];
356

	
357
            if (embed_arc[node]) {
358

	
359
              // Merging components on the critical path
360
              while (!merge_stack.empty()) {
361

	
362
                // Component root
363
                int cn = merge_stack.back().first;
364
                bool cd = merge_stack.back().second;
365
                merge_stack.pop_back();
366

	
367
                // Parent of component
368
                int dn = merge_stack.back().first;
369
                bool dd = merge_stack.back().second;
370
                merge_stack.pop_back();
371

	
372
                Node parent = order_list[dn];
373

	
374
                // Erasing from merge_roots
375
                merge_roots[parent].pop_front();
376

	
377
                Node child = order_list[cn - order_list.size()];
378

	
379
                // Erasing from child_lists
380
                if (child_lists[child].prev != INVALID) {
381
                  child_lists[child_lists[child].prev].next =
382
                    child_lists[child].next;
383
                } else {
384
                  child_lists[parent].first = child_lists[child].next;
385
                }
386

	
387
                if (child_lists[child].next != INVALID) {
388
                  child_lists[child_lists[child].next].prev =
389
                    child_lists[child].prev;
390
                }
391

	
392
                // Merging external faces
393
                {
394
                  int en = cn;
395
                  cn = cd ? node_data[cn].prev : node_data[cn].next;
396
                  cd = node_data[cn].next == en;
397

	
398
                }
399

	
400
                if (cd) node_data[cn].next = dn; else node_data[cn].prev = dn;
401
                if (dd) node_data[dn].prev = cn; else node_data[dn].next = cn;
402

	
403
              }
404

	
405
              bool d = pn == node_data[n].prev;
406

	
407
              if (node_data[n].prev == node_data[n].next &&
408
                  node_data[n].inverted) {
409
                d = !d;
410
              }
411

	
412
              // Embedding arc into external face
413
              if (rd) node_data[rn].next = n; else node_data[rn].prev = n;
414
              if (d) node_data[n].prev = rn; else node_data[n].next = rn;
415
              pn = rn;
416

	
417
              embed_arc[order_list[n]] = false;
418
            }
419

	
420
            if (!merge_roots[node].empty()) {
421

	
422
              bool d = pn == node_data[n].prev;
423

	
424
              merge_stack.push_back(std::make_pair(n, d));
425

	
426
              int rn = merge_roots[node].front();
427

	
428
              int xn = node_data[rn].next;
429
              Node xnode = order_list[xn];
430

	
431
              int yn = node_data[rn].prev;
432
              Node ynode = order_list[yn];
433

	
434
              bool rd;
435
              if (!external(xnode, rorder, child_lists,
436
                            ancestor_map, low_map)) {
437
                rd = true;
438
              } else if (!external(ynode, rorder, child_lists,
439
                                   ancestor_map, low_map)) {
440
                rd = false;
441
              } else if (pertinent(xnode, embed_arc, merge_roots)) {
442
                rd = true;
443
              } else {
444
                rd = false;
445
              }
446

	
447
              merge_stack.push_back(std::make_pair(rn, rd));
448

	
449
              pn = rn;
450
              n = rd ? xn : yn;
451

	
452
            } else if (!external(node, rorder, child_lists,
453
                                 ancestor_map, low_map)) {
454
              int nn = (node_data[n].next != pn ?
455
                        node_data[n].next : node_data[n].prev);
456

	
457
              bool nd = n == node_data[nn].prev;
458

	
459
              if (nd) node_data[nn].prev = pn;
460
              else node_data[nn].next = pn;
461

	
462
              if (n == node_data[pn].prev) node_data[pn].prev = nn;
463
              else node_data[pn].next = nn;
464

	
465
              node_data[nn].inverted =
466
                (node_data[nn].prev == node_data[nn].next && nd != rd);
467

	
468
              n = nn;
469
            }
470
            else break;
471

	
472
          }
473

	
474
          if (!merge_stack.empty() || n == rn) {
475
            break;
476
          }
477
        }
478
      }
479

	
480
      void initFace(const Node& node, NodeData& node_data,
481
                    const OrderMap& order_map, const OrderList& order_list) {
482
        int n = order_map[node];
483
        int rn = n + order_list.size();
484

	
485
        node_data[n].next = node_data[n].prev = rn;
486
        node_data[rn].next = node_data[rn].prev = n;
487

	
488
        node_data[n].visited = order_list.size();
489
        node_data[rn].visited = order_list.size();
490

	
491
      }
492

	
493
      bool external(const Node& node, int rorder,
494
                    ChildLists& child_lists, AncestorMap& ancestor_map,
495
                    LowMap& low_map) {
496
        Node child = child_lists[node].first;
497

	
498
        if (child != INVALID) {
499
          if (low_map[child] < rorder) return true;
500
        }
501

	
502
        if (ancestor_map[node] < rorder) return true;
503

	
504
        return false;
505
      }
506

	
507
      bool pertinent(const Node& node, const EmbedArc& embed_arc,
508
                     const MergeRoots& merge_roots) {
509
        return !merge_roots[node].empty() || embed_arc[node];
510
      }
511

	
512
    };
513

	
514
  }
515

	
516
  /// \ingroup planar
517
  ///
518
  /// \brief Planarity checking of an undirected simple graph
519
  ///
520
  /// This function implements the Boyer-Myrvold algorithm for
521
  /// planarity checking of an undirected simple graph. It is a simplified
522
  /// version of the PlanarEmbedding algorithm class because neither
523
  /// the embedding nor the Kuratowski subdivisons are computed.
524
  template <typename GR>
525
  bool checkPlanarity(const GR& graph) {
526
    _planarity_bits::PlanarityChecking<GR> pc(graph);
527
    return pc.run();
528
  }
529

	
530
  /// \ingroup planar
531
  ///
532
  /// \brief Planar embedding of an undirected simple graph
533
  ///
534
  /// This class implements the Boyer-Myrvold algorithm for planar
535
  /// embedding of an undirected simple graph. The planar embedding is an
536
  /// ordering of the outgoing edges of the nodes, which is a possible
537
  /// configuration to draw the graph in the plane. If there is not
538
  /// such ordering then the graph contains a K<sub>5</sub> (full graph
539
  /// with 5 nodes) or a K<sub>3,3</sub> (complete bipartite graph on
540
  /// 3 Red and 3 Blue nodes) subdivision.
541
  ///
542
  /// The current implementation calculates either an embedding or a
543
  /// Kuratowski subdivision. The running time of the algorithm is O(n).
544
  ///
545
  /// \see PlanarDrawing, checkPlanarity()
546
  template <typename Graph>
547
  class PlanarEmbedding {
548
  private:
549

	
550
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
551

	
552
    const Graph& _graph;
553
    typename Graph::template ArcMap<Arc> _embedding;
554

	
555
    typename Graph::template EdgeMap<bool> _kuratowski;
556

	
557
  private:
558

	
559
    typedef typename Graph::template NodeMap<Arc> PredMap;
560

	
561
    typedef typename Graph::template EdgeMap<bool> TreeMap;
562

	
563
    typedef typename Graph::template NodeMap<int> OrderMap;
564
    typedef std::vector<Node> OrderList;
565

	
566
    typedef typename Graph::template NodeMap<int> LowMap;
567
    typedef typename Graph::template NodeMap<int> AncestorMap;
568

	
569
    typedef _planarity_bits::NodeDataNode<Graph> NodeDataNode;
570
    typedef std::vector<NodeDataNode> NodeData;
571

	
572
    typedef _planarity_bits::ChildListNode<Graph> ChildListNode;
573
    typedef typename Graph::template NodeMap<ChildListNode> ChildLists;
574

	
575
    typedef typename Graph::template NodeMap<std::list<int> > MergeRoots;
576

	
577
    typedef typename Graph::template NodeMap<Arc> EmbedArc;
578

	
579
    typedef _planarity_bits::ArcListNode<Graph> ArcListNode;
580
    typedef typename Graph::template ArcMap<ArcListNode> ArcLists;
581

	
582
    typedef typename Graph::template NodeMap<bool> FlipMap;
583

	
584
    typedef typename Graph::template NodeMap<int> TypeMap;
585

	
586
    enum IsolatorNodeType {
587
      HIGHX = 6, LOWX = 7,
588
      HIGHY = 8, LOWY = 9,
589
      ROOT = 10, PERTINENT = 11,
590
      INTERNAL = 12
591
    };
592

	
593
  public:
594

	
595
    /// \brief The map type for storing the embedding
596
    ///
597
    /// The map type for storing the embedding.
598
    /// \see embeddingMap()
599
    typedef typename Graph::template ArcMap<Arc> EmbeddingMap;
600

	
601
    /// \brief Constructor
602
    ///
603
    /// Constructor.
604
    /// \pre The graph must be simple, i.e. it should not
605
    /// contain parallel or loop arcs.
606
    PlanarEmbedding(const Graph& graph)
607
      : _graph(graph), _embedding(_graph), _kuratowski(graph, false) {}
608

	
609
    /// \brief Run the algorithm.
610
    ///
611
    /// This function runs the algorithm.
612
    /// \param kuratowski If this parameter is set to \c false, then the
613
    /// algorithm does not compute a Kuratowski subdivision.
614
    /// \return \c true if the graph is planar.
615
    bool run(bool kuratowski = true) {
616
      typedef _planarity_bits::PlanarityVisitor<Graph> Visitor;
617

	
618
      PredMap pred_map(_graph, INVALID);
619
      TreeMap tree_map(_graph, false);
620

	
621
      OrderMap order_map(_graph, -1);
622
      OrderList order_list;
623

	
624
      AncestorMap ancestor_map(_graph, -1);
625
      LowMap low_map(_graph, -1);
626

	
627
      Visitor visitor(_graph, pred_map, tree_map,
628
                      order_map, order_list, ancestor_map, low_map);
629
      DfsVisit<Graph, Visitor> visit(_graph, visitor);
630
      visit.run();
631

	
632
      ChildLists child_lists(_graph);
633
      createChildLists(tree_map, order_map, low_map, child_lists);
634

	
635
      NodeData node_data(2 * order_list.size());
636

	
637
      EmbedArc embed_arc(_graph, INVALID);
638

	
639
      MergeRoots merge_roots(_graph);
640

	
641
      ArcLists arc_lists(_graph);
642

	
643
      FlipMap flip_map(_graph, false);
644

	
645
      for (int i = order_list.size() - 1; i >= 0; --i) {
646

	
647
        Node node = order_list[i];
648

	
649
        node_data[i].first = INVALID;
650

	
651
        Node source = node;
652
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
653
          Node target = _graph.target(e);
654

	
655
          if (order_map[source] < order_map[target] && tree_map[e]) {
656
            initFace(target, arc_lists, node_data,
657
                     pred_map, order_map, order_list);
658
          }
659
        }
660

	
661
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
662
          Node target = _graph.target(e);
663

	
664
          if (order_map[source] < order_map[target] && !tree_map[e]) {
665
            embed_arc[target] = e;
666
            walkUp(target, source, i, pred_map, low_map,
667
                   order_map, order_list, node_data, merge_roots);
668
          }
669
        }
670

	
671
        for (typename MergeRoots::Value::iterator it =
672
               merge_roots[node].begin(); it != merge_roots[node].end(); ++it) {
673
          int rn = *it;
674
          walkDown(rn, i, node_data, arc_lists, flip_map, order_list,
675
                   child_lists, ancestor_map, low_map, embed_arc, merge_roots);
676
        }
677
        merge_roots[node].clear();
678

	
679
        for (OutArcIt e(_graph, node); e != INVALID; ++e) {
680
          Node target = _graph.target(e);
681

	
682
          if (order_map[source] < order_map[target] && !tree_map[e]) {
683
            if (embed_arc[target] != INVALID) {
684
              if (kuratowski) {
685
                isolateKuratowski(e, node_data, arc_lists, flip_map,
686
                                  order_map, order_list, pred_map, child_lists,
687
                                  ancestor_map, low_map,
688
                                  embed_arc, merge_roots);
689
              }
690
              return false;
691
            }
692
          }
693
        }
694
      }
695

	
696
      for (int i = 0; i < int(order_list.size()); ++i) {
697

	
698
        mergeRemainingFaces(order_list[i], node_data, order_list, order_map,
699
                            child_lists, arc_lists);
700
        storeEmbedding(order_list[i], node_data, order_map, pred_map,
701
                       arc_lists, flip_map);
702
      }
703

	
704
      return true;
705
    }
706

	
707
    /// \brief Give back the successor of an arc
708
    ///
709
    /// This function gives back the successor of an arc. It makes
710
    /// possible to query the cyclic order of the outgoing arcs from
711
    /// a node.
712
    Arc next(const Arc& arc) const {
713
      return _embedding[arc];
714
    }
715

	
716
    /// \brief Give back the calculated embedding map
717
    ///
718
    /// This function gives back the calculated embedding map, which
719
    /// contains the successor of each arc in the cyclic order of the
720
    /// outgoing arcs of its source node.
721
    const EmbeddingMap& embeddingMap() const {
722
      return _embedding;
723
    }
724

	
725
    /// \brief Give back \c true if the given edge is in the Kuratowski
726
    /// subdivision
727
    ///
728
    /// This function gives back \c true if the given edge is in the found
729
    /// Kuratowski subdivision.
730
    /// \pre The \c run() function must be called with \c true parameter
731
    /// before using this function.
732
    bool kuratowski(const Edge& edge) const {
733
      return _kuratowski[edge];
734
    }
735

	
736
  private:
737

	
738
    void createChildLists(const TreeMap& tree_map, const OrderMap& order_map,
739
                          const LowMap& low_map, ChildLists& child_lists) {
740

	
741
      for (NodeIt n(_graph); n != INVALID; ++n) {
742
        Node source = n;
743

	
744
        std::vector<Node> targets;
745
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
746
          Node target = _graph.target(e);
747

	
748
          if (order_map[source] < order_map[target] && tree_map[e]) {
749
            targets.push_back(target);
750
          }
751
        }
752

	
753
        if (targets.size() == 0) {
754
          child_lists[source].first = INVALID;
755
        } else if (targets.size() == 1) {
756
          child_lists[source].first = targets[0];
757
          child_lists[targets[0]].prev = INVALID;
758
          child_lists[targets[0]].next = INVALID;
759
        } else {
760
          radixSort(targets.begin(), targets.end(), mapToFunctor(low_map));
761
          for (int i = 1; i < int(targets.size()); ++i) {
762
            child_lists[targets[i]].prev = targets[i - 1];
763
            child_lists[targets[i - 1]].next = targets[i];
764
          }
765
          child_lists[targets.back()].next = INVALID;
766
          child_lists[targets.front()].prev = INVALID;
767
          child_lists[source].first = targets.front();
768
        }
769
      }
770
    }
771

	
772
    void walkUp(const Node& node, Node root, int rorder,
773
                const PredMap& pred_map, const LowMap& low_map,
774
                const OrderMap& order_map, const OrderList& order_list,
775
                NodeData& node_data, MergeRoots& merge_roots) {
776

	
777
      int na, nb;
778
      bool da, db;
779

	
780
      na = nb = order_map[node];
781
      da = true; db = false;
782

	
783
      while (true) {
784

	
785
        if (node_data[na].visited == rorder) break;
786
        if (node_data[nb].visited == rorder) break;
787

	
788
        node_data[na].visited = rorder;
789
        node_data[nb].visited = rorder;
790

	
791
        int rn = -1;
792

	
793
        if (na >= int(order_list.size())) {
794
          rn = na;
795
        } else if (nb >= int(order_list.size())) {
796
          rn = nb;
797
        }
798

	
799
        if (rn == -1) {
800
          int nn;
801

	
802
          nn = da ? node_data[na].prev : node_data[na].next;
803
          da = node_data[nn].prev != na;
804
          na = nn;
805

	
806
          nn = db ? node_data[nb].prev : node_data[nb].next;
807
          db = node_data[nn].prev != nb;
808
          nb = nn;
809

	
810
        } else {
811

	
812
          Node rep = order_list[rn - order_list.size()];
813
          Node parent = _graph.source(pred_map[rep]);
814

	
815
          if (low_map[rep] < rorder) {
816
            merge_roots[parent].push_back(rn);
817
          } else {
818
            merge_roots[parent].push_front(rn);
819
          }
820

	
821
          if (parent != root) {
822
            na = nb = order_map[parent];
823
            da = true; db = false;
824
          } else {
825
            break;
826
          }
827
        }
828
      }
829
    }
830

	
831
    void walkDown(int rn, int rorder, NodeData& node_data,
832
                  ArcLists& arc_lists, FlipMap& flip_map,
833
                  OrderList& order_list, ChildLists& child_lists,
834
                  AncestorMap& ancestor_map, LowMap& low_map,
835
                  EmbedArc& embed_arc, MergeRoots& merge_roots) {
836

	
837
      std::vector<std::pair<int, bool> > merge_stack;
838

	
839
      for (int di = 0; di < 2; ++di) {
840
        bool rd = di == 0;
841
        int pn = rn;
842
        int n = rd ? node_data[rn].next : node_data[rn].prev;
843

	
844
        while (n != rn) {
845

	
846
          Node node = order_list[n];
847

	
848
          if (embed_arc[node] != INVALID) {
849

	
850
            // Merging components on the critical path
851
            while (!merge_stack.empty()) {
852

	
853
              // Component root
854
              int cn = merge_stack.back().first;
855
              bool cd = merge_stack.back().second;
856
              merge_stack.pop_back();
857

	
858
              // Parent of component
859
              int dn = merge_stack.back().first;
860
              bool dd = merge_stack.back().second;
861
              merge_stack.pop_back();
862

	
863
              Node parent = order_list[dn];
864

	
865
              // Erasing from merge_roots
866
              merge_roots[parent].pop_front();
867

	
868
              Node child = order_list[cn - order_list.size()];
869

	
870
              // Erasing from child_lists
871
              if (child_lists[child].prev != INVALID) {
872
                child_lists[child_lists[child].prev].next =
873
                  child_lists[child].next;
874
              } else {
875
                child_lists[parent].first = child_lists[child].next;
876
              }
877

	
878
              if (child_lists[child].next != INVALID) {
879
                child_lists[child_lists[child].next].prev =
880
                  child_lists[child].prev;
881
              }
882

	
883
              // Merging arcs + flipping
884
              Arc de = node_data[dn].first;
885
              Arc ce = node_data[cn].first;
886

	
887
              flip_map[order_list[cn - order_list.size()]] = cd != dd;
888
              if (cd != dd) {
889
                std::swap(arc_lists[ce].prev, arc_lists[ce].next);
890
                ce = arc_lists[ce].prev;
891
                std::swap(arc_lists[ce].prev, arc_lists[ce].next);
892
              }
893

	
894
              {
895
                Arc dne = arc_lists[de].next;
896
                Arc cne = arc_lists[ce].next;
897

	
898
                arc_lists[de].next = cne;
899
                arc_lists[ce].next = dne;
900

	
901
                arc_lists[dne].prev = ce;
902
                arc_lists[cne].prev = de;
903
              }
904

	
905
              if (dd) {
906
                node_data[dn].first = ce;
907
              }
908

	
909
              // Merging external faces
910
              {
911
                int en = cn;
912
                cn = cd ? node_data[cn].prev : node_data[cn].next;
913
                cd = node_data[cn].next == en;
914

	
915
                 if (node_data[cn].prev == node_data[cn].next &&
916
                    node_data[cn].inverted) {
917
                   cd = !cd;
918
                 }
919
              }
920

	
921
              if (cd) node_data[cn].next = dn; else node_data[cn].prev = dn;
922
              if (dd) node_data[dn].prev = cn; else node_data[dn].next = cn;
923

	
924
            }
925

	
926
            bool d = pn == node_data[n].prev;
927

	
928
            if (node_data[n].prev == node_data[n].next &&
929
                node_data[n].inverted) {
930
              d = !d;
931
            }
932

	
933
            // Add new arc
934
            {
935
              Arc arc = embed_arc[node];
936
              Arc re = node_data[rn].first;
937

	
938
              arc_lists[arc_lists[re].next].prev = arc;
939
              arc_lists[arc].next = arc_lists[re].next;
940
              arc_lists[arc].prev = re;
941
              arc_lists[re].next = arc;
942

	
943
              if (!rd) {
944
                node_data[rn].first = arc;
945
              }
946

	
947
              Arc rev = _graph.oppositeArc(arc);
948
              Arc e = node_data[n].first;
949

	
950
              arc_lists[arc_lists[e].next].prev = rev;
951
              arc_lists[rev].next = arc_lists[e].next;
952
              arc_lists[rev].prev = e;
953
              arc_lists[e].next = rev;
954

	
955
              if (d) {
956
                node_data[n].first = rev;
957
              }
958

	
959
            }
960

	
961
            // Embedding arc into external face
962
            if (rd) node_data[rn].next = n; else node_data[rn].prev = n;
963
            if (d) node_data[n].prev = rn; else node_data[n].next = rn;
964
            pn = rn;
965

	
966
            embed_arc[order_list[n]] = INVALID;
967
          }
968

	
969
          if (!merge_roots[node].empty()) {
970

	
971
            bool d = pn == node_data[n].prev;
972
            if (node_data[n].prev == node_data[n].next &&
973
                node_data[n].inverted) {
974
              d = !d;
975
            }
976

	
977
            merge_stack.push_back(std::make_pair(n, d));
978

	
979
            int rn = merge_roots[node].front();
980

	
981
            int xn = node_data[rn].next;
982
            Node xnode = order_list[xn];
983

	
984
            int yn = node_data[rn].prev;
985
            Node ynode = order_list[yn];
986

	
987
            bool rd;
988
            if (!external(xnode, rorder, child_lists, ancestor_map, low_map)) {
989
              rd = true;
990
            } else if (!external(ynode, rorder, child_lists,
991
                                 ancestor_map, low_map)) {
992
              rd = false;
993
            } else if (pertinent(xnode, embed_arc, merge_roots)) {
994
              rd = true;
995
            } else {
996
              rd = false;
997
            }
998

	
999
            merge_stack.push_back(std::make_pair(rn, rd));
1000

	
1001
            pn = rn;
1002
            n = rd ? xn : yn;
1003

	
1004
          } else if (!external(node, rorder, child_lists,
1005
                               ancestor_map, low_map)) {
1006
            int nn = (node_data[n].next != pn ?
1007
                      node_data[n].next : node_data[n].prev);
1008

	
1009
            bool nd = n == node_data[nn].prev;
1010

	
1011
            if (nd) node_data[nn].prev = pn;
1012
            else node_data[nn].next = pn;
1013

	
1014
            if (n == node_data[pn].prev) node_data[pn].prev = nn;
1015
            else node_data[pn].next = nn;
1016

	
1017
            node_data[nn].inverted =
1018
              (node_data[nn].prev == node_data[nn].next && nd != rd);
1019

	
1020
            n = nn;
1021
          }
1022
          else break;
1023

	
1024
        }
1025

	
1026
        if (!merge_stack.empty() || n == rn) {
1027
          break;
1028
        }
1029
      }
1030
    }
1031

	
1032
    void initFace(const Node& node, ArcLists& arc_lists,
1033
                  NodeData& node_data, const PredMap& pred_map,
1034
                  const OrderMap& order_map, const OrderList& order_list) {
1035
      int n = order_map[node];
1036
      int rn = n + order_list.size();
1037

	
1038
      node_data[n].next = node_data[n].prev = rn;
1039
      node_data[rn].next = node_data[rn].prev = n;
1040

	
1041
      node_data[n].visited = order_list.size();
1042
      node_data[rn].visited = order_list.size();
1043

	
1044
      node_data[n].inverted = false;
1045
      node_data[rn].inverted = false;
1046

	
1047
      Arc arc = pred_map[node];
1048
      Arc rev = _graph.oppositeArc(arc);
1049

	
1050
      node_data[rn].first = arc;
1051
      node_data[n].first = rev;
1052

	
1053
      arc_lists[arc].prev = arc;
1054
      arc_lists[arc].next = arc;
1055

	
1056
      arc_lists[rev].prev = rev;
1057
      arc_lists[rev].next = rev;
1058

	
1059
    }
1060

	
1061
    void mergeRemainingFaces(const Node& node, NodeData& node_data,
1062
                             OrderList& order_list, OrderMap& order_map,
1063
                             ChildLists& child_lists, ArcLists& arc_lists) {
1064
      while (child_lists[node].first != INVALID) {
1065
        int dd = order_map[node];
1066
        Node child = child_lists[node].first;
1067
        int cd = order_map[child] + order_list.size();
1068
        child_lists[node].first = child_lists[child].next;
1069

	
1070
        Arc de = node_data[dd].first;
1071
        Arc ce = node_data[cd].first;
1072

	
1073
        if (de != INVALID) {
1074
          Arc dne = arc_lists[de].next;
1075
          Arc cne = arc_lists[ce].next;
1076

	
1077
          arc_lists[de].next = cne;
1078
          arc_lists[ce].next = dne;
1079

	
1080
          arc_lists[dne].prev = ce;
1081
          arc_lists[cne].prev = de;
1082
        }
1083

	
1084
        node_data[dd].first = ce;
1085

	
1086
      }
1087
    }
1088

	
1089
    void storeEmbedding(const Node& node, NodeData& node_data,
1090
                        OrderMap& order_map, PredMap& pred_map,
1091
                        ArcLists& arc_lists, FlipMap& flip_map) {
1092

	
1093
      if (node_data[order_map[node]].first == INVALID) return;
1094

	
1095
      if (pred_map[node] != INVALID) {
1096
        Node source = _graph.source(pred_map[node]);
1097
        flip_map[node] = flip_map[node] != flip_map[source];
1098
      }
1099

	
1100
      Arc first = node_data[order_map[node]].first;
1101
      Arc prev = first;
1102

	
1103
      Arc arc = flip_map[node] ?
1104
        arc_lists[prev].prev : arc_lists[prev].next;
1105

	
1106
      _embedding[prev] = arc;
1107

	
1108
      while (arc != first) {
1109
        Arc next = arc_lists[arc].prev == prev ?
1110
          arc_lists[arc].next : arc_lists[arc].prev;
1111
        prev = arc; arc = next;
1112
        _embedding[prev] = arc;
1113
      }
1114
    }
1115

	
1116

	
1117
    bool external(const Node& node, int rorder,
1118
                  ChildLists& child_lists, AncestorMap& ancestor_map,
1119
                  LowMap& low_map) {
1120
      Node child = child_lists[node].first;
1121

	
1122
      if (child != INVALID) {
1123
        if (low_map[child] < rorder) return true;
1124
      }
1125

	
1126
      if (ancestor_map[node] < rorder) return true;
1127

	
1128
      return false;
1129
    }
1130

	
1131
    bool pertinent(const Node& node, const EmbedArc& embed_arc,
1132
                   const MergeRoots& merge_roots) {
1133
      return !merge_roots[node].empty() || embed_arc[node] != INVALID;
1134
    }
1135

	
1136
    int lowPoint(const Node& node, OrderMap& order_map, ChildLists& child_lists,
1137
                 AncestorMap& ancestor_map, LowMap& low_map) {
1138
      int low_point;
1139

	
1140
      Node child = child_lists[node].first;
1141

	
1142
      if (child != INVALID) {
1143
        low_point = low_map[child];
1144
      } else {
1145
        low_point = order_map[node];
1146
      }
1147

	
1148
      if (low_point > ancestor_map[node]) {
1149
        low_point = ancestor_map[node];
1150
      }
1151

	
1152
      return low_point;
1153
    }
1154

	
1155
    int findComponentRoot(Node root, Node node, ChildLists& child_lists,
1156
                          OrderMap& order_map, OrderList& order_list) {
1157

	
1158
      int order = order_map[root];
1159
      int norder = order_map[node];
1160

	
1161
      Node child = child_lists[root].first;
1162
      while (child != INVALID) {
1163
        int corder = order_map[child];
1164
        if (corder > order && corder < norder) {
1165
          order = corder;
1166
        }
1167
        child = child_lists[child].next;
1168
      }
1169
      return order + order_list.size();
1170
    }
1171

	
1172
    Node findPertinent(Node node, OrderMap& order_map, NodeData& node_data,
1173
                       EmbedArc& embed_arc, MergeRoots& merge_roots) {
1174
      Node wnode =_graph.target(node_data[order_map[node]].first);
1175
      while (!pertinent(wnode, embed_arc, merge_roots)) {
1176
        wnode = _graph.target(node_data[order_map[wnode]].first);
1177
      }
1178
      return wnode;
1179
    }
1180

	
1181

	
1182
    Node findExternal(Node node, int rorder, OrderMap& order_map,
1183
                      ChildLists& child_lists, AncestorMap& ancestor_map,
1184
                      LowMap& low_map, NodeData& node_data) {
1185
      Node wnode =_graph.target(node_data[order_map[node]].first);
1186
      while (!external(wnode, rorder, child_lists, ancestor_map, low_map)) {
1187
        wnode = _graph.target(node_data[order_map[wnode]].first);
1188
      }
1189
      return wnode;
1190
    }
1191

	
1192
    void markCommonPath(Node node, int rorder, Node& wnode, Node& znode,
1193
                        OrderList& order_list, OrderMap& order_map,
1194
                        NodeData& node_data, ArcLists& arc_lists,
1195
                        EmbedArc& embed_arc, MergeRoots& merge_roots,
1196
                        ChildLists& child_lists, AncestorMap& ancestor_map,
1197
                        LowMap& low_map) {
1198

	
1199
      Node cnode = node;
1200
      Node pred = INVALID;
1201

	
1202
      while (true) {
1203

	
1204
        bool pert = pertinent(cnode, embed_arc, merge_roots);
1205
        bool ext = external(cnode, rorder, child_lists, ancestor_map, low_map);
1206

	
1207
        if (pert && ext) {
1208
          if (!merge_roots[cnode].empty()) {
1209
            int cn = merge_roots[cnode].back();
1210

	
1211
            if (low_map[order_list[cn - order_list.size()]] < rorder) {
1212
              Arc arc = node_data[cn].first;
1213
              _kuratowski.set(arc, true);
1214

	
1215
              pred = cnode;
1216
              cnode = _graph.target(arc);
1217

	
1218
              continue;
1219
            }
1220
          }
1221
          wnode = znode = cnode;
1222
          return;
1223

	
1224
        } else if (pert) {
1225
          wnode = cnode;
1226

	
1227
          while (!external(cnode, rorder, child_lists, ancestor_map, low_map)) {
1228
            Arc arc = node_data[order_map[cnode]].first;
1229

	
1230
            if (_graph.target(arc) == pred) {
1231
              arc = arc_lists[arc].next;
1232
            }
1233
            _kuratowski.set(arc, true);
1234

	
1235
            Node next = _graph.target(arc);
1236
            pred = cnode; cnode = next;
1237
          }
1238

	
1239
          znode = cnode;
1240
          return;
1241

	
1242
        } else if (ext) {
1243
          znode = cnode;
1244

	
1245
          while (!pertinent(cnode, embed_arc, merge_roots)) {
1246
            Arc arc = node_data[order_map[cnode]].first;
1247

	
1248
            if (_graph.target(arc) == pred) {
1249
              arc = arc_lists[arc].next;
1250
            }
1251
            _kuratowski.set(arc, true);
1252

	
1253
            Node next = _graph.target(arc);
1254
            pred = cnode; cnode = next;
1255
          }
1256

	
1257
          wnode = cnode;
1258
          return;
1259

	
1260
        } else {
1261
          Arc arc = node_data[order_map[cnode]].first;
1262

	
1263
          if (_graph.target(arc) == pred) {
1264
            arc = arc_lists[arc].next;
1265
          }
1266
          _kuratowski.set(arc, true);
1267

	
1268
          Node next = _graph.target(arc);
1269
          pred = cnode; cnode = next;
1270
        }
1271

	
1272
      }
1273

	
1274
    }
1275

	
1276
    void orientComponent(Node root, int rn, OrderMap& order_map,
1277
                         PredMap& pred_map, NodeData& node_data,
1278
                         ArcLists& arc_lists, FlipMap& flip_map,
1279
                         TypeMap& type_map) {
1280
      node_data[order_map[root]].first = node_data[rn].first;
1281
      type_map[root] = 1;
1282

	
1283
      std::vector<Node> st, qu;
1284

	
1285
      st.push_back(root);
1286
      while (!st.empty()) {
1287
        Node node = st.back();
1288
        st.pop_back();
1289
        qu.push_back(node);
1290

	
1291
        Arc arc = node_data[order_map[node]].first;
1292

	
1293
        if (type_map[_graph.target(arc)] == 0) {
1294
          st.push_back(_graph.target(arc));
1295
          type_map[_graph.target(arc)] = 1;
1296
        }
1297

	
1298
        Arc last = arc, pred = arc;
1299
        arc = arc_lists[arc].next;
1300
        while (arc != last) {
1301

	
1302
          if (type_map[_graph.target(arc)] == 0) {
1303
            st.push_back(_graph.target(arc));
1304
            type_map[_graph.target(arc)] = 1;
1305
          }
1306

	
1307
          Arc next = arc_lists[arc].next != pred ?
1308
            arc_lists[arc].next : arc_lists[arc].prev;
1309
          pred = arc; arc = next;
1310
        }
1311

	
1312
      }
1313

	
1314
      type_map[root] = 2;
1315
      flip_map[root] = false;
1316

	
1317
      for (int i = 1; i < int(qu.size()); ++i) {
1318

	
1319
        Node node = qu[i];
1320

	
1321
        while (type_map[node] != 2) {
1322
          st.push_back(node);
1323
          type_map[node] = 2;
1324
          node = _graph.source(pred_map[node]);
1325
        }
1326

	
1327
        bool flip = flip_map[node];
1328

	
1329
        while (!st.empty()) {
1330
          node = st.back();
1331
          st.pop_back();
1332

	
1333
          flip_map[node] = flip != flip_map[node];
1334
          flip = flip_map[node];
1335

	
1336
          if (flip) {
1337
            Arc arc = node_data[order_map[node]].first;
1338
            std::swap(arc_lists[arc].prev, arc_lists[arc].next);
1339
            arc = arc_lists[arc].prev;
1340
            std::swap(arc_lists[arc].prev, arc_lists[arc].next);
1341
            node_data[order_map[node]].first = arc;
1342
          }
1343
        }
1344
      }
1345

	
1346
      for (int i = 0; i < int(qu.size()); ++i) {
1347

	
1348
        Arc arc = node_data[order_map[qu[i]]].first;
1349
        Arc last = arc, pred = arc;
1350

	
1351
        arc = arc_lists[arc].next;
1352
        while (arc != last) {
1353

	
1354
          if (arc_lists[arc].next == pred) {
1355
            std::swap(arc_lists[arc].next, arc_lists[arc].prev);
1356
          }
1357
          pred = arc; arc = arc_lists[arc].next;
1358
        }
1359

	
1360
      }
1361
    }
1362

	
1363
    void setFaceFlags(Node root, Node wnode, Node ynode, Node xnode,
1364
                      OrderMap& order_map, NodeData& node_data,
1365
                      TypeMap& type_map) {
1366
      Node node = _graph.target(node_data[order_map[root]].first);
1367

	
1368
      while (node != ynode) {
1369
        type_map[node] = HIGHY;
1370
        node = _graph.target(node_data[order_map[node]].first);
1371
      }
1372

	
1373
      while (node != wnode) {
1374
        type_map[node] = LOWY;
1375
        node = _graph.target(node_data[order_map[node]].first);
1376
      }
1377

	
1378
      node = _graph.target(node_data[order_map[wnode]].first);
1379

	
1380
      while (node != xnode) {
1381
        type_map[node] = LOWX;
1382
        node = _graph.target(node_data[order_map[node]].first);
1383
      }
1384
      type_map[node] = LOWX;
1385

	
1386
      node = _graph.target(node_data[order_map[xnode]].first);
1387
      while (node != root) {
1388
        type_map[node] = HIGHX;
1389
        node = _graph.target(node_data[order_map[node]].first);
1390
      }
1391

	
1392
      type_map[wnode] = PERTINENT;
1393
      type_map[root] = ROOT;
1394
    }
1395

	
1396
    void findInternalPath(std::vector<Arc>& ipath,
1397
                          Node wnode, Node root, TypeMap& type_map,
1398
                          OrderMap& order_map, NodeData& node_data,
1399
                          ArcLists& arc_lists) {
1400
      std::vector<Arc> st;
1401

	
1402
      Node node = wnode;
1403

	
1404
      while (node != root) {
1405
        Arc arc = arc_lists[node_data[order_map[node]].first].next;
1406
        st.push_back(arc);
1407
        node = _graph.target(arc);
1408
      }
1409

	
1410
      while (true) {
1411
        Arc arc = st.back();
1412
        if (type_map[_graph.target(arc)] == LOWX ||
1413
            type_map[_graph.target(arc)] == HIGHX) {
1414
          break;
1415
        }
1416
        if (type_map[_graph.target(arc)] == 2) {
1417
          type_map[_graph.target(arc)] = 3;
1418

	
1419
          arc = arc_lists[_graph.oppositeArc(arc)].next;
1420
          st.push_back(arc);
1421
        } else {
1422
          st.pop_back();
1423
          arc = arc_lists[arc].next;
1424

	
1425
          while (_graph.oppositeArc(arc) == st.back()) {
1426
            arc = st.back();
1427
            st.pop_back();
1428
            arc = arc_lists[arc].next;
1429
          }
1430
          st.push_back(arc);
1431
        }
1432
      }
1433

	
1434
      for (int i = 0; i < int(st.size()); ++i) {
1435
        if (type_map[_graph.target(st[i])] != LOWY &&
1436
            type_map[_graph.target(st[i])] != HIGHY) {
1437
          for (; i < int(st.size()); ++i) {
1438
            ipath.push_back(st[i]);
1439
          }
1440
        }
1441
      }
1442
    }
1443

	
1444
    void setInternalFlags(std::vector<Arc>& ipath, TypeMap& type_map) {
1445
      for (int i = 1; i < int(ipath.size()); ++i) {
1446
        type_map[_graph.source(ipath[i])] = INTERNAL;
1447
      }
1448
    }
1449

	
1450
    void findPilePath(std::vector<Arc>& ppath,
1451
                      Node root, TypeMap& type_map, OrderMap& order_map,
1452
                      NodeData& node_data, ArcLists& arc_lists) {
1453
      std::vector<Arc> st;
1454

	
1455
      st.push_back(_graph.oppositeArc(node_data[order_map[root]].first));
1456
      st.push_back(node_data[order_map[root]].first);
1457

	
1458
      while (st.size() > 1) {
1459
        Arc arc = st.back();
1460
        if (type_map[_graph.target(arc)] == INTERNAL) {
1461
          break;
1462
        }
1463
        if (type_map[_graph.target(arc)] == 3) {
1464
          type_map[_graph.target(arc)] = 4;
1465

	
1466
          arc = arc_lists[_graph.oppositeArc(arc)].next;
1467
          st.push_back(arc);
1468
        } else {
1469
          st.pop_back();
1470
          arc = arc_lists[arc].next;
1471

	
1472
          while (!st.empty() && _graph.oppositeArc(arc) == st.back()) {
1473
            arc = st.back();
1474
            st.pop_back();
1475
            arc = arc_lists[arc].next;
1476
          }
1477
          st.push_back(arc);
1478
        }
1479
      }
1480

	
1481
      for (int i = 1; i < int(st.size()); ++i) {
1482
        ppath.push_back(st[i]);
1483
      }
1484
    }
1485

	
1486

	
1487
    int markExternalPath(Node node, OrderMap& order_map,
1488
                         ChildLists& child_lists, PredMap& pred_map,
1489
                         AncestorMap& ancestor_map, LowMap& low_map) {
1490
      int lp = lowPoint(node, order_map, child_lists,
1491
                        ancestor_map, low_map);
1492

	
1493
      if (ancestor_map[node] != lp) {
1494
        node = child_lists[node].first;
1495
        _kuratowski[pred_map[node]] = true;
1496

	
1497
        while (ancestor_map[node] != lp) {
1498
          for (OutArcIt e(_graph, node); e != INVALID; ++e) {
1499
            Node tnode = _graph.target(e);
1500
            if (order_map[tnode] > order_map[node] && low_map[tnode] == lp) {
1501
              node = tnode;
1502
              _kuratowski[e] = true;
1503
              break;
1504
            }
1505
          }
1506
        }
1507
      }
1508

	
1509
      for (OutArcIt e(_graph, node); e != INVALID; ++e) {
1510
        if (order_map[_graph.target(e)] == lp) {
1511
          _kuratowski[e] = true;
1512
          break;
1513
        }
1514
      }
1515

	
1516
      return lp;
1517
    }
1518

	
1519
    void markPertinentPath(Node node, OrderMap& order_map,
1520
                           NodeData& node_data, ArcLists& arc_lists,
1521
                           EmbedArc& embed_arc, MergeRoots& merge_roots) {
1522
      while (embed_arc[node] == INVALID) {
1523
        int n = merge_roots[node].front();
1524
        Arc arc = node_data[n].first;
1525

	
1526
        _kuratowski.set(arc, true);
1527

	
1528
        Node pred = node;
1529
        node = _graph.target(arc);
1530
        while (!pertinent(node, embed_arc, merge_roots)) {
1531
          arc = node_data[order_map[node]].first;
1532
          if (_graph.target(arc) == pred) {
1533
            arc = arc_lists[arc].next;
1534
          }
1535
          _kuratowski.set(arc, true);
1536
          pred = node;
1537
          node = _graph.target(arc);
1538
        }
1539
      }
1540
      _kuratowski.set(embed_arc[node], true);
1541
    }
1542

	
1543
    void markPredPath(Node node, Node snode, PredMap& pred_map) {
1544
      while (node != snode) {
1545
        _kuratowski.set(pred_map[node], true);
1546
        node = _graph.source(pred_map[node]);
1547
      }
1548
    }
1549

	
1550
    void markFacePath(Node ynode, Node xnode,
1551
                      OrderMap& order_map, NodeData& node_data) {
1552
      Arc arc = node_data[order_map[ynode]].first;
1553
      Node node = _graph.target(arc);
1554
      _kuratowski.set(arc, true);
1555

	
1556
      while (node != xnode) {
1557
        arc = node_data[order_map[node]].first;
1558
        _kuratowski.set(arc, true);
1559
        node = _graph.target(arc);
1560
      }
1561
    }
1562

	
1563
    void markInternalPath(std::vector<Arc>& path) {
1564
      for (int i = 0; i < int(path.size()); ++i) {
1565
        _kuratowski.set(path[i], true);
1566
      }
1567
    }
1568

	
1569
    void markPilePath(std::vector<Arc>& path) {
1570
      for (int i = 0; i < int(path.size()); ++i) {
1571
        _kuratowski.set(path[i], true);
1572
      }
1573
    }
1574

	
1575
    void isolateKuratowski(Arc arc, NodeData& node_data,
1576
                           ArcLists& arc_lists, FlipMap& flip_map,
1577
                           OrderMap& order_map, OrderList& order_list,
1578
                           PredMap& pred_map, ChildLists& child_lists,
1579
                           AncestorMap& ancestor_map, LowMap& low_map,
1580
                           EmbedArc& embed_arc, MergeRoots& merge_roots) {
1581

	
1582
      Node root = _graph.source(arc);
1583
      Node enode = _graph.target(arc);
1584

	
1585
      int rorder = order_map[root];
1586

	
1587
      TypeMap type_map(_graph, 0);
1588

	
1589
      int rn = findComponentRoot(root, enode, child_lists,
1590
                                 order_map, order_list);
1591

	
1592
      Node xnode = order_list[node_data[rn].next];
1593
      Node ynode = order_list[node_data[rn].prev];
1594

	
1595
      // Minor-A
1596
      {
1597
        while (!merge_roots[xnode].empty() || !merge_roots[ynode].empty()) {
1598

	
1599
          if (!merge_roots[xnode].empty()) {
1600
            root = xnode;
1601
            rn = merge_roots[xnode].front();
1602
          } else {
1603
            root = ynode;
1604
            rn = merge_roots[ynode].front();
1605
          }
1606

	
1607
          xnode = order_list[node_data[rn].next];
1608
          ynode = order_list[node_data[rn].prev];
1609
        }
1610

	
1611
        if (root != _graph.source(arc)) {
1612
          orientComponent(root, rn, order_map, pred_map,
1613
                          node_data, arc_lists, flip_map, type_map);
1614
          markFacePath(root, root, order_map, node_data);
1615
          int xlp = markExternalPath(xnode, order_map, child_lists,
1616
                                     pred_map, ancestor_map, low_map);
1617
          int ylp = markExternalPath(ynode, order_map, child_lists,
1618
                                     pred_map, ancestor_map, low_map);
1619
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1620
          Node lwnode = findPertinent(ynode, order_map, node_data,
1621
                                      embed_arc, merge_roots);
1622

	
1623
          markPertinentPath(lwnode, order_map, node_data, arc_lists,
1624
                            embed_arc, merge_roots);
1625

	
1626
          return;
1627
        }
1628
      }
1629

	
1630
      orientComponent(root, rn, order_map, pred_map,
1631
                      node_data, arc_lists, flip_map, type_map);
1632

	
1633
      Node wnode = findPertinent(ynode, order_map, node_data,
1634
                                 embed_arc, merge_roots);
1635
      setFaceFlags(root, wnode, ynode, xnode, order_map, node_data, type_map);
1636

	
1637

	
1638
      //Minor-B
1639
      if (!merge_roots[wnode].empty()) {
1640
        int cn = merge_roots[wnode].back();
1641
        Node rep = order_list[cn - order_list.size()];
1642
        if (low_map[rep] < rorder) {
1643
          markFacePath(root, root, order_map, node_data);
1644
          int xlp = markExternalPath(xnode, order_map, child_lists,
1645
                                     pred_map, ancestor_map, low_map);
1646
          int ylp = markExternalPath(ynode, order_map, child_lists,
1647
                                     pred_map, ancestor_map, low_map);
1648

	
1649
          Node lwnode, lznode;
1650
          markCommonPath(wnode, rorder, lwnode, lznode, order_list,
1651
                         order_map, node_data, arc_lists, embed_arc,
1652
                         merge_roots, child_lists, ancestor_map, low_map);
1653

	
1654
          markPertinentPath(lwnode, order_map, node_data, arc_lists,
1655
                            embed_arc, merge_roots);
1656
          int zlp = markExternalPath(lznode, order_map, child_lists,
1657
                                     pred_map, ancestor_map, low_map);
1658

	
1659
          int minlp = xlp < ylp ? xlp : ylp;
1660
          if (zlp < minlp) minlp = zlp;
1661

	
1662
          int maxlp = xlp > ylp ? xlp : ylp;
1663
          if (zlp > maxlp) maxlp = zlp;
1664

	
1665
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1666

	
1667
          return;
1668
        }
1669
      }
1670

	
1671
      Node pxnode, pynode;
1672
      std::vector<Arc> ipath;
1673
      findInternalPath(ipath, wnode, root, type_map, order_map,
1674
                       node_data, arc_lists);
1675
      setInternalFlags(ipath, type_map);
1676
      pynode = _graph.source(ipath.front());
1677
      pxnode = _graph.target(ipath.back());
1678

	
1679
      wnode = findPertinent(pynode, order_map, node_data,
1680
                            embed_arc, merge_roots);
1681

	
1682
      // Minor-C
1683
      {
1684
        if (type_map[_graph.source(ipath.front())] == HIGHY) {
1685
          if (type_map[_graph.target(ipath.back())] == HIGHX) {
1686
            markFacePath(xnode, pxnode, order_map, node_data);
1687
          }
1688
          markFacePath(root, xnode, order_map, node_data);
1689
          markPertinentPath(wnode, order_map, node_data, arc_lists,
1690
                            embed_arc, merge_roots);
1691
          markInternalPath(ipath);
1692
          int xlp = markExternalPath(xnode, order_map, child_lists,
1693
                                     pred_map, ancestor_map, low_map);
1694
          int ylp = markExternalPath(ynode, order_map, child_lists,
1695
                                     pred_map, ancestor_map, low_map);
1696
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1697
          return;
1698
        }
1699

	
1700
        if (type_map[_graph.target(ipath.back())] == HIGHX) {
1701
          markFacePath(ynode, root, order_map, node_data);
1702
          markPertinentPath(wnode, order_map, node_data, arc_lists,
1703
                            embed_arc, merge_roots);
1704
          markInternalPath(ipath);
1705
          int xlp = markExternalPath(xnode, order_map, child_lists,
1706
                                     pred_map, ancestor_map, low_map);
1707
          int ylp = markExternalPath(ynode, order_map, child_lists,
1708
                                     pred_map, ancestor_map, low_map);
1709
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1710
          return;
1711
        }
1712
      }
1713

	
1714
      std::vector<Arc> ppath;
1715
      findPilePath(ppath, root, type_map, order_map, node_data, arc_lists);
1716

	
1717
      // Minor-D
1718
      if (!ppath.empty()) {
1719
        markFacePath(ynode, xnode, order_map, node_data);
1720
        markPertinentPath(wnode, order_map, node_data, arc_lists,
1721
                          embed_arc, merge_roots);
1722
        markPilePath(ppath);
1723
        markInternalPath(ipath);
1724
        int xlp = markExternalPath(xnode, order_map, child_lists,
1725
                                   pred_map, ancestor_map, low_map);
1726
        int ylp = markExternalPath(ynode, order_map, child_lists,
1727
                                   pred_map, ancestor_map, low_map);
1728
        markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1729
        return;
1730
      }
1731

	
1732
      // Minor-E*
1733
      {
1734

	
1735
        if (!external(wnode, rorder, child_lists, ancestor_map, low_map)) {
1736
          Node znode = findExternal(pynode, rorder, order_map,
1737
                                    child_lists, ancestor_map,
1738
                                    low_map, node_data);
1739

	
1740
          if (type_map[znode] == LOWY) {
1741
            markFacePath(root, xnode, order_map, node_data);
1742
            markPertinentPath(wnode, order_map, node_data, arc_lists,
1743
                              embed_arc, merge_roots);
1744
            markInternalPath(ipath);
1745
            int xlp = markExternalPath(xnode, order_map, child_lists,
1746
                                       pred_map, ancestor_map, low_map);
1747
            int zlp = markExternalPath(znode, order_map, child_lists,
1748
                                       pred_map, ancestor_map, low_map);
1749
            markPredPath(root, order_list[xlp < zlp ? xlp : zlp], pred_map);
1750
          } else {
1751
            markFacePath(ynode, root, order_map, node_data);
1752
            markPertinentPath(wnode, order_map, node_data, arc_lists,
1753
                              embed_arc, merge_roots);
1754
            markInternalPath(ipath);
1755
            int ylp = markExternalPath(ynode, order_map, child_lists,
1756
                                       pred_map, ancestor_map, low_map);
1757
            int zlp = markExternalPath(znode, order_map, child_lists,
1758
                                       pred_map, ancestor_map, low_map);
1759
            markPredPath(root, order_list[ylp < zlp ? ylp : zlp], pred_map);
1760
          }
1761
          return;
1762
        }
1763

	
1764
        int xlp = markExternalPath(xnode, order_map, child_lists,
1765
                                   pred_map, ancestor_map, low_map);
1766
        int ylp = markExternalPath(ynode, order_map, child_lists,
1767
                                   pred_map, ancestor_map, low_map);
1768
        int wlp = markExternalPath(wnode, order_map, child_lists,
1769
                                   pred_map, ancestor_map, low_map);
1770

	
1771
        if (wlp > xlp && wlp > ylp) {
1772
          markFacePath(root, root, order_map, node_data);
1773
          markPredPath(root, order_list[xlp < ylp ? xlp : ylp], pred_map);
1774
          return;
1775
        }
1776

	
1777
        markInternalPath(ipath);
1778
        markPertinentPath(wnode, order_map, node_data, arc_lists,
1779
                          embed_arc, merge_roots);
1780

	
1781
        if (xlp > ylp && xlp > wlp) {
1782
          markFacePath(root, pynode, order_map, node_data);
1783
          markFacePath(wnode, xnode, order_map, node_data);
1784
          markPredPath(root, order_list[ylp < wlp ? ylp : wlp], pred_map);
1785
          return;
1786
        }
1787

	
1788
        if (ylp > xlp && ylp > wlp) {
1789
          markFacePath(pxnode, root, order_map, node_data);
1790
          markFacePath(ynode, wnode, order_map, node_data);
1791
          markPredPath(root, order_list[xlp < wlp ? xlp : wlp], pred_map);
1792
          return;
1793
        }
1794

	
1795
        if (pynode != ynode) {
1796
          markFacePath(pxnode, wnode, order_map, node_data);
1797

	
1798
          int minlp = xlp < ylp ? xlp : ylp;
1799
          if (wlp < minlp) minlp = wlp;
1800

	
1801
          int maxlp = xlp > ylp ? xlp : ylp;
1802
          if (wlp > maxlp) maxlp = wlp;
1803

	
1804
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1805
          return;
1806
        }
1807

	
1808
        if (pxnode != xnode) {
1809
          markFacePath(wnode, pynode, order_map, node_data);
1810

	
1811
          int minlp = xlp < ylp ? xlp : ylp;
1812
          if (wlp < minlp) minlp = wlp;
1813

	
1814
          int maxlp = xlp > ylp ? xlp : ylp;
1815
          if (wlp > maxlp) maxlp = wlp;
1816

	
1817
          markPredPath(order_list[maxlp], order_list[minlp], pred_map);
1818
          return;
1819
        }
1820

	
1821
        markFacePath(root, root, order_map, node_data);
1822
        int minlp = xlp < ylp ? xlp : ylp;
1823
        if (wlp < minlp) minlp = wlp;
1824
        markPredPath(root, order_list[minlp], pred_map);
1825
        return;
1826
      }
1827

	
1828
    }
1829

	
1830
  };
1831

	
1832
  namespace _planarity_bits {
1833

	
1834
    template <typename Graph, typename EmbeddingMap>
1835
    void makeConnected(Graph& graph, EmbeddingMap& embedding) {
1836
      DfsVisitor<Graph> null_visitor;
1837
      DfsVisit<Graph, DfsVisitor<Graph> > dfs(graph, null_visitor);
1838
      dfs.init();
1839

	
1840
      typename Graph::Node u = INVALID;
1841
      for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1842
        if (!dfs.reached(n)) {
1843
          dfs.addSource(n);
1844
          dfs.start();
1845
          if (u == INVALID) {
1846
            u = n;
1847
          } else {
1848
            typename Graph::Node v = n;
1849

	
1850
            typename Graph::Arc ue = typename Graph::OutArcIt(graph, u);
1851
            typename Graph::Arc ve = typename Graph::OutArcIt(graph, v);
1852

	
1853
            typename Graph::Arc e = graph.direct(graph.addEdge(u, v), true);
1854

	
1855
            if (ue != INVALID) {
1856
              embedding[e] = embedding[ue];
1857
              embedding[ue] = e;
1858
            } else {
1859
              embedding[e] = e;
1860
            }
1861

	
1862
            if (ve != INVALID) {
1863
              embedding[graph.oppositeArc(e)] = embedding[ve];
1864
              embedding[ve] = graph.oppositeArc(e);
1865
            } else {
1866
              embedding[graph.oppositeArc(e)] = graph.oppositeArc(e);
1867
            }
1868
          }
1869
        }
1870
      }
1871
    }
1872

	
1873
    template <typename Graph, typename EmbeddingMap>
1874
    void makeBiNodeConnected(Graph& graph, EmbeddingMap& embedding) {
1875
      typename Graph::template ArcMap<bool> processed(graph);
1876

	
1877
      std::vector<typename Graph::Arc> arcs;
1878
      for (typename Graph::ArcIt e(graph); e != INVALID; ++e) {
1879
        arcs.push_back(e);
1880
      }
1881

	
1882
      IterableBoolMap<Graph, typename Graph::Node> visited(graph, false);
1883

	
1884
      for (int i = 0; i < int(arcs.size()); ++i) {
1885
        typename Graph::Arc pp = arcs[i];
1886
        if (processed[pp]) continue;
1887

	
1888
        typename Graph::Arc e = embedding[graph.oppositeArc(pp)];
1889
        processed[e] = true;
1890
        visited.set(graph.source(e), true);
1891

	
1892
        typename Graph::Arc p = e, l = e;
1893
        e = embedding[graph.oppositeArc(e)];
1894

	
1895
        while (e != l) {
1896
          processed[e] = true;
1897

	
1898
          if (visited[graph.source(e)]) {
1899

	
1900
            typename Graph::Arc n =
1901
              graph.direct(graph.addEdge(graph.source(p),
1902
                                           graph.target(e)), true);
1903
            embedding[n] = p;
1904
            embedding[graph.oppositeArc(pp)] = n;
1905

	
1906
            embedding[graph.oppositeArc(n)] =
1907
              embedding[graph.oppositeArc(e)];
1908
            embedding[graph.oppositeArc(e)] =
1909
              graph.oppositeArc(n);
1910

	
1911
            p = n;
1912
            e = embedding[graph.oppositeArc(n)];
1913
          } else {
1914
            visited.set(graph.source(e), true);
1915
            pp = p;
1916
            p = e;
1917
            e = embedding[graph.oppositeArc(e)];
1918
          }
1919
        }
1920
        visited.setAll(false);
1921
      }
1922
    }
1923

	
1924

	
1925
    template <typename Graph, typename EmbeddingMap>
1926
    void makeMaxPlanar(Graph& graph, EmbeddingMap& embedding) {
1927

	
1928
      typename Graph::template NodeMap<int> degree(graph);
1929

	
1930
      for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1931
        degree[n] = countIncEdges(graph, n);
1932
      }
1933

	
1934
      typename Graph::template ArcMap<bool> processed(graph);
1935
      IterableBoolMap<Graph, typename Graph::Node> visited(graph, false);
1936

	
1937
      std::vector<typename Graph::Arc> arcs;
1938
      for (typename Graph::ArcIt e(graph); e != INVALID; ++e) {
1939
        arcs.push_back(e);
1940
      }
1941

	
1942
      for (int i = 0; i < int(arcs.size()); ++i) {
1943
        typename Graph::Arc e = arcs[i];
1944

	
1945
        if (processed[e]) continue;
1946
        processed[e] = true;
1947

	
1948
        typename Graph::Arc mine = e;
1949
        int mind = degree[graph.source(e)];
1950

	
1951
        int face_size = 1;
1952

	
1953
        typename Graph::Arc l = e;
1954
        e = embedding[graph.oppositeArc(e)];
1955
        while (l != e) {
1956
          processed[e] = true;
1957

	
1958
          ++face_size;
1959

	
1960
          if (degree[graph.source(e)] < mind) {
1961
            mine = e;
1962
            mind = degree[graph.source(e)];
1963
          }
1964

	
1965
          e = embedding[graph.oppositeArc(e)];
1966
        }
1967

	
1968
        if (face_size < 4) {
1969
          continue;
1970
        }
1971

	
1972
        typename Graph::Node s = graph.source(mine);
1973
        for (typename Graph::OutArcIt e(graph, s); e != INVALID; ++e) {
1974
          visited.set(graph.target(e), true);
1975
        }
1976

	
1977
        typename Graph::Arc oppe = INVALID;
1978

	
1979
        e = embedding[graph.oppositeArc(mine)];
1980
        e = embedding[graph.oppositeArc(e)];
1981
        while (graph.target(e) != s) {
1982
          if (visited[graph.source(e)]) {
1983
            oppe = e;
1984
            break;
1985
          }
1986
          e = embedding[graph.oppositeArc(e)];
1987
        }
1988
        visited.setAll(false);
1989

	
1990
        if (oppe == INVALID) {
1991

	
1992
          e = embedding[graph.oppositeArc(mine)];
1993
          typename Graph::Arc pn = mine, p = e;
1994

	
1995
          e = embedding[graph.oppositeArc(e)];
1996
          while (graph.target(e) != s) {
1997
            typename Graph::Arc n =
1998
              graph.direct(graph.addEdge(s, graph.source(e)), true);
1999

	
2000
            embedding[n] = pn;
2001
            embedding[graph.oppositeArc(n)] = e;
2002
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2003

	
2004
            pn = n;
2005

	
2006
            p = e;
2007
            e = embedding[graph.oppositeArc(e)];
2008
          }
2009

	
2010
          embedding[graph.oppositeArc(e)] = pn;
2011

	
2012
        } else {
2013

	
2014
          mine = embedding[graph.oppositeArc(mine)];
2015
          s = graph.source(mine);
2016
          oppe = embedding[graph.oppositeArc(oppe)];
2017
          typename Graph::Node t = graph.source(oppe);
2018

	
2019
          typename Graph::Arc ce = graph.direct(graph.addEdge(s, t), true);
2020
          embedding[ce] = mine;
2021
          embedding[graph.oppositeArc(ce)] = oppe;
2022

	
2023
          typename Graph::Arc pn = ce, p = oppe;
2024
          e = embedding[graph.oppositeArc(oppe)];
2025
          while (graph.target(e) != s) {
2026
            typename Graph::Arc n =
2027
              graph.direct(graph.addEdge(s, graph.source(e)), true);
2028

	
2029
            embedding[n] = pn;
2030
            embedding[graph.oppositeArc(n)] = e;
2031
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2032

	
2033
            pn = n;
2034

	
2035
            p = e;
2036
            e = embedding[graph.oppositeArc(e)];
2037

	
2038
          }
2039
          embedding[graph.oppositeArc(e)] = pn;
2040

	
2041
          pn = graph.oppositeArc(ce), p = mine;
2042
          e = embedding[graph.oppositeArc(mine)];
2043
          while (graph.target(e) != t) {
2044
            typename Graph::Arc n =
2045
              graph.direct(graph.addEdge(t, graph.source(e)), true);
2046

	
2047
            embedding[n] = pn;
2048
            embedding[graph.oppositeArc(n)] = e;
2049
            embedding[graph.oppositeArc(p)] = graph.oppositeArc(n);
2050

	
2051
            pn = n;
2052

	
2053
            p = e;
2054
            e = embedding[graph.oppositeArc(e)];
2055

	
2056
          }
2057
          embedding[graph.oppositeArc(e)] = pn;
2058
        }
2059
      }
2060
    }
2061

	
2062
  }
2063

	
2064
  /// \ingroup planar
2065
  ///
2066
  /// \brief Schnyder's planar drawing algorithm
2067
  ///
2068
  /// The planar drawing algorithm calculates positions for the nodes
2069
  /// in the plane. These coordinates satisfy that if the edges are
2070
  /// represented with straight lines, then they will not intersect
2071
  /// each other.
2072
  ///
2073
  /// Scnyder's algorithm embeds the graph on an \c (n-2)x(n-2) size grid,
2074
  /// i.e. each node will be located in the \c [0..n-2]x[0..n-2] square.
2075
  /// The time complexity of the algorithm is O(n).
2076
  ///
2077
  /// \see PlanarEmbedding
2078
  template <typename Graph>
2079
  class PlanarDrawing {
2080
  public:
2081

	
2082
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
2083

	
2084
    /// \brief The point type for storing coordinates
2085
    typedef dim2::Point<int> Point;
2086
    /// \brief The map type for storing the coordinates of the nodes
2087
    typedef typename Graph::template NodeMap<Point> PointMap;
2088

	
2089

	
2090
    /// \brief Constructor
2091
    ///
2092
    /// Constructor
2093
    /// \pre The graph must be simple, i.e. it should not
2094
    /// contain parallel or loop arcs.
2095
    PlanarDrawing(const Graph& graph)
2096
      : _graph(graph), _point_map(graph) {}
2097

	
2098
  private:
2099

	
2100
    template <typename AuxGraph, typename AuxEmbeddingMap>
2101
    void drawing(const AuxGraph& graph,
2102
                 const AuxEmbeddingMap& next,
2103
                 PointMap& point_map) {
2104
      TEMPLATE_GRAPH_TYPEDEFS(AuxGraph);
2105

	
2106
      typename AuxGraph::template ArcMap<Arc> prev(graph);
2107

	
2108
      for (NodeIt n(graph); n != INVALID; ++n) {
2109
        Arc e = OutArcIt(graph, n);
2110

	
2111
        Arc p = e, l = e;
2112

	
2113
        e = next[e];
2114
        while (e != l) {
2115
          prev[e] = p;
2116
          p = e;
2117
          e = next[e];
2118
        }
2119
        prev[e] = p;
2120
      }
2121

	
2122
      Node anode, bnode, cnode;
2123

	
2124
      {
2125
        Arc e = ArcIt(graph);
2126
        anode = graph.source(e);
2127
        bnode = graph.target(e);
2128
        cnode = graph.target(next[graph.oppositeArc(e)]);
2129
      }
2130

	
2131
      IterableBoolMap<AuxGraph, Node> proper(graph, false);
2132
      typename AuxGraph::template NodeMap<int> conn(graph, -1);
2133

	
2134
      conn[anode] = conn[bnode] = -2;
2135
      {
2136
        for (OutArcIt e(graph, anode); e != INVALID; ++e) {
2137
          Node m = graph.target(e);
2138
          if (conn[m] == -1) {
2139
            conn[m] = 1;
2140
          }
2141
        }
2142
        conn[cnode] = 2;
2143

	
2144
        for (OutArcIt e(graph, bnode); e != INVALID; ++e) {
2145
          Node m = graph.target(e);
2146
          if (conn[m] == -1) {
2147
            conn[m] = 1;
2148
          } else if (conn[m] != -2) {
2149
            conn[m] += 1;
2150
            Arc pe = graph.oppositeArc(e);
2151
            if (conn[graph.target(next[pe])] == -2) {
2152
              conn[m] -= 1;
2153
            }
2154
            if (conn[graph.target(prev[pe])] == -2) {
2155
              conn[m] -= 1;
2156
            }
2157

	
2158
            proper.set(m, conn[m] == 1);
2159
          }
2160
        }
2161
      }
2162

	
2163

	
2164
      typename AuxGraph::template ArcMap<int> angle(graph, -1);
2165

	
2166
      while (proper.trueNum() != 0) {
2167
        Node n = typename IterableBoolMap<AuxGraph, Node>::TrueIt(proper);
2168
        proper.set(n, false);
2169
        conn[n] = -2;
2170

	
2171
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2172
          Node m = graph.target(e);
2173
          if (conn[m] == -1) {
2174
            conn[m] = 1;
2175
          } else if (conn[m] != -2) {
2176
            conn[m] += 1;
2177
            Arc pe = graph.oppositeArc(e);
2178
            if (conn[graph.target(next[pe])] == -2) {
2179
              conn[m] -= 1;
2180
            }
2181
            if (conn[graph.target(prev[pe])] == -2) {
2182
              conn[m] -= 1;
2183
            }
2184

	
2185
            proper.set(m, conn[m] == 1);
2186
          }
2187
        }
2188

	
2189
        {
2190
          Arc e = OutArcIt(graph, n);
2191
          Arc p = e, l = e;
2192

	
2193
          e = next[e];
2194
          while (e != l) {
2195

	
2196
            if (conn[graph.target(e)] == -2 && conn[graph.target(p)] == -2) {
2197
              Arc f = e;
2198
              angle[f] = 0;
2199
              f = next[graph.oppositeArc(f)];
2200
              angle[f] = 1;
2201
              f = next[graph.oppositeArc(f)];
2202
              angle[f] = 2;
2203
            }
2204

	
2205
            p = e;
2206
            e = next[e];
2207
          }
2208

	
2209
          if (conn[graph.target(e)] == -2 && conn[graph.target(p)] == -2) {
2210
            Arc f = e;
2211
            angle[f] = 0;
2212
            f = next[graph.oppositeArc(f)];
2213
            angle[f] = 1;
2214
            f = next[graph.oppositeArc(f)];
2215
            angle[f] = 2;
2216
          }
2217
        }
2218
      }
2219

	
2220
      typename AuxGraph::template NodeMap<Node> apred(graph, INVALID);
2221
      typename AuxGraph::template NodeMap<Node> bpred(graph, INVALID);
2222
      typename AuxGraph::template NodeMap<Node> cpred(graph, INVALID);
2223

	
2224
      typename AuxGraph::template NodeMap<int> apredid(graph, -1);
2225
      typename AuxGraph::template NodeMap<int> bpredid(graph, -1);
2226
      typename AuxGraph::template NodeMap<int> cpredid(graph, -1);
2227

	
2228
      for (ArcIt e(graph); e != INVALID; ++e) {
2229
        if (angle[e] == angle[next[e]]) {
2230
          switch (angle[e]) {
2231
          case 2:
2232
            apred[graph.target(e)] = graph.source(e);
2233
            apredid[graph.target(e)] = graph.id(graph.source(e));
2234
            break;
2235
          case 1:
2236
            bpred[graph.target(e)] = graph.source(e);
2237
            bpredid[graph.target(e)] = graph.id(graph.source(e));
2238
            break;
2239
          case 0:
2240
            cpred[graph.target(e)] = graph.source(e);
2241
            cpredid[graph.target(e)] = graph.id(graph.source(e));
2242
            break;
2243
          }
2244
        }
2245
      }
2246

	
2247
      cpred[anode] = INVALID;
2248
      cpred[bnode] = INVALID;
2249

	
2250
      std::vector<Node> aorder, border, corder;
2251

	
2252
      {
2253
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2254
        std::vector<Node> st;
2255
        for (NodeIt n(graph); n != INVALID; ++n) {
2256
          if (!processed[n] && n != bnode && n != cnode) {
2257
            st.push_back(n);
2258
            processed[n] = true;
2259
            Node m = apred[n];
2260
            while (m != INVALID && !processed[m]) {
2261
              st.push_back(m);
2262
              processed[m] = true;
2263
              m = apred[m];
2264
            }
2265
            while (!st.empty()) {
2266
              aorder.push_back(st.back());
2267
              st.pop_back();
2268
            }
2269
          }
2270
        }
2271
      }
2272

	
2273
      {
2274
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2275
        std::vector<Node> st;
2276
        for (NodeIt n(graph); n != INVALID; ++n) {
2277
          if (!processed[n] && n != cnode && n != anode) {
2278
            st.push_back(n);
2279
            processed[n] = true;
2280
            Node m = bpred[n];
2281
            while (m != INVALID && !processed[m]) {
2282
              st.push_back(m);
2283
              processed[m] = true;
2284
              m = bpred[m];
2285
            }
2286
            while (!st.empty()) {
2287
              border.push_back(st.back());
2288
              st.pop_back();
2289
            }
2290
          }
2291
        }
2292
      }
2293

	
2294
      {
2295
        typename AuxGraph::template NodeMap<bool> processed(graph, false);
2296
        std::vector<Node> st;
2297
        for (NodeIt n(graph); n != INVALID; ++n) {
2298
          if (!processed[n] && n != anode && n != bnode) {
2299
            st.push_back(n);
2300
            processed[n] = true;
2301
            Node m = cpred[n];
2302
            while (m != INVALID && !processed[m]) {
2303
              st.push_back(m);
2304
              processed[m] = true;
2305
              m = cpred[m];
2306
            }
2307
            while (!st.empty()) {
2308
              corder.push_back(st.back());
2309
              st.pop_back();
2310
            }
2311
          }
2312
        }
2313
      }
2314

	
2315
      typename AuxGraph::template NodeMap<int> atree(graph, 0);
2316
      for (int i = aorder.size() - 1; i >= 0; --i) {
2317
        Node n = aorder[i];
2318
        atree[n] = 1;
2319
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2320
          if (apred[graph.target(e)] == n) {
2321
            atree[n] += atree[graph.target(e)];
2322
          }
2323
        }
2324
      }
2325

	
2326
      typename AuxGraph::template NodeMap<int> btree(graph, 0);
2327
      for (int i = border.size() - 1; i >= 0; --i) {
2328
        Node n = border[i];
2329
        btree[n] = 1;
2330
        for (OutArcIt e(graph, n); e != INVALID; ++e) {
2331
          if (bpred[graph.target(e)] == n) {
2332
            btree[n] += btree[graph.target(e)];
2333
          }
2334
        }
2335
      }
2336

	
2337
      typename AuxGraph::template NodeMap<int> apath(graph, 0);
2338
      apath[bnode] = apath[cnode] = 1;
2339
      typename AuxGraph::template NodeMap<int> apath_btree(graph, 0);
2340
      apath_btree[bnode] = btree[bnode];
2341
      for (int i = 1; i < int(aorder.size()); ++i) {
2342
        Node n = aorder[i];
2343
        apath[n] = apath[apred[n]] + 1;
2344
        apath_btree[n] = btree[n] + apath_btree[apred[n]];
2345
      }
2346

	
2347
      typename AuxGraph::template NodeMap<int> bpath_atree(graph, 0);
2348
      bpath_atree[anode] = atree[anode];
2349
      for (int i = 1; i < int(border.size()); ++i) {
2350
        Node n = border[i];
2351
        bpath_atree[n] = atree[n] + bpath_atree[bpred[n]];
2352
      }
2353

	
2354
      typename AuxGraph::template NodeMap<int> cpath(graph, 0);
2355
      cpath[anode] = cpath[bnode] = 1;
2356
      typename AuxGraph::template NodeMap<int> cpath_atree(graph, 0);
2357
      cpath_atree[anode] = atree[anode];
2358
      typename AuxGraph::template NodeMap<int> cpath_btree(graph, 0);
2359
      cpath_btree[bnode] = btree[bnode];
2360
      for (int i = 1; i < int(corder.size()); ++i) {
2361
        Node n = corder[i];
2362
        cpath[n] = cpath[cpred[n]] + 1;
2363
        cpath_atree[n] = atree[n] + cpath_atree[cpred[n]];
2364
        cpath_btree[n] = btree[n] + cpath_btree[cpred[n]];
2365
      }
2366

	
2367
      typename AuxGraph::template NodeMap<int> third(graph);
2368
      for (NodeIt n(graph); n != INVALID; ++n) {
2369
        point_map[n].x =
2370
          bpath_atree[n] + cpath_atree[n] - atree[n] - cpath[n] + 1;
2371
        point_map[n].y =
2372
          cpath_btree[n] + apath_btree[n] - btree[n] - apath[n] + 1;
2373
      }
2374

	
2375
    }
2376

	
2377
  public:
2378

	
2379
    /// \brief Calculate the node positions
2380
    ///
2381
    /// This function calculates the node positions on the plane.
2382
    /// \return \c true if the graph is planar.
2383
    bool run() {
2384
      PlanarEmbedding<Graph> pe(_graph);
2385
      if (!pe.run()) return false;
2386

	
2387
      run(pe);
2388
      return true;
2389
    }
2390

	
2391
    /// \brief Calculate the node positions according to a
2392
    /// combinatorical embedding
2393
    ///
2394
    /// This function calculates the node positions on the plane.
2395
    /// The given \c embedding map should contain a valid combinatorical
2396
    /// embedding, i.e. a valid cyclic order of the arcs.
2397
    /// It can be computed using PlanarEmbedding.
2398
    template <typename EmbeddingMap>
2399
    void run(const EmbeddingMap& embedding) {
2400
      typedef SmartEdgeSet<Graph> AuxGraph;
2401

	
2402
      if (3 * countNodes(_graph) - 6 == countEdges(_graph)) {
2403
        drawing(_graph, embedding, _point_map);
2404
        return;
2405
      }
2406

	
2407
      AuxGraph aux_graph(_graph);
2408
      typename AuxGraph::template ArcMap<typename AuxGraph::Arc>
2409
        aux_embedding(aux_graph);
2410

	
2411
      {
2412

	
2413
        typename Graph::template EdgeMap<typename AuxGraph::Edge>
2414
          ref(_graph);
2415

	
2416
        for (EdgeIt e(_graph); e != INVALID; ++e) {
2417
          ref[e] = aux_graph.addEdge(_graph.u(e), _graph.v(e));
2418
        }
2419

	
2420
        for (EdgeIt e(_graph); e != INVALID; ++e) {
2421
          Arc ee = embedding[_graph.direct(e, true)];
2422
          aux_embedding[aux_graph.direct(ref[e], true)] =
2423
            aux_graph.direct(ref[ee], _graph.direction(ee));
2424
          ee = embedding[_graph.direct(e, false)];
2425
          aux_embedding[aux_graph.direct(ref[e], false)] =
2426
            aux_graph.direct(ref[ee], _graph.direction(ee));
2427
        }
2428
      }
2429
      _planarity_bits::makeConnected(aux_graph, aux_embedding);
2430
      _planarity_bits::makeBiNodeConnected(aux_graph, aux_embedding);
2431
      _planarity_bits::makeMaxPlanar(aux_graph, aux_embedding);
2432
      drawing(aux_graph, aux_embedding, _point_map);
2433
    }
2434

	
2435
    /// \brief The coordinate of the given node
2436
    ///
2437
    /// This function returns the coordinate of the given node.
2438
    Point operator[](const Node& node) const {
2439
      return _point_map[node];
2440
    }
2441

	
2442
    /// \brief Return the grid embedding in a node map
2443
    ///
2444
    /// This function returns the grid embedding in a node map of
2445
    /// \c dim2::Point<int> coordinates.
2446
    const PointMap& coords() const {
2447
      return _point_map;
2448
    }
2449

	
2450
  private:
2451

	
2452
    const Graph& _graph;
2453
    PointMap _point_map;
2454

	
2455
  };
2456

	
2457
  namespace _planarity_bits {
2458

	
2459
    template <typename ColorMap>
2460
    class KempeFilter {
2461
    public:
2462
      typedef typename ColorMap::Key Key;
2463
      typedef bool Value;
2464

	
2465
      KempeFilter(const ColorMap& color_map,
2466
                  const typename ColorMap::Value& first,
2467
                  const typename ColorMap::Value& second)
2468
        : _color_map(color_map), _first(first), _second(second) {}
2469

	
2470
      Value operator[](const Key& key) const {
2471
        return _color_map[key] == _first || _color_map[key] == _second;
2472
      }
2473

	
2474
    private:
2475
      const ColorMap& _color_map;
2476
      typename ColorMap::Value _first, _second;
2477
    };
2478
  }
2479

	
2480
  /// \ingroup planar
2481
  ///
2482
  /// \brief Coloring planar graphs
2483
  ///
2484
  /// The graph coloring problem is the coloring of the graph nodes
2485
  /// so that there are no adjacent nodes with the same color. The
2486
  /// planar graphs can always be colored with four colors, which is
2487
  /// proved by Appel and Haken. Their proofs provide a quadratic
2488
  /// time algorithm for four coloring, but it could not be used to
2489
  /// implement an efficient algorithm. The five and six coloring can be
2490
  /// made in linear time, but in this class, the five coloring has
2491
  /// quadratic worst case time complexity. The two coloring (if
2492
  /// possible) is solvable with a graph search algorithm and it is
2493
  /// implemented in \ref bipartitePartitions() function in LEMON. To
2494
  /// decide whether a planar graph is three colorable is NP-complete.
2495
  ///
2496
  /// This class contains member functions for calculate colorings
2497
  /// with five and six colors. The six coloring algorithm is a simple
2498
  /// greedy coloring on the backward minimum outgoing order of nodes.
2499
  /// This order can be computed by selecting the node with least
2500
  /// outgoing arcs to unprocessed nodes in each phase. This order
2501
  /// guarantees that when a node is chosen for coloring it has at
2502
  /// most five already colored adjacents. The five coloring algorithm
2503
  /// use the same method, but if the greedy approach fails to color
2504
  /// with five colors, i.e. the node has five already different
2505
  /// colored neighbours, it swaps the colors in one of the connected
2506
  /// two colored sets with the Kempe recoloring method.
2507
  template <typename Graph>
2508
  class PlanarColoring {
2509
  public:
2510

	
2511
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
2512

	
2513
    /// \brief The map type for storing color indices
2514
    typedef typename Graph::template NodeMap<int> IndexMap;
2515
    /// \brief The map type for storing colors
2516
    ///
2517
    /// The map type for storing colors.
2518
    /// \see Palette, Color
2519
    typedef ComposeMap<Palette, IndexMap> ColorMap;
2520

	
2521
    /// \brief Constructor
2522
    ///
2523
    /// Constructor.
2524
    /// \pre The graph must be simple, i.e. it should not
2525
    /// contain parallel or loop arcs.
2526
    PlanarColoring(const Graph& graph)
2527
      : _graph(graph), _color_map(graph), _palette(0) {
2528
      _palette.add(Color(1,0,0));
2529
      _palette.add(Color(0,1,0));
2530
      _palette.add(Color(0,0,1));
2531
      _palette.add(Color(1,1,0));
2532
      _palette.add(Color(1,0,1));
2533
      _palette.add(Color(0,1,1));
2534
    }
2535

	
2536
    /// \brief Return the node map of color indices
2537
    ///
2538
    /// This function returns the node map of color indices. The values are
2539
    /// in the range \c [0..4] or \c [0..5] according to the coloring method.
2540
    IndexMap colorIndexMap() const {
2541
      return _color_map;
2542
    }
2543

	
2544
    /// \brief Return the node map of colors
2545
    ///
2546
    /// This function returns the node map of colors. The values are among
2547
    /// five or six distinct \ref lemon::Color "colors".
2548
    ColorMap colorMap() const {
2549
      return composeMap(_palette, _color_map);
2550
    }
2551

	
2552
    /// \brief Return the color index of the node
2553
    ///
2554
    /// This function returns the color index of the given node. The value is
2555
    /// in the range \c [0..4] or \c [0..5] according to the coloring method.
2556
    int colorIndex(const Node& node) const {
2557
      return _color_map[node];
2558
    }
2559

	
2560
    /// \brief Return the color of the node
2561
    ///
2562
    /// This function returns the color of the given node. The value is among
2563
    /// five or six distinct \ref lemon::Color "colors".
2564
    Color color(const Node& node) const {
2565
      return _palette[_color_map[node]];
2566
    }
2567

	
2568

	
2569
    /// \brief Calculate a coloring with at most six colors
2570
    ///
2571
    /// This function calculates a coloring with at most six colors. The time
2572
    /// complexity of this variant is linear in the size of the graph.
2573
    /// \return \c true if the algorithm could color the graph with six colors.
2574
    /// If the algorithm fails, then the graph is not planar.
2575
    /// \note This function can return \c true if the graph is not
2576
    /// planar, but it can be colored with at most six colors.
2577
    bool runSixColoring() {
2578

	
2579
      typename Graph::template NodeMap<int> heap_index(_graph, -1);
2580
      BucketHeap<typename Graph::template NodeMap<int> > heap(heap_index);
2581

	
2582
      for (NodeIt n(_graph); n != INVALID; ++n) {
2583
        _color_map[n] = -2;
2584
        heap.push(n, countOutArcs(_graph, n));
2585
      }
2586

	
2587
      std::vector<Node> order;
2588

	
2589
      while (!heap.empty()) {
2590
        Node n = heap.top();
2591
        heap.pop();
2592
        _color_map[n] = -1;
2593
        order.push_back(n);
2594
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
2595
          Node t = _graph.runningNode(e);
2596
          if (_color_map[t] == -2) {
2597
            heap.decrease(t, heap[t] - 1);
2598
          }
2599
        }
2600
      }
2601

	
2602
      for (int i = order.size() - 1; i >= 0; --i) {
2603
        std::vector<bool> forbidden(6, false);
2604
        for (OutArcIt e(_graph, order[i]); e != INVALID; ++e) {
2605
          Node t = _graph.runningNode(e);
2606
          if (_color_map[t] != -1) {
2607
            forbidden[_color_map[t]] = true;
2608
          }
2609
        }
2610
               for (int k = 0; k < 6; ++k) {
2611
          if (!forbidden[k]) {
2612
            _color_map[order[i]] = k;
2613
            break;
2614
          }
2615
        }
2616
        if (_color_map[order[i]] == -1) {
2617
          return false;
2618
        }
2619
      }
2620
      return true;
2621
    }
2622

	
2623
  private:
2624

	
2625
    bool recolor(const Node& u, const Node& v) {
2626
      int ucolor = _color_map[u];
2627
      int vcolor = _color_map[v];
2628
      typedef _planarity_bits::KempeFilter<IndexMap> KempeFilter;
2629
      KempeFilter filter(_color_map, ucolor, vcolor);
2630

	
2631
      typedef FilterNodes<const Graph, const KempeFilter> KempeGraph;
2632
      KempeGraph kempe_graph(_graph, filter);
2633

	
2634
      std::vector<Node> comp;
2635
      Bfs<KempeGraph> bfs(kempe_graph);
2636
      bfs.init();
2637
      bfs.addSource(u);
2638
      while (!bfs.emptyQueue()) {
2639
        Node n = bfs.nextNode();
2640
        if (n == v) return false;
2641
        comp.push_back(n);
2642
        bfs.processNextNode();
2643
      }
2644

	
2645
      int scolor = ucolor + vcolor;
2646
      for (int i = 0; i < static_cast<int>(comp.size()); ++i) {
2647
        _color_map[comp[i]] = scolor - _color_map[comp[i]];
2648
      }
2649

	
2650
      return true;
2651
    }
2652

	
2653
    template <typename EmbeddingMap>
2654
    void kempeRecoloring(const Node& node, const EmbeddingMap& embedding) {
2655
      std::vector<Node> nodes;
2656
      nodes.reserve(4);
2657

	
2658
      for (Arc e = OutArcIt(_graph, node); e != INVALID; e = embedding[e]) {
2659
        Node t = _graph.target(e);
2660
        if (_color_map[t] != -1) {
2661
          nodes.push_back(t);
2662
          if (nodes.size() == 4) break;
2663
        }
2664
      }
2665

	
2666
      int color = _color_map[nodes[0]];
2667
      if (recolor(nodes[0], nodes[2])) {
2668
        _color_map[node] = color;
2669
      } else {
2670
        color = _color_map[nodes[1]];
2671
        recolor(nodes[1], nodes[3]);
2672
        _color_map[node] = color;
2673
      }
2674
    }
2675

	
2676
  public:
2677

	
2678
    /// \brief Calculate a coloring with at most five colors
2679
    ///
2680
    /// This function calculates a coloring with at most five
2681
    /// colors. The worst case time complexity of this variant is
2682
    /// quadratic in the size of the graph.
2683
    /// \param embedding This map should contain a valid combinatorical
2684
    /// embedding, i.e. a valid cyclic order of the arcs.
2685
    /// It can be computed using PlanarEmbedding.
2686
    template <typename EmbeddingMap>
2687
    void runFiveColoring(const EmbeddingMap& embedding) {
2688

	
2689
      typename Graph::template NodeMap<int> heap_index(_graph, -1);
2690
      BucketHeap<typename Graph::template NodeMap<int> > heap(heap_index);
2691

	
2692
      for (NodeIt n(_graph); n != INVALID; ++n) {
2693
        _color_map[n] = -2;
2694
        heap.push(n, countOutArcs(_graph, n));
2695
      }
2696

	
2697
      std::vector<Node> order;
2698

	
2699
      while (!heap.empty()) {
2700
        Node n = heap.top();
2701
        heap.pop();
2702
        _color_map[n] = -1;
2703
        order.push_back(n);
2704
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
2705
          Node t = _graph.runningNode(e);
2706
          if (_color_map[t] == -2) {
2707
            heap.decrease(t, heap[t] - 1);
2708
          }
2709
        }
2710
      }
2711

	
2712
      for (int i = order.size() - 1; i >= 0; --i) {
2713
        std::vector<bool> forbidden(5, false);
2714
        for (OutArcIt e(_graph, order[i]); e != INVALID; ++e) {
2715
          Node t = _graph.runningNode(e);
2716
          if (_color_map[t] != -1) {
2717
            forbidden[_color_map[t]] = true;
2718
          }
2719
        }
2720
        for (int k = 0; k < 5; ++k) {
2721
          if (!forbidden[k]) {
2722
            _color_map[order[i]] = k;
2723
            break;
2724
          }
2725
        }
2726
        if (_color_map[order[i]] == -1) {
2727
          kempeRecoloring(order[i], embedding);
2728
        }
2729
      }
2730
    }
2731

	
2732
    /// \brief Calculate a coloring with at most five colors
2733
    ///
2734
    /// This function calculates a coloring with at most five
2735
    /// colors. The worst case time complexity of this variant is
2736
    /// quadratic in the size of the graph.
2737
    /// \return \c true if the graph is planar.
2738
    bool runFiveColoring() {
2739
      PlanarEmbedding<Graph> pe(_graph);
2740
      if (!pe.run()) return false;
2741

	
2742
      runFiveColoring(pe.embeddingMap());
2743
      return true;
2744
    }
2745

	
2746
  private:
2747

	
2748
    const Graph& _graph;
2749
    IndexMap _color_map;
2750
    Palette _palette;
2751
  };
2752

	
2753
}
2754

	
2755
#endif
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
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_QUAD_HEAP_H
20
#define LEMON_QUAD_HEAP_H
21

	
22
///\ingroup heaps
23
///\file
24
///\brief Fourary (quaternary) heap implementation.
25

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

	
30
namespace lemon {
31

	
32
  /// \ingroup heaps
33
  ///
34
  ///\brief Fourary (quaternary) heap data structure.
35
  ///
36
  /// This class implements the \e Fourary (\e quaternary) \e heap
37
  /// data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
39
  ///
40
  /// The fourary heap is a specialization of the \ref DHeap "D-ary heap"
41
  /// for <tt>D=4</tt>. It is similar to the \ref BinHeap "binary heap",
42
  /// but its nodes have at most four children, instead of two.
43
  ///
44
  /// \tparam PR Type of the priorities of the items.
45
  /// \tparam IM A read-writable item map with \c int values, used
46
  /// internally to handle the cross references.
47
  /// \tparam CMP A functor class for comparing the priorities.
48
  /// The default is \c std::less<PR>.
49
  ///
50
  ///\sa BinHeap
51
  ///\sa DHeap
52
#ifdef DOXYGEN
53
  template <typename PR, typename IM, typename CMP>
54
#else
55
  template <typename PR, typename IM, typename CMP = std::less<PR> >
56
#endif
57
  class QuadHeap {
58
  public:
59
    /// Type of the item-int map.
60
    typedef IM ItemIntMap;
61
    /// Type of the priorities.
62
    typedef PR Prio;
63
    /// Type of the items stored in the heap.
64
    typedef typename ItemIntMap::Key Item;
65
    /// Type of the item-priority pairs.
66
    typedef std::pair<Item,Prio> Pair;
67
    /// Functor type for comparing the priorities.
68
    typedef CMP Compare;
69

	
70
    /// \brief Type to represent the states of the items.
71
    ///
72
    /// Each item has a state associated to it. It can be "in heap",
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.
75
    ///
76
    /// The item-int map must be initialized in such way that it assigns
77
    /// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.
78
    enum State {
79
      IN_HEAP = 0,    ///< = 0.
80
      PRE_HEAP = -1,  ///< = -1.
81
      POST_HEAP = -2  ///< = -2.
82
    };
83

	
84
  private:
85
    std::vector<Pair> _data;
86
    Compare _comp;
87
    ItemIntMap &_iim;
88

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

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

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

	
113
    /// \brief Check if the heap is empty.
114
    ///
115
    /// This function returns \c true if the heap is empty.
116
    bool empty() const { return _data.empty(); }
117

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

	
127
  private:
128
    static int parent(int i) { return (i-1)/4; }
129
    static int firstChild(int i) { return 4*i+1; }
130

	
131
    bool less(const Pair &p1, const Pair &p2) const {
132
      return _comp(p1.second, p2.second);
133
    }
134

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

	
145
    void bubbleDown(int hole, Pair p, int length) {
146
      if( length>1 ) {
147
        int child = firstChild(hole);
148
        while( child+3<length ) {
149
          int min=child;
150
          if( less(_data[++child], _data[min]) ) min=child;
151
          if( less(_data[++child], _data[min]) ) min=child;
152
          if( less(_data[++child], _data[min]) ) min=child;
153
          if( !less(_data[min], p) )
154
            goto ok;
155
          move(_data[min], hole);
156
          hole = min;
157
          child = firstChild(hole);
158
        }
159
        if ( child<length ) {
160
          int min = child;
161
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
162
          if( ++child<length && less(_data[child], _data[min]) ) min=child;
163
          if( less(_data[min], p) ) {
164
            move(_data[min], hole);
165
            hole = min;
166
          }
167
        }
168
      }
169
    ok:
170
      move(p, hole);
171
    }
172

	
173
    void move(const Pair &p, int i) {
174
      _data[i] = p;
175
      _iim.set(p.first, i);
176
    }
177

	
178
  public:
179
    /// \brief Insert a pair of item and priority into the heap.
180
    ///
181
    /// This function inserts \c p.first to the heap with priority
182
    /// \c p.second.
183
    /// \param p The pair to insert.
184
    /// \pre \c p.first must not be stored in the heap.
185
    void push(const Pair &p) {
186
      int n = _data.size();
187
      _data.resize(n+1);
188
      bubbleUp(n, p);
189
    }
190

	
191
    /// \brief Insert an item into the heap with the given priority.
192
    ///
193
    /// This function inserts the given item into the heap with the
194
    /// given priority.
195
    /// \param i The item to insert.
196
    /// \param p The priority of the item.
197
    /// \pre \e i must not be stored in the heap.
198
    void push(const Item &i, const Prio &p) { push(Pair(i,p)); }
199

	
200
    /// \brief Return the item having minimum priority.
201
    ///
202
    /// This function returns the item having minimum priority.
203
    /// \pre The heap must be non-empty.
204
    Item top() const { return _data[0].first; }
205

	
206
    /// \brief The minimum priority.
207
    ///
208
    /// This function returns the minimum priority.
209
    /// \pre The heap must be non-empty.
210
    Prio prio() const { return _data[0].second; }
211

	
212
    /// \brief Remove the item having minimum priority.
213
    ///
214
    /// This function removes the item having minimum priority.
215
    /// \pre The heap must be non-empty.
216
    void pop() {
217
      int n = _data.size()-1;
218
      _iim.set(_data[0].first, POST_HEAP);
219
      if (n>0) bubbleDown(0, _data[n], n);
220
      _data.pop_back();
221
    }
222

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

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

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

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

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

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

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

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

	
339
  }; // class QuadHeap
340

	
341
} // namespace lemon
342

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

	
19
#ifndef LEMON_STATIC_GRAPH_H
20
#define LEMON_STATIC_GRAPH_H
21

	
22
///\ingroup graphs
23
///\file
24
///\brief StaticDigraph class.
25

	
26
#include <lemon/core.h>
27
#include <lemon/bits/graph_extender.h>
28

	
29
namespace lemon {
30

	
31
  class StaticDigraphBase {
32
  public:
33

	
34
    StaticDigraphBase()
35
      : built(false), node_num(0), arc_num(0),
36
        node_first_out(NULL), node_first_in(NULL),
37
        arc_source(NULL), arc_target(NULL),
38
        arc_next_in(NULL), arc_next_out(NULL) {}
39

	
40
    ~StaticDigraphBase() {
41
      if (built) {
42
        delete[] node_first_out;
43
        delete[] node_first_in;
44
        delete[] arc_source;
45
        delete[] arc_target;
46
        delete[] arc_next_out;
47
        delete[] arc_next_in;
48
      }
49
    }
50

	
51
    class Node {
52
      friend class StaticDigraphBase;
53
    protected:
54
      int id;
55
      Node(int _id) : id(_id) {}
56
    public:
57
      Node() {}
58
      Node (Invalid) : id(-1) {}
59
      bool operator==(const Node& node) const { return id == node.id; }
60
      bool operator!=(const Node& node) const { return id != node.id; }
61
      bool operator<(const Node& node) const { return id < node.id; }
62
    };
63

	
64
    class Arc {
65
      friend class StaticDigraphBase;
66
    protected:
67
      int id;
68
      Arc(int _id) : id(_id) {}
69
    public:
70
      Arc() { }
71
      Arc (Invalid) : id(-1) {}
72
      bool operator==(const Arc& arc) const { return id == arc.id; }
73
      bool operator!=(const Arc& arc) const { return id != arc.id; }
74
      bool operator<(const Arc& arc) const { return id < arc.id; }
75
    };
76

	
77
    Node source(const Arc& e) const { return Node(arc_source[e.id]); }
78
    Node target(const Arc& e) const { return Node(arc_target[e.id]); }
79

	
80
    void first(Node& n) const { n.id = node_num - 1; }
81
    static void next(Node& n) { --n.id; }
82

	
83
    void first(Arc& e) const { e.id = arc_num - 1; }
84
    static void next(Arc& e) { --e.id; }
85

	
86
    void firstOut(Arc& e, const Node& n) const {
87
      e.id = node_first_out[n.id] != node_first_out[n.id + 1] ?
88
        node_first_out[n.id] : -1;
89
    }
90
    void nextOut(Arc& e) const { e.id = arc_next_out[e.id]; }
91

	
92
    void firstIn(Arc& e, const Node& n) const { e.id = node_first_in[n.id]; }
93
    void nextIn(Arc& e) const { e.id = arc_next_in[e.id]; }
94

	
95
    static int id(const Node& n) { return n.id; }
96
    static Node nodeFromId(int id) { return Node(id); }
97
    int maxNodeId() const { return node_num - 1; }
98

	
99
    static int id(const Arc& e) { return e.id; }
100
    static Arc arcFromId(int id) { return Arc(id); }
101
    int maxArcId() const { return arc_num - 1; }
102

	
103
    typedef True NodeNumTag;
104
    typedef True ArcNumTag;
105

	
106
    int nodeNum() const { return node_num; }
107
    int arcNum() const { return arc_num; }
108

	
109
  private:
110

	
111
    template <typename Digraph, typename NodeRefMap>
112
    class ArcLess {
113
    public:
114
      typedef typename Digraph::Arc Arc;
115

	
116
      ArcLess(const Digraph &_graph, const NodeRefMap& _nodeRef)
117
        : digraph(_graph), nodeRef(_nodeRef) {}
118

	
119
      bool operator()(const Arc& left, const Arc& right) const {
120
        return nodeRef[digraph.target(left)] < nodeRef[digraph.target(right)];
121
      }
122
    private:
123
      const Digraph& digraph;
124
      const NodeRefMap& nodeRef;
125
    };
126

	
127
  public:
128

	
129
    typedef True BuildTag;
130

	
131
    void clear() {
132
      if (built) {
133
        delete[] node_first_out;
134
        delete[] node_first_in;
135
        delete[] arc_source;
136
        delete[] arc_target;
137
        delete[] arc_next_out;
138
        delete[] arc_next_in;
139
      }
140
      built = false;
141
      node_num = 0;
142
      arc_num = 0;
143
    }
144

	
145
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
146
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
147
      typedef typename Digraph::Node GNode;
148
      typedef typename Digraph::Arc GArc;
149

	
150
      built = true;
151

	
152
      node_num = countNodes(digraph);
153
      arc_num = countArcs(digraph);
154

	
155
      node_first_out = new int[node_num + 1];
156
      node_first_in = new int[node_num];
157

	
158
      arc_source = new int[arc_num];
159
      arc_target = new int[arc_num];
160
      arc_next_out = new int[arc_num];
161
      arc_next_in = new int[arc_num];
162

	
163
      int node_index = 0;
164
      for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
165
        nodeRef[n] = Node(node_index);
166
        node_first_in[node_index] = -1;
167
        ++node_index;
168
      }
169

	
170
      ArcLess<Digraph, NodeRefMap> arcLess(digraph, nodeRef);
171

	
172
      int arc_index = 0;
173
      for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
174
        int source = nodeRef[n].id;
175
        std::vector<GArc> arcs;
176
        for (typename Digraph::OutArcIt e(digraph, n); e != INVALID; ++e) {
177
          arcs.push_back(e);
178
        }
179
        if (!arcs.empty()) {
180
          node_first_out[source] = arc_index;
181
          std::sort(arcs.begin(), arcs.end(), arcLess);
182
          for (typename std::vector<GArc>::iterator it = arcs.begin();
183
               it != arcs.end(); ++it) {
184
            int target = nodeRef[digraph.target(*it)].id;
185
            arcRef[*it] = Arc(arc_index);
186
            arc_source[arc_index] = source;
187
            arc_target[arc_index] = target;
188
            arc_next_in[arc_index] = node_first_in[target];
189
            node_first_in[target] = arc_index;
190
            arc_next_out[arc_index] = arc_index + 1;
191
            ++arc_index;
192
          }
193
          arc_next_out[arc_index - 1] = -1;
194
        } else {
195
          node_first_out[source] = arc_index;
196
        }
197
      }
198
      node_first_out[node_num] = arc_num;
199
    }
200

	
201
    template <typename ArcListIterator>
202
    void build(int n, ArcListIterator first, ArcListIterator last) {
203
      built = true;
204

	
205
      node_num = n;
206
      arc_num = std::distance(first, last);
207

	
208
      node_first_out = new int[node_num + 1];
209
      node_first_in = new int[node_num];
210

	
211
      arc_source = new int[arc_num];
212
      arc_target = new int[arc_num];
213
      arc_next_out = new int[arc_num];
214
      arc_next_in = new int[arc_num];
215

	
216
      for (int i = 0; i != node_num; ++i) {
217
        node_first_in[i] = -1;
218
      }
219

	
220
      int arc_index = 0;
221
      for (int i = 0; i != node_num; ++i) {
222
        node_first_out[i] = arc_index;
223
        for ( ; first != last && (*first).first == i; ++first) {
224
          int j = (*first).second;
225
          LEMON_ASSERT(j >= 0 && j < node_num,
226
            "Wrong arc list for StaticDigraph::build()");
227
          arc_source[arc_index] = i;
228
          arc_target[arc_index] = j;
229
          arc_next_in[arc_index] = node_first_in[j];
230
          node_first_in[j] = arc_index;
231
          arc_next_out[arc_index] = arc_index + 1;
232
          ++arc_index;
233
        }
234
        if (arc_index > node_first_out[i])
235
          arc_next_out[arc_index - 1] = -1;
236
      }
237
      LEMON_ASSERT(first == last,
238
        "Wrong arc list for StaticDigraph::build()");
239
      node_first_out[node_num] = arc_num;
240
    }
241

	
242
  protected:
243

	
244
    void fastFirstOut(Arc& e, const Node& n) const {
245
      e.id = node_first_out[n.id];
246
    }
247

	
248
    static void fastNextOut(Arc& e) {
249
      ++e.id;
250
    }
251
    void fastLastOut(Arc& e, const Node& n) const {
252
      e.id = node_first_out[n.id + 1];
253
    }
254

	
255
  protected:
256
    bool built;
257
    int node_num;
258
    int arc_num;
259
    int *node_first_out;
260
    int *node_first_in;
261
    int *arc_source;
262
    int *arc_target;
263
    int *arc_next_in;
264
    int *arc_next_out;
265
  };
266

	
267
  typedef DigraphExtender<StaticDigraphBase> ExtendedStaticDigraphBase;
268

	
269

	
270
  /// \ingroup graphs
271
  ///
272
  /// \brief A static directed graph class.
273
  ///
274
  /// \ref StaticDigraph is a highly efficient digraph implementation,
275
  /// but it is fully static.
276
  /// It stores only two \c int values for each node and only four \c int
277
  /// values for each arc. Moreover it provides faster item iteration than
278
  /// \ref ListDigraph and \ref SmartDigraph, especially using \c OutArcIt
279
  /// iterators, since its arcs are stored in an appropriate order.
280
  /// However it only provides build() and clear() functions and does not
281
  /// support any other modification of the digraph.
282
  ///
283
  /// Since this digraph structure is completely static, its nodes and arcs
284
  /// can be indexed with integers from the ranges <tt>[0..nodeNum()-1]</tt>
285
  /// and <tt>[0..arcNum()-1]</tt>, respectively.
286
  /// The index of an item is the same as its ID, it can be obtained
287
  /// using the corresponding \ref index() or \ref concepts::Digraph::id()
288
  /// "id()" function. A node or arc with a certain index can be obtained
289
  /// using node() or arc().
290
  ///
291
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
292
  /// Most of its member functions and nested classes are documented
293
  /// only in the concept class.
294
  ///
295
  /// This class provides constant time counting for nodes and arcs.
296
  ///
297
  /// \sa concepts::Digraph
298
  class StaticDigraph : public ExtendedStaticDigraphBase {
299
  public:
300

	
301
    typedef ExtendedStaticDigraphBase Parent;
302

	
303
  public:
304

	
305
    /// \brief Constructor
306
    ///
307
    /// Default constructor.
308
    StaticDigraph() : Parent() {}
309

	
310
    /// \brief The node with the given index.
311
    ///
312
    /// This function returns the node with the given index.
313
    /// \sa index()
314
    static Node node(int ix) { return Parent::nodeFromId(ix); }
315

	
316
    /// \brief The arc with the given index.
317
    ///
318
    /// This function returns the arc with the given index.
319
    /// \sa index()
320
    static Arc arc(int ix) { return Parent::arcFromId(ix); }
321

	
322
    /// \brief The index of the given node.
323
    ///
324
    /// This function returns the index of the the given node.
325
    /// \sa node()
326
    static int index(Node node) { return Parent::id(node); }
327

	
328
    /// \brief The index of the given arc.
329
    ///
330
    /// This function returns the index of the the given arc.
331
    /// \sa arc()
332
    static int index(Arc arc) { return Parent::id(arc); }
333

	
334
    /// \brief Number of nodes.
335
    ///
336
    /// This function returns the number of nodes.
337
    int nodeNum() const { return node_num; }
338

	
339
    /// \brief Number of arcs.
340
    ///
341
    /// This function returns the number of arcs.
342
    int arcNum() const { return arc_num; }
343

	
344
    /// \brief Build the digraph copying another digraph.
345
    ///
346
    /// This function builds the digraph copying another digraph of any
347
    /// kind. It can be called more than once, but in such case, the whole
348
    /// structure and all maps will be cleared and rebuilt.
349
    ///
350
    /// This method also makes possible to copy a digraph to a StaticDigraph
351
    /// structure using \ref DigraphCopy.
352
    ///
353
    /// \param digraph An existing digraph to be copied.
354
    /// \param nodeRef The node references will be copied into this map.
355
    /// Its key type must be \c Digraph::Node and its value type must be
356
    /// \c StaticDigraph::Node.
357
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap"
358
    /// concept.
359
    /// \param arcRef The arc references will be copied into this map.
360
    /// Its key type must be \c Digraph::Arc and its value type must be
361
    /// \c StaticDigraph::Arc.
362
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
363
    ///
364
    /// \note If you do not need the arc references, then you could use
365
    /// \ref NullMap for the last parameter. However the node references
366
    /// are required by the function itself, thus they must be readable
367
    /// from the map.
368
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
369
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
370
      if (built) Parent::clear();
371
      Parent::build(digraph, nodeRef, arcRef);
372
    }
373

	
374
    /// \brief Build the digraph from an arc list.
375
    ///
376
    /// This function builds the digraph from the given arc list.
377
    /// It can be called more than once, but in such case, the whole
378
    /// structure and all maps will be cleared and rebuilt.
379
    ///
380
    /// The list of the arcs must be given in the range <tt>[begin, end)</tt>
381
    /// specified by STL compatible itartors whose \c value_type must be
382
    /// <tt>std::pair<int,int></tt>.
383
    /// Each arc must be specified by a pair of integer indices
384
    /// from the range <tt>[0..n-1]</tt>. <i>The pairs must be in a
385
    /// non-decreasing order with respect to their first values.</i>
386
    /// If the k-th pair in the list is <tt>(i,j)</tt>, then
387
    /// <tt>arc(k-1)</tt> will connect <tt>node(i)</tt> to <tt>node(j)</tt>.
388
    ///
389
    /// \param n The number of nodes.
390
    /// \param begin An iterator pointing to the beginning of the arc list.
391
    /// \param end An iterator pointing to the end of the arc list.
392
    ///
393
    /// For example, a simple digraph can be constructed like this.
394
    /// \code
395
    ///   std::vector<std::pair<int,int> > arcs;
396
    ///   arcs.push_back(std::make_pair(0,1));
397
    ///   arcs.push_back(std::make_pair(0,2));
398
    ///   arcs.push_back(std::make_pair(1,3));
399
    ///   arcs.push_back(std::make_pair(1,2));
400
    ///   arcs.push_back(std::make_pair(3,0));
401
    ///   StaticDigraph gr;
402
    ///   gr.build(4, arcs.begin(), arcs.end());
403
    /// \endcode
404
    template <typename ArcListIterator>
405
    void build(int n, ArcListIterator begin, ArcListIterator end) {
406
      if (built) Parent::clear();
407
      StaticDigraphBase::build(n, begin, end);
408
      notifier(Node()).build();
409
      notifier(Arc()).build();
410
    }
411

	
412
    /// \brief Clear the digraph.
413
    ///
414
    /// This function erases all nodes and arcs from the digraph.
415
    void clear() {
416
      Parent::clear();
417
    }
418

	
419
  protected:
420

	
421
    using Parent::fastFirstOut;
422
    using Parent::fastNextOut;
423
    using Parent::fastLastOut;
424

	
425
  public:
426

	
427
    class OutArcIt : public Arc {
428
    public:
429

	
430
      OutArcIt() { }
431

	
432
      OutArcIt(Invalid i) : Arc(i) { }
433

	
434
      OutArcIt(const StaticDigraph& digraph, const Node& node) {
435
        digraph.fastFirstOut(*this, node);
436
        digraph.fastLastOut(last, node);
437
        if (last == *this) *this = INVALID;
438
      }
439

	
440
      OutArcIt(const StaticDigraph& digraph, const Arc& arc) : Arc(arc) {
441
        if (arc != INVALID) {
442
          digraph.fastLastOut(last, digraph.source(arc));
443
        }
444
      }
445

	
446
      OutArcIt& operator++() {
447
        StaticDigraph::fastNextOut(*this);
448
        if (last == *this) *this = INVALID;
449
        return *this;
450
      }
451

	
452
    private:
453
      Arc last;
454
    };
455

	
456
    Node baseNode(const OutArcIt &arc) const {
457
      return Parent::source(static_cast<const Arc&>(arc));
458
    }
459

	
460
    Node runningNode(const OutArcIt &arc) const {
461
      return Parent::target(static_cast<const Arc&>(arc));
462
    }
463

	
464
    Node baseNode(const InArcIt &arc) const {
465
      return Parent::target(static_cast<const Arc&>(arc));
466
    }
467

	
468
    Node runningNode(const InArcIt &arc) const {
469
      return Parent::source(static_cast<const Arc&>(arc));
470
    }
471

	
472
  };
473

	
474
}
475

	
476
#endif
Ignore white space 6 line context
1
EXTRA_DIST += \
2
	scripts/bib2dox.py \
3
	scripts/bootstrap.sh \
4
	scripts/chg-len.py \
5
	scripts/mk-release.sh \
6
	scripts/unify-sources.sh \
7
	scripts/valgrind-wrapper.sh
Ignore white space 6 line context
1
#! /usr/bin/env python
2
"""
3
  BibTeX to Doxygen converter
4
  Usage: python bib2dox.py bibfile.bib > bibfile.dox
5

	
6
  This file is a part of LEMON, a generic C++ optimization library.
7

	
8
  **********************************************************************
9

	
10
  This code is the modification of the BibTeX to XML converter
11
  by Vidar Bronken Gundersen et al.
12
  See the original copyright notices below. 
13

	
14
  **********************************************************************
15

	
16
  Decoder for bibliographic data, BibTeX
17
  Usage: python bibtex2xml.py bibfile.bib > bibfile.xml
18

	
19
  v.8
20
  (c)2002-06-23 Vidar Bronken Gundersen
21
  http://bibtexml.sf.net/
22
  Reuse approved as long as this notification is kept.
23
  Licence: GPL.
24

	
25
  Contributions/thanks to:
26
  Egon Willighagen, http://sf.net/projects/jreferences/
27
  Richard Mahoney (for providing a test case)
28

	
29
  Editted by Sara Sprenkle to be more robust and handle more bibtex features.
30
  (c) 2003-01-15
31

	
32
  1.  Changed bibtex: tags to bibxml: tags.
33
  2.  Use xmlns:bibxml="http://bibtexml.sf.net/"
34
  3.  Allow spaces between @type and first {
35
  4.  "author" fields with multiple authors split by " and "
36
      are put in separate xml "bibxml:author" tags.
37
  5.  Option for Titles: words are capitalized
38
      only if first letter in title or capitalized inside braces
39
  6.  Removes braces from within field values
40
  7.  Ignores comments in bibtex file (including @comment{ or % )
41
  8.  Replaces some special latex tags, e.g., replaces ~ with '&#160;'
42
  9.  Handles bibtex @string abbreviations
43
        --> includes bibtex's default abbreviations for months
44
        --> does concatenation of abbr # " more " and " more " # abbr
45
  10. Handles @type( ... ) or @type{ ... }
46
  11. The keywords field is split on , or ; and put into separate xml
47
      "bibxml:keywords" tags
48
  12. Ignores @preamble
49

	
50
  Known Limitations
51
  1.  Does not transform Latex encoding like math mode and special
52
      latex symbols.
53
  2.  Does not parse author fields into first and last names.
54
      E.g., It does not do anything special to an author whose name is
55
      in the form LAST_NAME, FIRST_NAME
56
      In "author" tag, will show up as
57
      <bibxml:author>LAST_NAME, FIRST_NAME</bibxml:author>
58
  3.  Does not handle "crossref" fields other than to print
59
      <bibxml:crossref>...</bibxml:crossref>
60
  4.  Does not inform user of the input's format errors.  You just won't
61
      be able to transform the file later with XSL
62

	
63
  You will have to manually edit the XML output if you need to handle
64
  these (and unknown) limitations.
65

	
66
"""
67

	
68
import string, re
69

	
70
# set of valid name characters
71
valid_name_chars = '[\w\-:]'
72

	
73
#
74
# define global regular expression variables
75
#
76
author_rex = re.compile('\s+and\s+')
77
rembraces_rex = re.compile('[{}]')
78
capitalize_rex = re.compile('({[^}]*})')
79

	
80
# used by bibtexkeywords(data)
81
keywords_rex = re.compile('[,;]')
82

	
83
# used by concat_line(line)
84
concatsplit_rex = re.compile('\s*#\s*')
85

	
86
# split on {, }, or " in verify_out_of_braces
87
delimiter_rex = re.compile('([{}"])',re.I)
88

	
89
field_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
90
data_rex = re.compile('\s*(\w*)\s*=\s*([^,]*),?')
91

	
92
url_rex = re.compile('\\\url\{([^}]*)\}')
93

	
94
#
95
# styles for html formatting
96
#
97
divstyle = 'margin-top: -4ex; margin-left: 8em;'
98

	
99
#
100
# return the string parameter without braces
101
#
102
def transformurls(str):
103
    return url_rex.sub(r'<a href="\1">\1</a>', str)
104

	
105
#
106
# return the string parameter without braces
107
#
108
def removebraces(str):
109
    return rembraces_rex.sub('', str)
110

	
111
#
112
# latex-specific replacements
113
# (do this after braces were removed)
114
#
115
def latexreplacements(line):
116
    line = string.replace(line, '~', '&nbsp;')
117
    line = string.replace(line, '\\\'a', '&aacute;')
118
    line = string.replace(line, '\\"a', '&auml;')
119
    line = string.replace(line, '\\\'e', '&eacute;')
120
    line = string.replace(line, '\\"e', '&euml;')
121
    line = string.replace(line, '\\\'i', '&iacute;')
122
    line = string.replace(line, '\\"i', '&iuml;')
123
    line = string.replace(line, '\\\'o', '&oacute;')
124
    line = string.replace(line, '\\"o', '&ouml;')
125
    line = string.replace(line, '\\\'u', '&uacute;')
126
    line = string.replace(line, '\\"u', '&uuml;')
127
    line = string.replace(line, '\\H o', '&otilde;')
128
    line = string.replace(line, '\\H u', '&uuml;')   # &utilde; does not exist
129
    line = string.replace(line, '\\\'A', '&Aacute;')
130
    line = string.replace(line, '\\"A', '&Auml;')
131
    line = string.replace(line, '\\\'E', '&Eacute;')
132
    line = string.replace(line, '\\"E', '&Euml;')
133
    line = string.replace(line, '\\\'I', '&Iacute;')
134
    line = string.replace(line, '\\"I', '&Iuml;')
135
    line = string.replace(line, '\\\'O', '&Oacute;')
136
    line = string.replace(line, '\\"O', '&Ouml;')
137
    line = string.replace(line, '\\\'U', '&Uacute;')
138
    line = string.replace(line, '\\"U', '&Uuml;')
139
    line = string.replace(line, '\\H O', '&Otilde;')
140
    line = string.replace(line, '\\H U', '&Uuml;')   # &Utilde; does not exist
141

	
142
    return line
143

	
144
#
145
# copy characters form a string decoding html expressions (&xyz;)
146
#
147
def copychars(str, ifrom, count):
148
    result = ''
149
    i = ifrom
150
    c = 0
151
    html_spec = False
152
    while (i < len(str)) and (c < count):
153
        if str[i] == '&':
154
            html_spec = True;
155
            if i+1 < len(str):
156
                result += str[i+1]
157
            c += 1
158
            i += 2
159
        else:
160
            if not html_spec:
161
                if ((str[i] >= 'A') and (str[i] <= 'Z')) or \
162
                   ((str[i] >= 'a') and (str[i] <= 'z')):
163
                    result += str[i]
164
                    c += 1
165
            elif str[i] == ';':
166
                html_spec = False;
167
            i += 1
168
    
169
    return result
170

	
171

	
172
# 
173
# Handle a list of authors (separated by 'and').
174
# It gives back an array of the follwing values:
175
#  - num: the number of authors,
176
#  - list: the list of the author names,
177
#  - text: the bibtex text (separated by commas and/or 'and')
178
#  - abbrev: abbreviation that can be used for indicate the
179
#    bibliography entries
180
#
181
def bibtexauthor(data):
182
    result = {}
183
    bibtex = ''
184
    result['list'] = author_rex.split(data)
185
    result['num'] = len(result['list'])
186
    for i, author in enumerate(result['list']):
187
        # general transformations
188
        author = latexreplacements(removebraces(author.strip()))
189
        # transform "Xyz, A. B." to "A. B. Xyz"
190
        pos = author.find(',')
191
        if pos != -1:
192
            author = author[pos+1:].strip() + ' ' + author[:pos].strip()
193
        result['list'][i] = author
194
        bibtex += author + '#'
195
    bibtex = bibtex[:-1]
196
    if result['num'] > 1:
197
        ix = bibtex.rfind('#')
198
        if result['num'] == 2:
199
            bibtex = bibtex[:ix] + ' and ' + bibtex[ix+1:]
200
        else:
201
            bibtex = bibtex[:ix] + ', and ' + bibtex[ix+1:]
202
    bibtex = bibtex.replace('#', ', ')
203
    result['text'] = bibtex
204
    
205
    result['abbrev'] = ''
206
    for author in result['list']:
207
        pos = author.rfind(' ') + 1
208
        count = 1
209
        if result['num'] == 1:
210
            count = 3
211
        result['abbrev'] += copychars(author, pos, count)
212

	
213
    return result
214

	
215

	
216
#
217
# data = title string
218
# @return the capitalized title (first letter is capitalized), rest are capitalized
219
# only if capitalized inside braces
220
#
221
def capitalizetitle(data):
222
    title_list = capitalize_rex.split(data)
223
    title = ''
224
    count = 0
225
    for phrase in title_list:
226
         check = string.lstrip(phrase)
227

	
228
         # keep phrase's capitalization the same
229
         if check.find('{') == 0:
230
              title += removebraces(phrase)
231
         else:
232
         # first word --> capitalize first letter (after spaces)
233
              if count == 0:
234
                  title += check.capitalize()
235
              else:
236
                  title += phrase.lower()
237
         count = count + 1
238

	
239
    return title
240

	
241

	
242
#
243
# @return the bibtex for the title
244
# @param data --> title string
245
# braces are removed from title
246
#
247
def bibtextitle(data, entrytype):
248
    if entrytype in ('book', 'inbook'):
249
        title = removebraces(data.strip())
250
    else:
251
        title = removebraces(capitalizetitle(data.strip()))
252
    bibtex = title
253
    return bibtex
254

	
255

	
256
#
257
# function to compare entry lists
258
#
259
def entry_cmp(x, y):
260
    return cmp(x[0], y[0])
261

	
262

	
263
#
264
# print the XML for the transformed "filecont_source"
265
#
266
def bibtexdecoder(filecont_source):
267
    filecont = []
268
    file = []
269
    
270
    # want @<alphanumeric chars><spaces>{<spaces><any chars>,
271
    pubtype_rex = re.compile('@(\w*)\s*{\s*(.*),')
272
    endtype_rex = re.compile('}\s*$')
273
    endtag_rex = re.compile('^\s*}\s*$')
274

	
275
    bracefield_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
276
    bracedata_rex = re.compile('\s*(\w*)\s*=\s*{(.*)},?')
277

	
278
    quotefield_rex = re.compile('\s*(\w*)\s*=\s*(.*)')
279
    quotedata_rex = re.compile('\s*(\w*)\s*=\s*"(.*)",?')
280

	
281
    for line in filecont_source:
282
        line = line[:-1]
283

	
284
        # encode character entities
285
        line = string.replace(line, '&', '&amp;')
286
        line = string.replace(line, '<', '&lt;')
287
        line = string.replace(line, '>', '&gt;')
288

	
289
        # start entry: publication type (store for later use)
290
        if pubtype_rex.match(line):
291
        # want @<alphanumeric chars><spaces>{<spaces><any chars>,
292
            entrycont = {}
293
            entry = []
294
            entrytype = pubtype_rex.sub('\g<1>',line)
295
            entrytype = string.lower(entrytype)
296
            entryid   = pubtype_rex.sub('\g<2>', line)
297

	
298
        # end entry if just a }
299
        elif endtype_rex.match(line):
300
            # generate doxygen code for the entry
301

	
302
            # enty type related formattings
303
            if entrytype in ('book', 'inbook'):
304
                entrycont['title'] = '<em>' + entrycont['title'] + '</em>'
305
                if not entrycont.has_key('author'):
306
                    entrycont['author'] = entrycont['editor']
307
                    entrycont['author']['text'] += ', editors'
308
            elif entrytype == 'article':
309
                entrycont['journal'] = '<em>' + entrycont['journal'] + '</em>'
310
            elif entrytype in ('inproceedings', 'incollection', 'conference'):
311
                entrycont['booktitle'] = '<em>' + entrycont['booktitle'] + '</em>'
312
            elif entrytype == 'techreport':
313
                if not entrycont.has_key('type'):
314
                    entrycont['type'] = 'Technical report'
315
            elif entrytype == 'mastersthesis':
316
                entrycont['type'] = 'Master\'s thesis'
317
            elif entrytype == 'phdthesis':
318
                entrycont['type'] = 'PhD thesis'
319

	
320
            for eline in entrycont:
321
                if eline != '':
322
                    eline = latexreplacements(eline)
323

	
324
            if entrycont.has_key('pages') and (entrycont['pages'] != ''):
325
                entrycont['pages'] = string.replace(entrycont['pages'], '--', '-')
326

	
327
            if entrycont.has_key('author') and (entrycont['author'] != ''):
328
                entry.append(entrycont['author']['text'] + '.')
329
            if entrycont.has_key('title') and (entrycont['title'] != ''):
330
                entry.append(entrycont['title'] + '.')
331
            if entrycont.has_key('journal') and (entrycont['journal'] != ''):
332
                entry.append(entrycont['journal'] + ',')
333
            if entrycont.has_key('booktitle') and (entrycont['booktitle'] != ''):
334
                entry.append('In ' + entrycont['booktitle'] + ',')
335
            if entrycont.has_key('type') and (entrycont['type'] != ''):
336
                eline = entrycont['type']
337
                if entrycont.has_key('number') and (entrycont['number'] != ''):
338
                    eline += ' ' + entrycont['number']
339
                eline += ','
340
                entry.append(eline)
341
            if entrycont.has_key('institution') and (entrycont['institution'] != ''):
342
                entry.append(entrycont['institution'] + ',')
343
            if entrycont.has_key('publisher') and (entrycont['publisher'] != ''):
344
                entry.append(entrycont['publisher'] + ',')
345
            if entrycont.has_key('school') and (entrycont['school'] != ''):
346
                entry.append(entrycont['school'] + ',')
347
            if entrycont.has_key('address') and (entrycont['address'] != ''):
348
                entry.append(entrycont['address'] + ',')
349
            if entrycont.has_key('edition') and (entrycont['edition'] != ''):
350
                entry.append(entrycont['edition'] + ' edition,')
351
            if entrycont.has_key('howpublished') and (entrycont['howpublished'] != ''):
352
                entry.append(entrycont['howpublished'] + ',')
353
            if entrycont.has_key('volume') and (entrycont['volume'] != ''):
354
                eline = entrycont['volume'];
355
                if entrycont.has_key('number') and (entrycont['number'] != ''):
356
                    eline += '(' + entrycont['number'] + ')'
357
                if entrycont.has_key('pages') and (entrycont['pages'] != ''):
358
                    eline += ':' + entrycont['pages']
359
                eline += ','
360
                entry.append(eline)
361
            else:
362
                if entrycont.has_key('pages') and (entrycont['pages'] != ''):
363
                    entry.append('pages ' + entrycont['pages'] + ',')
364
            if entrycont.has_key('year') and (entrycont['year'] != ''):
365
                if entrycont.has_key('month') and (entrycont['month'] != ''):
366
                    entry.append(entrycont['month'] + ' ' + entrycont['year'] + '.')
367
                else:
368
                    entry.append(entrycont['year'] + '.')
369
            if entrycont.has_key('note') and (entrycont['note'] != ''):
370
                entry.append(entrycont['note'] + '.')
371
            if entrycont.has_key('url') and (entrycont['url'] != ''):
372
                entry.append(entrycont['url'] + '.')
373

	
374
            # generate keys for sorting and for the output
375
            sortkey = ''
376
            bibkey = ''
377
            if entrycont.has_key('author'):
378
                for author in entrycont['author']['list']:
379
                    sortkey += copychars(author, author.rfind(' ')+1, len(author))
380
                bibkey = entrycont['author']['abbrev']
381
            else:
382
                bibkey = 'x'
383
            if entrycont.has_key('year'):
384
                sortkey += entrycont['year']
385
                bibkey += entrycont['year'][-2:]
386
            if entrycont.has_key('title'):
387
                sortkey += entrycont['title']
388
            if entrycont.has_key('key'):
389
                sortkey = entrycont['key'] + sortkey
390
                bibkey = entrycont['key']
391
            entry.insert(0, sortkey)
392
            entry.insert(1, bibkey)
393
            entry.insert(2, entryid)
394
           
395
            # add the entry to the file contents
396
            filecont.append(entry)
397

	
398
        else:
399
            # field, publication info
400
            field = ''
401
            data = ''
402
            
403
            # field = {data} entries
404
            if bracedata_rex.match(line):
405
                field = bracefield_rex.sub('\g<1>', line)
406
                field = string.lower(field)
407
                data =  bracedata_rex.sub('\g<2>', line)
408

	
409
            # field = "data" entries
410
            elif quotedata_rex.match(line):
411
                field = quotefield_rex.sub('\g<1>', line)
412
                field = string.lower(field)
413
                data =  quotedata_rex.sub('\g<2>', line)
414

	
415
            # field = data entries
416
            elif data_rex.match(line):
417
                field = field_rex.sub('\g<1>', line)
418
                field = string.lower(field)
419
                data =  data_rex.sub('\g<2>', line)
420

	
421
            if field == 'url':
422
                data = '\\url{' + data.strip() + '}'
423
            
424
            if field in ('author', 'editor'):
425
                entrycont[field] = bibtexauthor(data)
426
                line = ''
427
            elif field == 'title':
428
                line = bibtextitle(data, entrytype)
429
            elif field != '':
430
                line = removebraces(transformurls(data.strip()))
431

	
432
            if line != '':
433
                line = latexreplacements(line)
434
                entrycont[field] = line
435

	
436

	
437
    # sort entries
438
    filecont.sort(entry_cmp)
439
    
440
    # count the bibtex keys
441
    keytable = {}
442
    counttable = {}
443
    for entry in filecont:
444
        bibkey = entry[1]
445
        if not keytable.has_key(bibkey):
446
            keytable[bibkey] = 1
447
        else:
448
            keytable[bibkey] += 1
449

	
450
    for bibkey in keytable.keys():
451
        counttable[bibkey] = 0
452
    
453
    # generate output
454
    for entry in filecont:
455
        # generate output key form the bibtex key
456
        bibkey = entry[1]
457
        entryid = entry[2]
458
        if keytable[bibkey] == 1:
459
            outkey = bibkey
460
        else:
461
            outkey = bibkey + chr(97 + counttable[bibkey])
462
        counttable[bibkey] += 1
463
        
464
        # append the entry code to the output
465
        file.append('\\section ' + entryid + ' [' + outkey + ']')
466
        file.append('<div style="' + divstyle + '">')
467
        for line in entry[3:]:
468
            file.append(line)
469
        file.append('</div>')
470
        file.append('')
471

	
472
    return file
473

	
474

	
475
#
476
# return 1 iff abbr is in line but not inside braces or quotes
477
# assumes that abbr appears only once on the line (out of braces and quotes)
478
#
479
def verify_out_of_braces(line, abbr):
480

	
481
    phrase_split = delimiter_rex.split(line)
482

	
483
    abbr_rex = re.compile( '\\b' + abbr + '\\b', re.I)
484

	
485
    open_brace = 0
486
    open_quote = 0
487

	
488
    for phrase in phrase_split:
489
        if phrase == "{":
490
            open_brace = open_brace + 1
491
        elif phrase == "}":
492
            open_brace = open_brace - 1
493
        elif phrase == '"':
494
            if open_quote == 1:
495
                open_quote = 0
496
            else:
497
                open_quote = 1
498
        elif abbr_rex.search(phrase):
499
            if open_brace == 0 and open_quote == 0:
500
                return 1
501

	
502
    return 0
503

	
504

	
505
#
506
# a line in the form phrase1 # phrase2 # ... # phrasen
507
# is returned as phrase1 phrase2 ... phrasen
508
# with the correct punctuation
509
# Bug: Doesn't always work with multiple abbreviations plugged in
510
#
511
def concat_line(line):
512
    # only look at part after equals
513
    field = field_rex.sub('\g<1>',line)
514
    rest = field_rex.sub('\g<2>',line)
515

	
516
    concat_line = field + ' ='
517

	
518
    pound_split = concatsplit_rex.split(rest)
519

	
520
    phrase_count = 0
521
    length = len(pound_split)
522

	
523
    for phrase in pound_split:
524
        phrase = phrase.strip()
525
        if phrase_count != 0:
526
            if phrase.startswith('"') or phrase.startswith('{'):
527
                phrase = phrase[1:]
528
        elif phrase.startswith('"'):
529
            phrase = phrase.replace('"','{',1)
530

	
531
        if phrase_count != length-1:
532
            if phrase.endswith('"') or phrase.endswith('}'):
533
                phrase = phrase[:-1]
534
        else:
535
            if phrase.endswith('"'):
536
                phrase = phrase[:-1]
537
                phrase = phrase + "}"
538
            elif phrase.endswith('",'):
539
                phrase = phrase[:-2]
540
                phrase = phrase + "},"
541

	
542
        # if phrase did have \#, add the \# back
543
        if phrase.endswith('\\'):
544
            phrase = phrase + "#"
545
        concat_line = concat_line + ' ' + phrase
546

	
547
        phrase_count = phrase_count + 1
548

	
549
    return concat_line
550

	
551

	
552
#
553
# substitute abbreviations into filecont
554
# @param filecont_source - string of data from file
555
#
556
def bibtex_replace_abbreviations(filecont_source):
557
    filecont = filecont_source.splitlines()
558

	
559
    #  These are defined in bibtex, so we'll define them too
560
    abbr_list = ['jan','feb','mar','apr','may','jun',
561
                 'jul','aug','sep','oct','nov','dec']
562
    value_list = ['January','February','March','April',
563
                  'May','June','July','August','September',
564
                  'October','November','December']
565

	
566
    abbr_rex = []
567
    total_abbr_count = 0
568

	
569
    front = '\\b'
570
    back = '(,?)\\b'
571

	
572
    for x in abbr_list:
573
        abbr_rex.append( re.compile( front + abbr_list[total_abbr_count] + back, re.I ) )
574
        total_abbr_count = total_abbr_count + 1
575

	
576

	
577
    abbrdef_rex = re.compile('\s*@string\s*{\s*('+ valid_name_chars +'*)\s*=(.*)',
578
                             re.I)
579

	
580
    comment_rex = re.compile('@comment\s*{',re.I)
581
    preamble_rex = re.compile('@preamble\s*{',re.I)
582

	
583
    waiting_for_end_string = 0
584
    i = 0
585
    filecont2 = ''
586

	
587
    for line in filecont:
588
        if line == ' ' or line == '':
589
            continue
590

	
591
        if waiting_for_end_string:
592
            if re.search('}',line):
593
                waiting_for_end_string = 0
594
                continue
595

	
596
        if abbrdef_rex.search(line):
597
            abbr = abbrdef_rex.sub('\g<1>', line)
598

	
599
            if abbr_list.count(abbr) == 0:
600
                val = abbrdef_rex.sub('\g<2>', line)
601
                abbr_list.append(abbr)
602
                value_list.append(string.strip(val))
603
                abbr_rex.append( re.compile( front + abbr_list[total_abbr_count] + back, re.I ) )
604
                total_abbr_count = total_abbr_count + 1
605
            waiting_for_end_string = 1
606
            continue
607

	
608
        if comment_rex.search(line):
609
            waiting_for_end_string = 1
610
            continue
611

	
612
        if preamble_rex.search(line):
613
            waiting_for_end_string = 1
614
            continue
615

	
616

	
617
        # replace subsequent abbreviations with the value
618
        abbr_count = 0
619

	
620
        for x in abbr_list:
621

	
622
            if abbr_rex[abbr_count].search(line):
623
                if verify_out_of_braces(line,abbr_list[abbr_count]) == 1:
624
                    line = abbr_rex[abbr_count].sub( value_list[abbr_count] + '\g<1>', line)
625
                # Check for # concatenations
626
                if concatsplit_rex.search(line):
627
                    line = concat_line(line)
628
            abbr_count = abbr_count + 1
629

	
630

	
631
        filecont2 = filecont2 + line + '\n'
632
        i = i+1
633

	
634

	
635
    # Do one final pass over file
636

	
637
    # make sure that didn't end up with {" or }" after the substitution
638
    filecont2 = filecont2.replace('{"','{{')
639
    filecont2 = filecont2.replace('"}','}}')
640

	
641
    afterquotevalue_rex = re.compile('"\s*,\s*')
642
    afterbrace_rex = re.compile('"\s*}')
643
    afterbracevalue_rex = re.compile('(=\s*{[^=]*)},\s*')
644

	
645
    # add new lines to data that changed because of abbreviation substitutions
646
    filecont2 = afterquotevalue_rex.sub('",\n', filecont2)
647
    filecont2 = afterbrace_rex.sub('"\n}', filecont2)
648
    filecont2 = afterbracevalue_rex.sub('\g<1>},\n', filecont2)
649

	
650
    return filecont2
651

	
652
#
653
# convert @type( ... ) to @type{ ... }
654
#
655
def no_outer_parens(filecont):
656

	
657
    # do checking for open parens
658
    # will convert to braces
659
    paren_split = re.split('([(){}])',filecont)
660

	
661
    open_paren_count = 0
662
    open_type = 0
663
    look_next = 0
664

	
665
    # rebuild filecont
666
    filecont = ''
667

	
668
    at_rex = re.compile('@\w*')
669

	
670
    for phrase in paren_split:
671
        if look_next == 1:
672
            if phrase == '(':
673
                phrase = '{'
674
                open_paren_count = open_paren_count + 1
675
            else:
676
                open_type = 0
677
            look_next = 0
678

	
679
        if phrase == '(':
680
            open_paren_count = open_paren_count + 1
681

	
682
        elif phrase == ')':
683
            open_paren_count = open_paren_count - 1
684
            if open_type == 1 and open_paren_count == 0:
685
                phrase = '}'
686
                open_type = 0
687

	
688
        elif at_rex.search( phrase ):
689
            open_type = 1
690
            look_next = 1
691

	
692
        filecont = filecont + phrase
693

	
694
    return filecont
695

	
696

	
697
#
698
# make all whitespace into just one space
699
# format the bibtex file into a usable form.
700
#
701
def bibtexwasher(filecont_source):
702

	
703
    space_rex = re.compile('\s+')
704
    comment_rex = re.compile('\s*%')
705

	
706
    filecont = []
707

	
708
    # remove trailing and excessive whitespace
709
    # ignore comments
710
    for line in filecont_source:
711
        line = string.strip(line)
712
        line = space_rex.sub(' ', line)
713
        # ignore comments
714
        if not comment_rex.match(line) and line != '':
715
            filecont.append(' '+ line)
716

	
717
    filecont = string.join(filecont, '')
718

	
719
    # the file is in one long string
720

	
721
    filecont = no_outer_parens(filecont)
722

	
723
    #
724
    # split lines according to preferred syntax scheme
725
    #
726
    filecont = re.sub('(=\s*{[^=]*)},', '\g<1>},\n', filecont)
727

	
728
    # add new lines after commas that are after values
729
    filecont = re.sub('"\s*,', '",\n', filecont)
730
    filecont = re.sub('=\s*([\w\d]+)\s*,', '= \g<1>,\n', filecont)
731
    filecont = re.sub('(@\w*)\s*({(\s*)[^,\s]*)\s*,',
732
                          '\n\n\g<1>\g<2>,\n', filecont)
733

	
734
    # add new lines after }
735
    filecont = re.sub('"\s*}','"\n}\n', filecont)
736
    filecont = re.sub('}\s*,','},\n', filecont)
737

	
738

	
739
    filecont = re.sub('@(\w*)', '\n@\g<1>', filecont)
740

	
741
    # character encoding, reserved latex characters
742
    filecont = re.sub('{\\\&}', '&', filecont)
743
    filecont = re.sub('\\\&', '&', filecont)
744

	
745
    # do checking for open braces to get format correct
746
    open_brace_count = 0
747
    brace_split = re.split('([{}])',filecont)
748

	
749
    # rebuild filecont
750
    filecont = ''
751

	
752
    for phrase in brace_split:
753
        if phrase == '{':
754
            open_brace_count = open_brace_count + 1
755
        elif phrase == '}':
756
            open_brace_count = open_brace_count - 1
757
            if open_brace_count == 0:
758
                filecont = filecont + '\n'
759

	
760
        filecont = filecont + phrase
761

	
762
    filecont2 = bibtex_replace_abbreviations(filecont)
763

	
764
    # gather
765
    filecont = filecont2.splitlines()
766
    i=0
767
    j=0         # count the number of blank lines
768
    for line in filecont:
769
        # ignore blank lines
770
        if line == '' or line == ' ':
771
            j = j+1
772
            continue
773
        filecont[i] = line + '\n'
774
        i = i+1
775

	
776
    # get rid of the extra stuff at the end of the array
777
    # (The extra stuff are duplicates that are in the array because
778
    # blank lines were removed.)
779
    length = len( filecont)
780
    filecont[length-j:length] = []
781

	
782
    return filecont
783

	
784

	
785
def filehandler(filepath):
786
    try:
787
        fd = open(filepath, 'r')
788
        filecont_source = fd.readlines()
789
        fd.close()
790
    except:
791
        print 'Could not open file:', filepath
792
    washeddata = bibtexwasher(filecont_source)
793
    outdata = bibtexdecoder(washeddata)
794
    print '/**'
795
    print '\page references References'
796
    print
797
    for line in outdata:
798
        print line
799
    print '*/'
800

	
801

	
802
# main program
803

	
804
def main():
805
    import sys
806
    if sys.argv[1:]:
807
        filepath = sys.argv[1]
808
    else:
809
        print "No input file"
810
        sys.exit()
811
    filehandler(filepath)
812

	
813
if __name__ == "__main__": main()
814

	
815

	
816
# end python script
Ignore white space 6 line context
1
#!/bin/bash
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
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
if [ ! -f ~/.lemon-bootstrap ]; then
19
    echo 'Create ~/.lemon-bootstrap'.
20
    cat >~/.lemon-bootstrap <<EOF
21
#
22
# Default settings for bootstraping the LEMON source code repository
23
#
24
EOF
25
fi
26

	
27
source ~/.lemon-bootstrap
28
if [ -f ../../../.lemon-bootstrap ]; then source ../../../.lemon-bootstrap; fi
29
if [ -f ../../.lemon-bootstrap ]; then source ../../.lemon-bootstrap; fi
30
if [ -f ../.lemon-bootstrap ]; then source ../.lemon-bootstrap; fi
31
if [ -f ./.lemon-bootstrap ]; then source ./.lemon-bootstrap; fi
32

	
33

	
34
function augment_config() { 
35
    if [ "x${!1}" == "x" ]; then
36
        eval $1=$2
37
        echo Add "'$1'" to '~/.lemon-bootstrap'.
38
        echo >>~/.lemon-bootstrap
39
        echo $3 >>~/.lemon-bootstrap
40
        echo $1=$2 >>~/.lemon-bootstrap
41
    fi
42
}
43

	
44
augment_config LEMON_INSTALL_PREFIX /usr/local \
45
    "# LEMON installation prefix"
46

	
47
augment_config GLPK_PREFIX /usr/local/ \
48
    "# GLPK installation root prefix"
49

	
50
augment_config COIN_OR_PREFIX /usr/local/coin-or \
51
    "# COIN-OR installation root prefix (used for CLP/CBC)"
52

	
53
augment_config SOPLEX_PREFIX /usr/local/soplex \
54
    "# Soplex build prefix"
55

	
56

	
57
function ask() {
58
echo -n "$1 [$2]? "
59
read _an
60
if [ "x$_an" == "x" ]; then
61
    ret="$2"
62
else
63
    ret=$_an
64
fi
65
}
66

	
67
function yesorno() {
68
    ret='rossz'
69
    while [ "$ret" != "y" -a "$ret" != "n" -a "$ret" != "yes" -a "$ret" != "no" ]; do
70
        ask "$1" "$2"
71
    done
72
    if [ "$ret" != "y" -a "$ret" != "yes" ]; then
73
        return 1
74
    else
75
        return 0
76
    fi
77
}
78

	
79
if yesorno "External build" "n"
80
then
81
    CONFIGURE_PATH=".."
82
else
83
    CONFIGURE_PATH="."
84
    if yesorno "Autoreconf" "y"
85
    then
86
        AUTORE=yes
87
    else
88
        AUTORE=no
89
    fi
90
fi
91

	
92
if yesorno "Optimize" "n" 
93
then
94
    opt_flags=' -O2'
95
else
96
    opt_flags=''
97
fi
98

	
99
if yesorno "Stop on warning" "y" 
100
then
101
    werror_flags=' -Werror'
102
else
103
    werror_flags=''
104
fi
105

	
106
cxx_flags="CXXFLAGS=-ggdb$opt_flags$werror_flags"
107

	
108
if yesorno "Check with valgrind" "n" 
109
then
110
    valgrind_flags=' --enable-valgrind'
111
else
112
    valgrind_flags=''
113
fi
114

	
115
if [ -f ${GLPK_PREFIX}/include/glpk.h ]; then
116
    if yesorno "Use GLPK" "y"
117
    then
118
        glpk_flag="--with-glpk=$GLPK_PREFIX"
119
    else
120
        glpk_flag="--without-glpk"
121
    fi
122
else
123
    glpk_flag="--without-glpk"        
124
fi
125

	
126
if [ -f ${COIN_OR_PREFIX}/include/coin/config_coinutils.h ]; then
127
    if yesorno "Use COIN-OR (CBC/CLP)" "n"
128
    then
129
        coin_flag="--with-coin=$COIN_OR_PREFIX"
130
    else
131
        coin_flag="--without-coin"
132
    fi
133
else
134
    coin_flag="--without-coin"        
135
fi
136

	
137
if [ -f ${SOPLEX_PREFIX}/src/soplex.h ]; then
138
    if yesorno "Use Soplex" "n"
139
    then
140
        soplex_flag="--with-soplex=$SOPLEX_PREFIX"
141
    else
142
        soplex_flag="--without-soplex"
143
    fi
144
else
145
    soplex_flag="--without-soplex"
146
fi
147

	
148
if [ "x$AUTORE" == "xyes" ]; then
149
    autoreconf -vif;
150
fi
151
${CONFIGURE_PATH}/configure --prefix=$LEMON_INSTALL_PREFIX \
152
$valgrind_flags \
153
"$cxx_flags" \
154
$glpk_flag \
155
$coin_flag \
156
$soplex_flag \
157
$*
Ignore white space 6 line context
1
#!/bin/sh
2

	
3
# Run in valgrind, with leak checking enabled
4

	
5
valgrind -q --leak-check=full "$@" 2> .valgrind-log
6

	
7
# Save the test result
8

	
9
result="$?"
10

	
11
# Valgrind should generate no error messages
12

	
13
log_contents="`cat .valgrind-log`"
14

	
15
if [ "$log_contents" != "" ]; then
16
        cat .valgrind-log >&2
17
        result=1
18
fi
19

	
20
rm -f .valgrind-log
21

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

	
19
#include <lemon/concepts/digraph.h>
20
#include <lemon/smart_graph.h>
21
#include <lemon/list_graph.h>
22
#include <lemon/lgf_reader.h>
23
#include <lemon/bellman_ford.h>
24
#include <lemon/path.h>
25

	
26
#include "graph_test.h"
27
#include "test_tools.h"
28

	
29
using namespace lemon;
30

	
31
char test_lgf[] =
32
  "@nodes\n"
33
  "label\n"
34
  "0\n"
35
  "1\n"
36
  "2\n"
37
  "3\n"
38
  "4\n"
39
  "@arcs\n"
40
  "    length\n"
41
  "0 1 3\n"
42
  "1 2 -3\n"
43
  "1 2 -5\n"
44
  "1 3 -2\n"
45
  "0 2 -1\n"
46
  "1 2 -4\n"
47
  "0 3 2\n"
48
  "4 2 -5\n"
49
  "2 3 1\n"
50
  "@attributes\n"
51
  "source 0\n"
52
  "target 3\n";
53

	
54

	
55
void checkBellmanFordCompile()
56
{
57
  typedef int Value;
58
  typedef concepts::Digraph Digraph;
59
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
60
  typedef BellmanFord<Digraph, LengthMap> BF;
61
  typedef Digraph::Node Node;
62
  typedef Digraph::Arc Arc;
63

	
64
  Digraph gr;
65
  Node s, t, n;
66
  Arc e;
67
  Value l;
68
  int k=3;
69
  bool b;
70
  BF::DistMap d(gr);
71
  BF::PredMap p(gr);
72
  LengthMap length;
73
  concepts::Path<Digraph> pp;
74

	
75
  {
76
    BF bf_test(gr,length);
77
    const BF& const_bf_test = bf_test;
78

	
79
    bf_test.run(s);
80
    bf_test.run(s,k);
81

	
82
    bf_test.init();
83
    bf_test.addSource(s);
84
    bf_test.addSource(s, 1);
85
    b = bf_test.processNextRound();
86
    b = bf_test.processNextWeakRound();
87

	
88
    bf_test.start();
89
    bf_test.checkedStart();
90
    bf_test.limitedStart(k);
91

	
92
    l  = const_bf_test.dist(t);
93
    e  = const_bf_test.predArc(t);
94
    s  = const_bf_test.predNode(t);
95
    b  = const_bf_test.reached(t);
96
    d  = const_bf_test.distMap();
97
    p  = const_bf_test.predMap();
98
    pp = const_bf_test.path(t);
99
    pp = const_bf_test.negativeCycle();
100

	
101
    for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {}
102
  }
103
  {
104
    BF::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
105
      ::SetDistMap<concepts::ReadWriteMap<Node,Value> >
106
      ::SetOperationTraits<BellmanFordDefaultOperationTraits<Value> >
107
      ::SetOperationTraits<BellmanFordToleranceOperationTraits<Value, 0> >
108
      ::Create bf_test(gr,length);
109

	
110
    LengthMap length_map;
111
    concepts::ReadWriteMap<Node,Arc> pred_map;
112
    concepts::ReadWriteMap<Node,Value> dist_map;
113

	
114
    bf_test
115
      .lengthMap(length_map)
116
      .predMap(pred_map)
117
      .distMap(dist_map);
118

	
119
    bf_test.run(s);
120
    bf_test.run(s,k);
121

	
122
    bf_test.init();
123
    bf_test.addSource(s);
124
    bf_test.addSource(s, 1);
125
    b = bf_test.processNextRound();
126
    b = bf_test.processNextWeakRound();
127

	
128
    bf_test.start();
129
    bf_test.checkedStart();
130
    bf_test.limitedStart(k);
131

	
132
    l  = bf_test.dist(t);
133
    e  = bf_test.predArc(t);
134
    s  = bf_test.predNode(t);
135
    b  = bf_test.reached(t);
136
    pp = bf_test.path(t);
137
    pp = bf_test.negativeCycle();
138
  }
139
}
140

	
141
void checkBellmanFordFunctionCompile()
142
{
143
  typedef int Value;
144
  typedef concepts::Digraph Digraph;
145
  typedef Digraph::Arc Arc;
146
  typedef Digraph::Node Node;
147
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
148

	
149
  Digraph g;
150
  bool b;
151
  bellmanFord(g,LengthMap()).run(Node());
152
  b = bellmanFord(g,LengthMap()).run(Node(),Node());
153
  bellmanFord(g,LengthMap())
154
    .predMap(concepts::ReadWriteMap<Node,Arc>())
155
    .distMap(concepts::ReadWriteMap<Node,Value>())
156
    .run(Node());
157
  b=bellmanFord(g,LengthMap())
158
    .predMap(concepts::ReadWriteMap<Node,Arc>())
159
    .distMap(concepts::ReadWriteMap<Node,Value>())
160
    .path(concepts::Path<Digraph>())
161
    .dist(Value())
162
    .run(Node(),Node());
163
}
164

	
165

	
166
template <typename Digraph, typename Value>
167
void checkBellmanFord() {
168
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
169
  typedef typename Digraph::template ArcMap<Value> LengthMap;
170

	
171
  Digraph gr;
172
  Node s, t;
173
  LengthMap length(gr);
174

	
175
  std::istringstream input(test_lgf);
176
  digraphReader(gr, input).
177
    arcMap("length", length).
178
    node("source", s).
179
    node("target", t).
180
    run();
181

	
182
  BellmanFord<Digraph, LengthMap>
183
    bf(gr, length);
184
  bf.run(s);
185
  Path<Digraph> p = bf.path(t);
186

	
187
  check(bf.reached(t) && bf.dist(t) == -1, "Bellman-Ford found a wrong path.");
188
  check(p.length() == 3, "path() found a wrong path.");
189
  check(checkPath(gr, p), "path() found a wrong path.");
190
  check(pathSource(gr, p) == s, "path() found a wrong path.");
191
  check(pathTarget(gr, p) == t, "path() found a wrong path.");
192

	
193
  ListPath<Digraph> path;
194
  Value dist;
195
  bool reached = bellmanFord(gr,length).path(path).dist(dist).run(s,t);
196

	
197
  check(reached && dist == -1, "Bellman-Ford found a wrong path.");
198
  check(path.length() == 3, "path() found a wrong path.");
199
  check(checkPath(gr, path), "path() found a wrong path.");
200
  check(pathSource(gr, path) == s, "path() found a wrong path.");
201
  check(pathTarget(gr, path) == t, "path() found a wrong path.");
202

	
203
  for(ArcIt e(gr); e!=INVALID; ++e) {
204
    Node u=gr.source(e);
205
    Node v=gr.target(e);
206
    check(!bf.reached(u) || (bf.dist(v) - bf.dist(u) <= length[e]),
207
          "Wrong output. dist(target)-dist(source)-arc_length=" <<
208
          bf.dist(v) - bf.dist(u) - length[e]);
209
  }
210

	
211
  for(NodeIt v(gr); v!=INVALID; ++v) {
212
    if (bf.reached(v)) {
213
      check(v==s || bf.predArc(v)!=INVALID, "Wrong tree.");
214
      if (bf.predArc(v)!=INVALID ) {
215
        Arc e=bf.predArc(v);
216
        Node u=gr.source(e);
217
        check(u==bf.predNode(v),"Wrong tree.");
218
        check(bf.dist(v) - bf.dist(u) == length[e],
219
              "Wrong distance! Difference: " <<
220
              bf.dist(v) - bf.dist(u) - length[e]);
221
      }
222
    }
223
  }
224
}
225

	
226
void checkBellmanFordNegativeCycle() {
227
  DIGRAPH_TYPEDEFS(SmartDigraph);
228

	
229
  SmartDigraph gr;
230
  IntArcMap length(gr);
231

	
232
  Node n1 = gr.addNode();
233
  Node n2 = gr.addNode();
234
  Node n3 = gr.addNode();
235
  Node n4 = gr.addNode();
236

	
237
  Arc a1 = gr.addArc(n1, n2);
238
  Arc a2 = gr.addArc(n2, n2);
239

	
240
  length[a1] = 2;
241
  length[a2] = -1;
242

	
243
  {
244
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
245
    bf.run(n1);
246
    StaticPath<SmartDigraph> p = bf.negativeCycle();
247
    check(p.length() == 1 && p.front() == p.back() && p.front() == a2,
248
          "Wrong negative cycle.");
249
  }
250

	
251
  length[a2] = 0;
252

	
253
  {
254
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
255
    bf.run(n1);
256
    check(bf.negativeCycle().empty(),
257
          "Negative cycle should not be found.");
258
  }
259

	
260
  length[gr.addArc(n1, n3)] = 5;
261
  length[gr.addArc(n4, n3)] = 1;
262
  length[gr.addArc(n2, n4)] = 2;
263
  length[gr.addArc(n3, n2)] = -4;
264

	
265
  {
266
    BellmanFord<SmartDigraph, IntArcMap> bf(gr, length);
267
    bf.init();
268
    bf.addSource(n1);
269
    for (int i = 0; i < 4; ++i) {
270
      check(bf.negativeCycle().empty(),
271
            "Negative cycle should not be found.");
272
      bf.processNextRound();
273
    }
274
    StaticPath<SmartDigraph> p = bf.negativeCycle();
275
    check(p.length() == 3, "Wrong negative cycle.");
276
    check(length[p.nth(0)] + length[p.nth(1)] + length[p.nth(2)] == -1,
277
          "Wrong negative cycle.");
278
  }
279
}
280

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

	
19
#include <iostream>
20
#include <sstream>
21
#include <vector>
22
#include <queue>
23
#include <cstdlib>
24

	
25
#include <lemon/fractional_matching.h>
26
#include <lemon/smart_graph.h>
27
#include <lemon/concepts/graph.h>
28
#include <lemon/concepts/maps.h>
29
#include <lemon/lgf_reader.h>
30
#include <lemon/math.h>
31

	
32
#include "test_tools.h"
33

	
34
using namespace std;
35
using namespace lemon;
36

	
37
GRAPH_TYPEDEFS(SmartGraph);
38

	
39

	
40
const int lgfn = 4;
41
const std::string lgf[lgfn] = {
42
  "@nodes\n"
43
  "label\n"
44
  "0\n"
45
  "1\n"
46
  "2\n"
47
  "3\n"
48
  "4\n"
49
  "5\n"
50
  "6\n"
51
  "7\n"
52
  "@edges\n"
53
  "     label  weight\n"
54
  "7 4  0      984\n"
55
  "0 7  1      73\n"
56
  "7 1  2      204\n"
57
  "2 3  3      583\n"
58
  "2 7  4      565\n"
59
  "2 1  5      582\n"
60
  "0 4  6      551\n"
61
  "2 5  7      385\n"
62
  "1 5  8      561\n"
63
  "5 3  9      484\n"
64
  "7 5  10     904\n"
65
  "3 6  11     47\n"
66
  "7 6  12     888\n"
67
  "3 0  13     747\n"
68
  "6 1  14     310\n",
69

	
70
  "@nodes\n"
71
  "label\n"
72
  "0\n"
73
  "1\n"
74
  "2\n"
75
  "3\n"
76
  "4\n"
77
  "5\n"
78
  "6\n"
79
  "7\n"
80
  "@edges\n"
81
  "     label  weight\n"
82
  "2 5  0      710\n"
83
  "0 5  1      241\n"
84
  "2 4  2      856\n"
85
  "2 6  3      762\n"
86
  "4 1  4      747\n"
87
  "6 1  5      962\n"
88
  "4 7  6      723\n"
89
  "1 7  7      661\n"
90
  "2 3  8      376\n"
91
  "1 0  9      416\n"
92
  "6 7  10     391\n",
93

	
94
  "@nodes\n"
95
  "label\n"
96
  "0\n"
97
  "1\n"
98
  "2\n"
99
  "3\n"
100
  "4\n"
101
  "5\n"
102
  "6\n"
103
  "7\n"
104
  "@edges\n"
105
  "     label  weight\n"
106
  "6 2  0      553\n"
107
  "0 7  1      653\n"
108
  "6 3  2      22\n"
109
  "4 7  3      846\n"
110
  "7 2  4      981\n"
111
  "7 6  5      250\n"
112
  "5 2  6      539\n",
113

	
114
  "@nodes\n"
115
  "label\n"
116
  "0\n"
117
  "@edges\n"
118
  "     label  weight\n"
119
  "0 0  0      100\n"
120
};
121

	
122
void checkMaxFractionalMatchingCompile()
123
{
124
  typedef concepts::Graph Graph;
125
  typedef Graph::Node Node;
126
  typedef Graph::Edge Edge;
127

	
128
  Graph g;
129
  Node n;
130
  Edge e;
131

	
132
  MaxFractionalMatching<Graph> mat_test(g);
133
  const MaxFractionalMatching<Graph>&
134
    const_mat_test = mat_test;
135

	
136
  mat_test.init();
137
  mat_test.start();
138
  mat_test.start(true);
139
  mat_test.startPerfect();
140
  mat_test.startPerfect(true);
141
  mat_test.run();
142
  mat_test.run(true);
143
  mat_test.runPerfect();
144
  mat_test.runPerfect(true);
145

	
146
  const_mat_test.matchingSize();
147
  const_mat_test.matching(e);
148
  const_mat_test.matching(n);
149
  const MaxFractionalMatching<Graph>::MatchingMap& mmap =
150
    const_mat_test.matchingMap();
151
  e = mmap[n];
152

	
153
  const_mat_test.barrier(n);
154
}
155

	
156
void checkMaxWeightedFractionalMatchingCompile()
157
{
158
  typedef concepts::Graph Graph;
159
  typedef Graph::Node Node;
160
  typedef Graph::Edge Edge;
161
  typedef Graph::EdgeMap<int> WeightMap;
162

	
163
  Graph g;
164
  Node n;
165
  Edge e;
166
  WeightMap w(g);
167

	
168
  MaxWeightedFractionalMatching<Graph> mat_test(g, w);
169
  const MaxWeightedFractionalMatching<Graph>&
170
    const_mat_test = mat_test;
171

	
172
  mat_test.init();
173
  mat_test.start();
174
  mat_test.run();
175

	
176
  const_mat_test.matchingWeight();
177
  const_mat_test.matchingSize();
178
  const_mat_test.matching(e);
179
  const_mat_test.matching(n);
180
  const MaxWeightedFractionalMatching<Graph>::MatchingMap& mmap =
181
    const_mat_test.matchingMap();
182
  e = mmap[n];
183

	
184
  const_mat_test.dualValue();
185
  const_mat_test.nodeValue(n);
186
}
187

	
188
void checkMaxWeightedPerfectFractionalMatchingCompile()
189
{
190
  typedef concepts::Graph Graph;
191
  typedef Graph::Node Node;
192
  typedef Graph::Edge Edge;
193
  typedef Graph::EdgeMap<int> WeightMap;
194

	
195
  Graph g;
196
  Node n;
197
  Edge e;
198
  WeightMap w(g);
199

	
200
  MaxWeightedPerfectFractionalMatching<Graph> mat_test(g, w);
201
  const MaxWeightedPerfectFractionalMatching<Graph>&
202
    const_mat_test = mat_test;
203

	
204
  mat_test.init();
205
  mat_test.start();
206
  mat_test.run();
207

	
208
  const_mat_test.matchingWeight();
209
  const_mat_test.matching(e);
210
  const_mat_test.matching(n);
211
  const MaxWeightedPerfectFractionalMatching<Graph>::MatchingMap& mmap =
212
    const_mat_test.matchingMap();
213
  e = mmap[n];
214

	
215
  const_mat_test.dualValue();
216
  const_mat_test.nodeValue(n);
217
}
218

	
219
void checkFractionalMatching(const SmartGraph& graph,
220
                             const MaxFractionalMatching<SmartGraph>& mfm,
221
                             bool allow_loops = true) {
222
  int pv = 0;
223
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
224
    int indeg = 0;
225
    for (InArcIt a(graph, n); a != INVALID; ++a) {
226
      if (mfm.matching(graph.source(a)) == a) {
227
        ++indeg;
228
      }
229
    }
230
    if (mfm.matching(n) != INVALID) {
231
      check(indeg == 1, "Invalid matching");
232
      ++pv;
233
    } else {
234
      check(indeg == 0, "Invalid matching");
235
    }
236
  }
237
  check(pv == mfm.matchingSize(), "Wrong matching size");
238

	
239
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
240
    check((e == mfm.matching(graph.u(e)) ? 1 : 0) +
241
          (e == mfm.matching(graph.v(e)) ? 1 : 0) ==
242
          mfm.matching(e), "Invalid matching");
243
  }
244

	
245
  SmartGraph::NodeMap<bool> processed(graph, false);
246
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
247
    if (processed[n]) continue;
248
    processed[n] = true;
249
    if (mfm.matching(n) == INVALID) continue;
250
    int num = 1;
251
    Node v = graph.target(mfm.matching(n));
252
    while (v != n) {
253
      processed[v] = true;
254
      ++num;
255
      v = graph.target(mfm.matching(v));
256
    }
257
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
258
    check(allow_loops || num != 1, "Wrong cycle size");
259
  }
260

	
261
  int anum = 0, bnum = 0;
262
  SmartGraph::NodeMap<bool> neighbours(graph, false);
263
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
264
    if (!mfm.barrier(n)) continue;
265
    ++anum;
266
    for (SmartGraph::InArcIt a(graph, n); a != INVALID; ++a) {
267
      Node u = graph.source(a);
268
      if (!allow_loops && u == n) continue;
269
      if (!neighbours[u]) {
270
        neighbours[u] = true;
271
        ++bnum;
272
      }
273
    }
274
  }
275
  check(anum - bnum + mfm.matchingSize() == countNodes(graph),
276
        "Wrong barrier");
277
}
278

	
279
void checkPerfectFractionalMatching(const SmartGraph& graph,
280
                             const MaxFractionalMatching<SmartGraph>& mfm,
281
                             bool perfect, bool allow_loops = true) {
282
  if (perfect) {
283
    for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
284
      int indeg = 0;
285
      for (InArcIt a(graph, n); a != INVALID; ++a) {
286
        if (mfm.matching(graph.source(a)) == a) {
287
          ++indeg;
288
        }
289
      }
290
      check(mfm.matching(n) != INVALID, "Invalid matching");
291
      check(indeg == 1, "Invalid matching");
292
    }
293
    for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
294
      check((e == mfm.matching(graph.u(e)) ? 1 : 0) +
295
            (e == mfm.matching(graph.v(e)) ? 1 : 0) ==
296
            mfm.matching(e), "Invalid matching");
297
    }
298
  } else {
299
    int anum = 0, bnum = 0;
300
    SmartGraph::NodeMap<bool> neighbours(graph, false);
301
    for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
302
      if (!mfm.barrier(n)) continue;
303
      ++anum;
304
      for (SmartGraph::InArcIt a(graph, n); a != INVALID; ++a) {
305
        Node u = graph.source(a);
306
        if (!allow_loops && u == n) continue;
307
        if (!neighbours[u]) {
308
          neighbours[u] = true;
309
          ++bnum;
310
        }
311
      }
312
    }
313
    check(anum - bnum > 0, "Wrong barrier");
314
  }
315
}
316

	
317
void checkWeightedFractionalMatching(const SmartGraph& graph,
318
                   const SmartGraph::EdgeMap<int>& weight,
319
                   const MaxWeightedFractionalMatching<SmartGraph>& mwfm,
320
                   bool allow_loops = true) {
321
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
322
    if (graph.u(e) == graph.v(e) && !allow_loops) continue;
323
    int rw = mwfm.nodeValue(graph.u(e)) + mwfm.nodeValue(graph.v(e))
324
      - weight[e] * mwfm.dualScale;
325

	
326
    check(rw >= 0, "Negative reduced weight");
327
    check(rw == 0 || !mwfm.matching(e),
328
          "Non-zero reduced weight on matching edge");
329
  }
330

	
331
  int pv = 0;
332
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
333
    int indeg = 0;
334
    for (InArcIt a(graph, n); a != INVALID; ++a) {
335
      if (mwfm.matching(graph.source(a)) == a) {
336
        ++indeg;
337
      }
338
    }
339
    check(indeg <= 1, "Invalid matching");
340
    if (mwfm.matching(n) != INVALID) {
341
      check(mwfm.nodeValue(n) >= 0, "Invalid node value");
342
      check(indeg == 1, "Invalid matching");
343
      pv += weight[mwfm.matching(n)];
344
      SmartGraph::Node o = graph.target(mwfm.matching(n));
345
    } else {
346
      check(mwfm.nodeValue(n) == 0, "Invalid matching");
347
      check(indeg == 0, "Invalid matching");
348
    }
349
  }
350

	
351
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
352
    check((e == mwfm.matching(graph.u(e)) ? 1 : 0) +
353
          (e == mwfm.matching(graph.v(e)) ? 1 : 0) ==
354
          mwfm.matching(e), "Invalid matching");
355
  }
356

	
357
  int dv = 0;
358
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
359
    dv += mwfm.nodeValue(n);
360
  }
361

	
362
  check(pv * mwfm.dualScale == dv * 2, "Wrong duality");
363

	
364
  SmartGraph::NodeMap<bool> processed(graph, false);
365
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
366
    if (processed[n]) continue;
367
    processed[n] = true;
368
    if (mwfm.matching(n) == INVALID) continue;
369
    int num = 1;
370
    Node v = graph.target(mwfm.matching(n));
371
    while (v != n) {
372
      processed[v] = true;
373
      ++num;
374
      v = graph.target(mwfm.matching(v));
375
    }
376
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
377
    check(allow_loops || num != 1, "Wrong cycle size");
378
  }
379

	
380
  return;
381
}
382

	
383
void checkWeightedPerfectFractionalMatching(const SmartGraph& graph,
384
                const SmartGraph::EdgeMap<int>& weight,
385
                const MaxWeightedPerfectFractionalMatching<SmartGraph>& mwpfm,
386
                bool allow_loops = true) {
387
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
388
    if (graph.u(e) == graph.v(e) && !allow_loops) continue;
389
    int rw = mwpfm.nodeValue(graph.u(e)) + mwpfm.nodeValue(graph.v(e))
390
      - weight[e] * mwpfm.dualScale;
391

	
392
    check(rw >= 0, "Negative reduced weight");
393
    check(rw == 0 || !mwpfm.matching(e),
394
          "Non-zero reduced weight on matching edge");
395
  }
396

	
397
  int pv = 0;
398
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
399
    int indeg = 0;
400
    for (InArcIt a(graph, n); a != INVALID; ++a) {
401
      if (mwpfm.matching(graph.source(a)) == a) {
402
        ++indeg;
403
      }
404
    }
405
    check(mwpfm.matching(n) != INVALID, "Invalid perfect matching");
406
    check(indeg == 1, "Invalid perfect matching");
407
    pv += weight[mwpfm.matching(n)];
408
    SmartGraph::Node o = graph.target(mwpfm.matching(n));
409
  }
410

	
411
  for (SmartGraph::EdgeIt e(graph); e != INVALID; ++e) {
412
    check((e == mwpfm.matching(graph.u(e)) ? 1 : 0) +
413
          (e == mwpfm.matching(graph.v(e)) ? 1 : 0) ==
414
          mwpfm.matching(e), "Invalid matching");
415
  }
416

	
417
  int dv = 0;
418
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
419
    dv += mwpfm.nodeValue(n);
420
  }
421

	
422
  check(pv * mwpfm.dualScale == dv * 2, "Wrong duality");
423

	
424
  SmartGraph::NodeMap<bool> processed(graph, false);
425
  for (SmartGraph::NodeIt n(graph); n != INVALID; ++n) {
426
    if (processed[n]) continue;
427
    processed[n] = true;
428
    if (mwpfm.matching(n) == INVALID) continue;
429
    int num = 1;
430
    Node v = graph.target(mwpfm.matching(n));
431
    while (v != n) {
432
      processed[v] = true;
433
      ++num;
434
      v = graph.target(mwpfm.matching(v));
435
    }
436
    check(num == 2 || num % 2 == 1, "Wrong cycle size");
437
    check(allow_loops || num != 1, "Wrong cycle size");
438
  }
439

	
440
  return;
441
}
442

	
443

	
444
int main() {
445

	
446
  for (int i = 0; i < lgfn; ++i) {
447
    SmartGraph graph;
448
    SmartGraph::EdgeMap<int> weight(graph);
449

	
450
    istringstream lgfs(lgf[i]);
451
    graphReader(graph, lgfs).
452
      edgeMap("weight", weight).run();
453

	
454
    bool perfect_with_loops;
455
    {
456
      MaxFractionalMatching<SmartGraph> mfm(graph, true);
457
      mfm.run();
458
      checkFractionalMatching(graph, mfm, true);
459
      perfect_with_loops = mfm.matchingSize() == countNodes(graph);
460
    }
461

	
462
    bool perfect_without_loops;
463
    {
464
      MaxFractionalMatching<SmartGraph> mfm(graph, false);
465
      mfm.run();
466
      checkFractionalMatching(graph, mfm, false);
467
      perfect_without_loops = mfm.matchingSize() == countNodes(graph);
468
    }
469

	
470
    {
471
      MaxFractionalMatching<SmartGraph> mfm(graph, true);
472
      bool result = mfm.runPerfect();
473
      checkPerfectFractionalMatching(graph, mfm, result, true);
474
      check(result == perfect_with_loops, "Wrong perfect matching");
475
    }
476

	
477
    {
478
      MaxFractionalMatching<SmartGraph> mfm(graph, false);
479
      bool result = mfm.runPerfect();
480
      checkPerfectFractionalMatching(graph, mfm, result, false);
481
      check(result == perfect_without_loops, "Wrong perfect matching");
482
    }
483

	
484
    {
485
      MaxWeightedFractionalMatching<SmartGraph> mwfm(graph, weight, true);
486
      mwfm.run();
487
      checkWeightedFractionalMatching(graph, weight, mwfm, true);
488
    }
489

	
490
    {
491
      MaxWeightedFractionalMatching<SmartGraph> mwfm(graph, weight, false);
492
      mwfm.run();
493
      checkWeightedFractionalMatching(graph, weight, mwfm, false);
494
    }
495

	
496
    {
497
      MaxWeightedPerfectFractionalMatching<SmartGraph> mwpfm(graph, weight,
498
                                                             true);
499
      bool perfect = mwpfm.run();
500
      check(perfect == (mwpfm.matchingSize() == countNodes(graph)),
501
            "Perfect matching found");
502
      check(perfect == perfect_with_loops, "Wrong perfect matching");
503

	
504
      if (perfect) {
505
        checkWeightedPerfectFractionalMatching(graph, weight, mwpfm, true);
506
      }
507
    }
508

	
509
    {
510
      MaxWeightedPerfectFractionalMatching<SmartGraph> mwpfm(graph, weight,
511
                                                             false);
512
      bool perfect = mwpfm.run();
513
      check(perfect == (mwpfm.matchingSize() == countNodes(graph)),
514
            "Perfect matching found");
515
      check(perfect == perfect_without_loops, "Wrong perfect matching");
516

	
517
      if (perfect) {
518
        checkWeightedPerfectFractionalMatching(graph, weight, mwpfm, false);
519
      }
520
    }
521

	
522
  }
523

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

	
19
#include <iostream>
20
#include <sstream>
21

	
22
#include <lemon/smart_graph.h>
23
#include <lemon/lgf_reader.h>
24
#include <lemon/path.h>
25
#include <lemon/concepts/digraph.h>
26
#include <lemon/concept_check.h>
27

	
28
#include <lemon/karp_mmc.h>
29
#include <lemon/hartmann_orlin_mmc.h>
30
#include <lemon/howard_mmc.h>
31

	
32
#include "test_tools.h"
33

	
34
using namespace lemon;
35

	
36
char test_lgf[] =
37
  "@nodes\n"
38
  "label\n"
39
  "1\n"
40
  "2\n"
41
  "3\n"
42
  "4\n"
43
  "5\n"
44
  "6\n"
45
  "7\n"
46
  "@arcs\n"
47
  "    len1 len2 len3 len4  c1 c2 c3 c4\n"
48
  "1 2    1    1    1    1   0  0  0  0\n"
49
  "2 4    5    5    5    5   1  0  0  0\n"
50
  "2 3    8    8    8    8   0  0  0  0\n"
51
  "3 2   -2    0    0    0   1  0  0  0\n"
52
  "3 4    4    4    4    4   0  0  0  0\n"
53
  "3 7   -4   -4   -4   -4   0  0  0  0\n"
54
  "4 1    2    2    2    2   0  0  0  0\n"
55
  "4 3    3    3    3    3   1  0  0  0\n"
56
  "4 4    3    3    0    0   0  0  1  0\n"
57
  "5 2    4    4    4    4   0  0  0  0\n"
58
  "5 6    3    3    3    3   0  1  0  0\n"
59
  "6 5    2    2    2    2   0  1  0  0\n"
60
  "6 4   -1   -1   -1   -1   0  0  0  0\n"
61
  "6 7    1    1    1    1   0  0  0  0\n"
62
  "7 7    4    4    4   -1   0  0  0  1\n";
63

	
64

	
65
// Check the interface of an MMC algorithm
66
template <typename GR, typename Cost>
67
struct MmcClassConcept
68
{
69
  template <typename MMC>
70
  struct Constraints {
71
    void constraints() {
72
      const Constraints& me = *this;
73

	
74
      typedef typename MMC
75
        ::template SetPath<ListPath<GR> >
76
        ::template SetLargeCost<Cost>
77
        ::Create MmcAlg;
78
      MmcAlg mmc(me.g, me.cost);
79
      const MmcAlg& const_mmc = mmc;
80

	
81
      typename MmcAlg::Tolerance tol = const_mmc.tolerance();
82
      mmc.tolerance(tol);
83

	
84
      b = mmc.cycle(p).run();
85
      b = mmc.findCycleMean();
86
      b = mmc.findCycle();
87

	
88
      v = const_mmc.cycleCost();
89
      i = const_mmc.cycleSize();
90
      d = const_mmc.cycleMean();
91
      p = const_mmc.cycle();
92
    }
93

	
94
    typedef concepts::ReadMap<typename GR::Arc, Cost> CM;
95

	
96
    GR g;
97
    CM cost;
98
    ListPath<GR> p;
99
    Cost v;
100
    int i;
101
    double d;
102
    bool b;
103
  };
104
};
105

	
106
// Perform a test with the given parameters
107
template <typename MMC>
108
void checkMmcAlg(const SmartDigraph& gr,
109
                 const SmartDigraph::ArcMap<int>& lm,
110
                 const SmartDigraph::ArcMap<int>& cm,
111
                 int cost, int size) {
112
  MMC alg(gr, lm);
113
  alg.findCycleMean();
114
  check(alg.cycleMean() == static_cast<double>(cost) / size,
115
        "Wrong cycle mean");
116
  alg.findCycle();
117
  check(alg.cycleCost() == cost && alg.cycleSize() == size,
118
        "Wrong path");
119
  SmartDigraph::ArcMap<int> cycle(gr, 0);
120
  for (typename MMC::Path::ArcIt a(alg.cycle()); a != INVALID; ++a) {
121
    ++cycle[a];
122
  }
123
  for (SmartDigraph::ArcIt a(gr); a != INVALID; ++a) {
124
    check(cm[a] == cycle[a], "Wrong path");
125
  }
126
}
127

	
128
// Class for comparing types
129
template <typename T1, typename T2>
130
struct IsSameType {
131
  static const int result = 0;
132
};
133

	
134
template <typename T>
135
struct IsSameType<T,T> {
136
  static const int result = 1;
137
};
138

	
139

	
140
int main() {
141
  #ifdef LEMON_HAVE_LONG_LONG
142
    typedef long long long_int;
143
  #else
144
    typedef long long_int;
145
  #endif
146

	
147
  // Check the interface
148
  {
149
    typedef concepts::Digraph GR;
150

	
151
    // KarpMmc
152
    checkConcept< MmcClassConcept<GR, int>,
153
                  KarpMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
154
    checkConcept< MmcClassConcept<GR, float>,
155
                  KarpMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
156

	
157
    // HartmannOrlinMmc
158
    checkConcept< MmcClassConcept<GR, int>,
159
                  HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
160
    checkConcept< MmcClassConcept<GR, float>,
161
                  HartmannOrlinMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
162

	
163
    // HowardMmc
164
    checkConcept< MmcClassConcept<GR, int>,
165
                  HowardMmc<GR, concepts::ReadMap<GR::Arc, int> > >();
166
    checkConcept< MmcClassConcept<GR, float>,
167
                  HowardMmc<GR, concepts::ReadMap<GR::Arc, float> > >();
168

	
169
    check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, int> >
170
           ::LargeCost, long_int>::result == 1), "Wrong LargeCost type");
171
    check((IsSameType<HowardMmc<GR, concepts::ReadMap<GR::Arc, float> >
172
           ::LargeCost, double>::result == 1), "Wrong LargeCost type");
173
  }
174

	
175
  // Run various tests
176
  {
177
    typedef SmartDigraph GR;
178
    DIGRAPH_TYPEDEFS(GR);
179

	
180
    GR gr;
181
    IntArcMap l1(gr), l2(gr), l3(gr), l4(gr);
182
    IntArcMap c1(gr), c2(gr), c3(gr), c4(gr);
183

	
184
    std::istringstream input(test_lgf);
185
    digraphReader(gr, input).
186
      arcMap("len1", l1).
187
      arcMap("len2", l2).
188
      arcMap("len3", l3).
189
      arcMap("len4", l4).
190
      arcMap("c1", c1).
191
      arcMap("c2", c2).
192
      arcMap("c3", c3).
193
      arcMap("c4", c4).
194
      run();
195

	
196
    // Karp
197
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
198
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
199
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
200
    checkMmcAlg<KarpMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
201

	
202
    // HartmannOrlin
203
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
204
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
205
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
206
    checkMmcAlg<HartmannOrlinMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
207

	
208
    // Howard
209
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l1, c1,  6, 3);
210
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l2, c2,  5, 2);
211
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l3, c3,  0, 1);
212
    checkMmcAlg<HowardMmc<GR, IntArcMap> >(gr, l4, c4, -1, 1);
213
  }
214

	
215
  return 0;
216
}
Ignore white space 6 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
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
#include <iostream>
20

	
21
#include <lemon/planarity.h>
22

	
23
#include <lemon/smart_graph.h>
24
#include <lemon/lgf_reader.h>
25
#include <lemon/connectivity.h>
26
#include <lemon/dim2.h>
27

	
28
#include "test_tools.h"
29

	
30
using namespace lemon;
31
using namespace lemon::dim2;
32

	
33
const int lgfn = 4;
34
const std::string lgf[lgfn] = {
35
  "@nodes\n"
36
  "label\n"
37
  "0\n"
38
  "1\n"
39
  "2\n"
40
  "3\n"
41
  "4\n"
42
  "@edges\n"
43
  "     label\n"
44
  "0 1  0\n"
45
  "0 2  0\n"
46
  "0 3  0\n"
47
  "0 4  0\n"
48
  "1 2  0\n"
49
  "1 3  0\n"
50
  "1 4  0\n"
51
  "2 3  0\n"
52
  "2 4  0\n"
53
  "3 4  0\n",
54

	
55
  "@nodes\n"
56
  "label\n"
57
  "0\n"
58
  "1\n"
59
  "2\n"
60
  "3\n"
61
  "4\n"
62
  "@edges\n"
63
  "     label\n"
64
  "0 1  0\n"
65
  "0 2  0\n"
66
  "0 3  0\n"
67
  "0 4  0\n"
68
  "1 2  0\n"
69
  "1 3  0\n"
70
  "2 3  0\n"
71
  "2 4  0\n"
72
  "3 4  0\n",
73

	
74
  "@nodes\n"
75
  "label\n"
76
  "0\n"
77
  "1\n"
78
  "2\n"
79
  "3\n"
80
  "4\n"
81
  "5\n"
82
  "@edges\n"
83
  "     label\n"
84
  "0 3  0\n"
85
  "0 4  0\n"
86
  "0 5  0\n"
87
  "1 3  0\n"
88
  "1 4  0\n"
89
  "1 5  0\n"
90
  "2 3  0\n"
91
  "2 4  0\n"
92
  "2 5  0\n",
93

	
94
  "@nodes\n"
95
  "label\n"
96
  "0\n"
97
  "1\n"
98
  "2\n"
99
  "3\n"
100
  "4\n"
101
  "5\n"
102
  "@edges\n"
103
  "     label\n"
104
  "0 3  0\n"
105
  "0 4  0\n"
106
  "0 5  0\n"
107
  "1 3  0\n"
108
  "1 4  0\n"
109
  "1 5  0\n"
110
  "2 3  0\n"
111
  "2 5  0\n"
112
};
113

	
114

	
115

	
116
typedef SmartGraph Graph;
117
GRAPH_TYPEDEFS(Graph);
118

	
119
typedef PlanarEmbedding<SmartGraph> PE;
120
typedef PlanarDrawing<SmartGraph> PD;
121
typedef PlanarColoring<SmartGraph> PC;
122

	
123
void checkEmbedding(const Graph& graph, PE& pe) {
124
  int face_num = 0;
125

	
126
  Graph::ArcMap<int> face(graph, -1);
127

	
128
  for (ArcIt a(graph); a != INVALID; ++a) {
129
    if (face[a] == -1) {
130
      Arc b = a;
131
      while (face[b] == -1) {
132
        face[b] = face_num;
133
        b = pe.next(graph.oppositeArc(b));
134
      }
135
      check(face[b] == face_num, "Wrong face");
136
      ++face_num;
137
    }
138
  }
139
  check(face_num + countNodes(graph) - countConnectedComponents(graph) ==
140
        countEdges(graph) + 1, "Euler test does not passed");
141
}
142

	
143
void checkKuratowski(const Graph& graph, PE& pe) {
144
  std::map<int, int> degs;
145
  for (NodeIt n(graph); n != INVALID; ++n) {
146
    int deg = 0;
147
    for (IncEdgeIt e(graph, n); e != INVALID; ++e) {
148
      if (pe.kuratowski(e)) {
149
        ++deg;
150
      }
151
    }
152
    ++degs[deg];
153
  }
154
  for (std::map<int, int>::iterator it = degs.begin(); it != degs.end(); ++it) {
155
    check(it->first == 0 || it->first == 2 ||
156
          (it->first == 3 && it->second == 6) ||
157
          (it->first == 4 && it->second == 5),
158
          "Wrong degree in Kuratowski graph");
159
  }
160

	
161
  // Not full test
162
  check((degs[3] == 0) != (degs[4] == 0), "Wrong Kuratowski graph");
163
}
164

	
165
bool intersect(Point<int> e1, Point<int> e2, Point<int> f1, Point<int> f2) {
166
  int l, r;
167
  if (std::min(e1.x, e2.x) > std::max(f1.x, f2.x)) return false;
168
  if (std::max(e1.x, e2.x) < std::min(f1.x, f2.x)) return false;
169
  if (std::min(e1.y, e2.y) > std::max(f1.y, f2.y)) return false;
170
  if (std::max(e1.y, e2.y) < std::min(f1.y, f2.y)) return false;
171

	
172
  l = (e2.x - e1.x) * (f1.y - e1.y) - (e2.y - e1.y) * (f1.x - e1.x);
173
  r = (e2.x - e1.x) * (f2.y - e1.y) - (e2.y - e1.y) * (f2.x - e1.x);
174
  if (!((l >= 0 && r <= 0) || (l <= 0 && r >= 0))) return false;
175
  l = (f2.x - f1.x) * (e1.y - f1.y) - (f2.y - f1.y) * (e1.x - f1.x);
176
  r = (f2.x - f1.x) * (e2.y - f1.y) - (f2.y - f1.y) * (e2.x - f1.x);
177
  if (!((l >= 0 && r <= 0) || (l <= 0 && r >= 0))) return false;
178
  return true;
179
}
180

	
181
bool collinear(Point<int> p, Point<int> q, Point<int> r) {
182
  int v;
183
  v = (q.x - p.x) * (r.y - p.y) - (q.y - p.y) * (r.x - p.x);
184
  if (v != 0) return false;
185
  v = (q.x - p.x) * (r.x - p.x) + (q.y - p.y) * (r.y - p.y);
186
  if (v < 0) return false;
187
  return true;
188
}
189

	
190
void checkDrawing(const Graph& graph, PD& pd) {
191
  for (Graph::NodeIt n(graph); n != INVALID; ++n) {
192
    Graph::NodeIt m(n);
193
    for (++m; m != INVALID; ++m) {
194
      check(pd[m] != pd[n], "Two nodes with identical coordinates");
195
    }
196
  }
197

	
198
  for (Graph::EdgeIt e(graph); e != INVALID; ++e) {
199
    for (Graph::EdgeIt f(e); f != e; ++f) {
200
      Point<int> e1 = pd[graph.u(e)];
201
      Point<int> e2 = pd[graph.v(e)];
202
      Point<int> f1 = pd[graph.u(f)];
203
      Point<int> f2 = pd[graph.v(f)];
204

	
205
      if (graph.u(e) == graph.u(f)) {
206
        check(!collinear(e1, e2, f2), "Wrong drawing");
207
      } else if (graph.u(e) == graph.v(f)) {
208
        check(!collinear(e1, e2, f1), "Wrong drawing");
209
      } else if (graph.v(e) == graph.u(f)) {
210
        check(!collinear(e2, e1, f2), "Wrong drawing");
211
      } else if (graph.v(e) == graph.v(f)) {
212
        check(!collinear(e2, e1, f1), "Wrong drawing");
213
      } else {
214
        check(!intersect(e1, e2, f1, f2), "Wrong drawing");
215
      }
216
    }
217
  }
218
}
219

	
220
void checkColoring(const Graph& graph, PC& pc, int num) {
221
  for (NodeIt n(graph); n != INVALID; ++n) {
222
    check(pc.colorIndex(n) >= 0 && pc.colorIndex(n) < num,
223
          "Wrong coloring");
224
  }
225
  for (EdgeIt e(graph); e != INVALID; ++e) {
226
    check(pc.colorIndex(graph.u(e)) != pc.colorIndex(graph.v(e)),
227
          "Wrong coloring");
228
  }
229
}
230

	
231
int main() {
232

	
233
  for (int i = 0; i < lgfn; ++i) {
234
    std::istringstream lgfs(lgf[i]);
235

	
236
    SmartGraph graph;
237
    graphReader(graph, lgfs).run();
238

	
239
    check(simpleGraph(graph), "Test graphs must be simple");
240

	
241
    PE pe(graph);
242
    bool planar = pe.run();
243
    check(checkPlanarity(graph) == planar, "Planarity checking failed");
244

	
245
    if (planar) {
246
      checkEmbedding(graph, pe);
247

	
248
      PlanarDrawing<Graph> pd(graph);
249
      pd.run(pe.embeddingMap());
250
      checkDrawing(graph, pd);
251

	
252
      PlanarColoring<Graph> pc(graph);
253
      pc.runFiveColoring(pe.embeddingMap());
254
      checkColoring(graph, pc, 5);
255

	
256
    } else {
257
      checkKuratowski(graph, pe);
258
    }
259
  }
260

	
261
  return 0;
262
}
Ignore white space 6 line context
... ...
@@ -24,2 +24,3 @@
24 24
doc/Doxyfile
25
doc/references.dox
25 26
cmake/version.cmake
Ignore white space 6 line context
... ...
@@ -116,2 +116,4 @@
116 116

	
117
INCLUDE(FindPythonInterp)
118

	
117 119
ENABLE_TESTING()
Ignore white space 6 line context
... ...
@@ -175,1 +175,23 @@
175 175
   Disable COIN-OR support.
176

	
177

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

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

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

	
193
In order to turn off a single flag from the default set of warning
194
flags, you can use the CXXFLAGS variable, since this is passed after
195
WARNINGCXXFLAGS. For example to turn off `-Wold-style-cast' (which is
196
used by default when g++ is detected) you can use
197
`make CXXFLAGS="-g -O2 -Wno-old-style-cast"'.
Ignore white space 6 line context
... ...
@@ -46,2 +46,3 @@
46 46
include tools/Makefile.am
47
include scripts/Makefile.am
47 48

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

	
20
NEWS
21

	
22
   News and version history.
23

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

	
40
scripts/
41

	
42
   Scripts that make it easier to develop LEMON.
43

	
36 44
test/
Ignore white space 6 line context
... ...
@@ -43,2 +43,3 @@
43 43
AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no])
44
AC_CHECK_PROG([python_found],[python],[yes],[no])
44 45
AC_CHECK_PROG([gs_found],[gs],[yes],[no])
... ...
@@ -84,2 +85,17 @@
84 85

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

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

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

	
85 101
dnl Checks for header files.
... ...
@@ -130,2 +146,3 @@
130 146
echo Build additional tools........ : $enable_tools
147
echo Use valgrind for tests........ : $use_valgrind
131 148
echo
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -67,5 +67,14 @@
67 67

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

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

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

	
20
IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)
20
IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE)
21 21
  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
... ...
@@ -30,2 +30,3 @@
30 30
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
31
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/matching.eps
31 32
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
... ...
@@ -36,4 +37,6 @@
36 37
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
38
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/planar.png ${CMAKE_CURRENT_SOURCE_DIR}/images/planar.eps
37 39
    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
38 40
    COMMAND ${CMAKE_COMMAND} -E remove_directory html
41
    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox
39 42
    COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
Ignore white space 6 line context
... ...
@@ -99,3 +99,4 @@
99 99
                         "@abs_top_srcdir@/test/test_tools.h" \
100
                         "@abs_top_builddir@/doc/mainpage.dox"
100
                         "@abs_top_builddir@/doc/mainpage.dox" \
101
                         "@abs_top_builddir@/doc/references.dox"
101 102
INPUT_ENCODING         = UTF-8
Ignore white space 6 line context
... ...
@@ -29,3 +29,5 @@
29 29
	edge_biconnected_components.eps \
30
	matching.eps \
30 31
	node_biconnected_components.eps \
32
	planar.eps \
31 33
	strongly_connected_components.eps
... ...
@@ -68,3 +70,15 @@
68 70

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

	
83
html-local: $(DOC_PNG_IMAGES) references.dox
70 84
	if test ${doxygen_found} = yes; then \
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -228,10 +228,2 @@
228 228
/**
229
@defgroup matrices Matrices
230
@ingroup datas
231
\brief Two dimensional data storages implemented in LEMON.
232

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

	
236
/**
237 229
@defgroup paths Path Structures
... ...
@@ -248,3 +240,32 @@
248 240

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

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

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

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

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

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

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

	
270
This group contains two dimensional data storages implemented in LEMON.
250 271
*/
... ...
@@ -261,2 +282,24 @@
261 282
/**
283
@defgroup geomdat Geometric Data Structures
284
@ingroup auxdat
285
\brief Geometric data structures implemented in LEMON.
286

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

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

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

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

	
304
/**
262 305
@defgroup algs Algorithms
... ...
@@ -275,3 +318,4 @@
275 318
This group contains the common graph search algorithms, namely
276
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS).
319
\e breadth-first \e search (BFS) and \e depth-first \e search (DFS)
320
\ref clrs01algorithms.
277 321
*/
... ...
@@ -283,3 +327,4 @@
283 327

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

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

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

	
354
/**
301 355
@defgroup max_flow Maximum Flow Algorithms
... ...
@@ -305,3 +359,3 @@
305 359
This group contains the algorithms for finding maximum flows and
306
feasible circulations.
360
feasible circulations \ref clrs01algorithms, \ref amo93networkflows.
307 361

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

	
326
In most cases the \ref Preflow "Preflow" algorithm provides the
384
In most cases the \ref Preflow algorithm provides the
327 385
fastest method for computing a maximum flow. All implementations
... ...
@@ -330,3 +388,3 @@
330 388

	
331
\ref Circulation is a preflow push-relabel algorithm implemented directly 
389
\ref Circulation is a preflow push-relabel algorithm implemented directly
332 390
for finding feasible circulations, which is a somewhat different problem,
... ...
@@ -343,4 +401,5 @@
343 401
This group contains the algorithms for finding minimum cost flows and
344
circulations. For more information about this problem and its dual
345
solution see \ref min_cost_flow "Minimum Cost Flow Problem".
402
circulations \ref amo93networkflows. For more information about this
403
problem and its dual solution, see \ref min_cost_flow
404
"Minimum Cost Flow Problem".
346 405

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

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

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

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

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

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

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

	
413
\image html planar.png
414
\image latex planar.eps "Plane graph" width=\textwidth
482
In practice, the Howard algorithm proved to be by far the most efficient
483
one, though the best known theoretical bound on its running time is
484
exponential.
485
Both Karp and HartmannOrlin algorithms run in time O(ne) and use space
486
O(n<sup>2</sup>+e), but the latter one is typically faster due to the
487
applied early termination scheme.
415 488
*/
... ...
@@ -451,5 +524,12 @@
451 524
  perfect matching in general graphs.
525
- \ref MaxFractionalMatching Push-relabel algorithm for calculating
526
  maximum cardinality fractional matching in general graphs.
527
- \ref MaxWeightedFractionalMatching Augmenting path algorithm for calculating
528
  maximum weighted fractional matching in general graphs.
529
- \ref MaxWeightedPerfectFractionalMatching
530
  Augmenting path algorithm for calculating maximum weighted
531
  perfect fractional matching in general graphs.
452 532

	
453
\image html bipartite_matching.png
454
\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth
533
\image html matching.png
534
\image latex matching.eps "Min Cost Perfect Matching" width=\textwidth
455 535
*/
... ...
@@ -457,8 +537,32 @@
457 537
/**
458
@defgroup spantree Minimum Spanning Tree Algorithms
538
@defgroup graph_properties Connectivity and Other Graph Properties
459 539
@ingroup algs
460
\brief Algorithms for finding minimum cost spanning trees and arborescences.
540
\brief Algorithms for discovering the graph properties
461 541

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

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

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

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

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

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

	
566
This group contains the approximation and heuristic algorithms
567
implemented in LEMON.
464 568
*/
... ...
@@ -475,11 +579,2 @@
475 579
/**
476
@defgroup approx Approximation Algorithms
477
@ingroup algs
478
\brief Approximation algorithms.
479

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

	
484
/**
485 580
@defgroup gen_opt_group General Optimization Tools
... ...
@@ -493,9 +588,12 @@
493 588
/**
494
@defgroup lp_group Lp and Mip Solvers
589
@defgroup lp_group LP and MIP Solvers
495 590
@ingroup gen_opt_group
496
\brief Lp and Mip solver interfaces for LEMON.
591
\brief LP and MIP solver interfaces for LEMON.
497 592

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

	
597
The currently supported solvers are \ref glpk, \ref clp, \ref cbc,
598
\ref cplex, \ref soplex.
501 599
*/
... ...
@@ -589,3 +687,3 @@
589 687
/**
590
@defgroup dimacs_group DIMACS format
688
@defgroup dimacs_group DIMACS Format
591 689
@ingroup io_group
... ...
@@ -638,4 +736,4 @@
638 736

	
639
This group contains the skeletons and concept checking classes of LEMON's
640
graph structures and helper classes used to implement these.
737
This group contains the skeletons and concept checking classes of
738
graph structures.
641 739
*/
... ...
@@ -651,2 +749,11 @@
651 749
/**
750
@defgroup tools Standalone Utility Applications
751

	
752
Some utility applications are listed here.
753

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

	
758
/**
652 759
\anchor demoprograms
... ...
@@ -662,11 +769,2 @@
662 769

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

	
666
Some utility applications are listed here.
667

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

	
672 770
}
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -23,10 +23,7 @@
23 23

	
24
\subsection whatis What is LEMON
25

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

	
... ...
@@ -40,3 +37,12 @@
40 37

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

	
47
\section howtoread How to Read the Documentation
42 48

	
... ...
@@ -45,2 +51,6 @@
45 51

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

	
46 56
If you know what you are looking for, then try to find it under the
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -28,3 +28,3 @@
28 28
in a network with capacity constraints (lower and upper bounds)
29
and arc costs.
29
and arc costs \ref amo93networkflows.
30 30

	
... ...
@@ -80,6 +80,6 @@
80 80
 - For all \f$u\in V\f$ nodes:
81
   - \f$\pi(u)<=0\f$;
81
   - \f$\pi(u)\leq 0\f$;
82 82
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
83 83
     then \f$\pi(u)=0\f$.
84
 
84

	
85 85
Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc
... ...
@@ -121,3 +121,3 @@
121 121

	
122
It means that the total demand must be less or equal to the 
122
It means that the total demand must be less or equal to the
123 123
total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
... ...
@@ -147,3 +147,3 @@
147 147
 - For all \f$u\in V\f$ nodes:
148
   - \f$\pi(u)>=0\f$;
148
   - \f$\pi(u)\geq 0\f$;
149 149
   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
Ignore white space 6 line context
... ...
@@ -60,5 +60,8 @@
60 60
	lemon/assert.h \
61
	lemon/bellman_ford.h \
61 62
	lemon/bfs.h \
62 63
	lemon/bin_heap.h \
64
	lemon/binomial_heap.h \
63 65
	lemon/bucket_heap.h \
66
	lemon/capacity_scaling.h \
64 67
	lemon/cbc.h \
... ...
@@ -69,6 +72,9 @@
69 72
	lemon/connectivity.h \
73
	lemon/core.h \
74
	lemon/cost_scaling.h \
70 75
	lemon/counter.h \
71
	lemon/core.h \
72 76
	lemon/cplex.h \
77
	lemon/cycle_canceling.h \
73 78
	lemon/dfs.h \
79
	lemon/dheap.h \
74 80
	lemon/dijkstra.h \
... ...
@@ -81,2 +87,3 @@
81 87
	lemon/fib_heap.h \
88
	lemon/fractional_matching.h \
82 89
	lemon/full_graph.h \
... ...
@@ -86,3 +93,6 @@
86 93
	lemon/grid_graph.h \
94
	lemon/hartmann_orlin_mmc.h \
95
	lemon/howard_mmc.h \
87 96
	lemon/hypercube_graph.h \
97
	lemon/karp_mmc.h \
88 98
	lemon/kruskal.h \
... ...
@@ -101,4 +111,7 @@
101 111
	lemon/network_simplex.h \
112
	lemon/pairing_heap.h \
102 113
	lemon/path.h \
114
	lemon/planarity.h \
103 115
	lemon/preflow.h \
116
	lemon/quad_heap.h \
104 117
	lemon/radix_heap.h \
... ...
@@ -108,2 +121,3 @@
108 121
	lemon/soplex.h \
122
	lemon/static_graph.h \
109 123
	lemon/suurballe.h \
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -362,2 +362,5 @@
362 362
  ///
363
  /// This class provides item counting in the same time as the adapted
364
  /// digraph structure.
365
  ///
363 366
  /// \tparam DGR The type of the adapted digraph.
... ...
@@ -420,3 +423,3 @@
420 423
      _node_filter = &node_filter;
421
      _arc_filter = &arc_filter;      
424
      _arc_filter = &arc_filter;
422 425
    }
... ...
@@ -507,7 +510,7 @@
507 510
    template <typename V>
508
    class NodeMap 
509
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 
510
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511
    class NodeMap
512
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
513
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
511 514
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
512
	LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
515
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
513 516

	
... ...
@@ -534,5 +537,5 @@
534 537
    template <typename V>
535
    class ArcMap 
538
    class ArcMap
536 539
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
537
	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
540
              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
538 541
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
... ...
@@ -581,3 +584,3 @@
581 584
      _node_filter = &node_filter;
582
      _arc_filter = &arc_filter;      
585
      _arc_filter = &arc_filter;
583 586
    }
... ...
@@ -650,6 +653,6 @@
650 653
    template <typename V>
651
    class NodeMap 
654
    class NodeMap
652 655
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
653 656
          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
654
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
657
      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
655 658
        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
... ...
@@ -677,3 +680,3 @@
677 680
    template <typename V>
678
    class ArcMap 
681
    class ArcMap
679 682
      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
... ...
@@ -721,2 +724,4 @@
721 724
  ///
725
  /// This class provides only linear time counting for nodes and arcs.
726
  ///
722 727
  /// \tparam DGR The type of the adapted digraph.
... ...
@@ -1018,6 +1023,6 @@
1018 1023
    template <typename V>
1019
    class NodeMap 
1024
    class NodeMap
1020 1025
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1021 1026
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1022
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1027
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1023 1028
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
... ...
@@ -1045,6 +1050,6 @@
1045 1050
    template <typename V>
1046
    class ArcMap 
1051
    class ArcMap
1047 1052
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1048 1053
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1049
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1054
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1050 1055
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
... ...
@@ -1072,6 +1077,6 @@
1072 1077
    template <typename V>
1073
    class EdgeMap 
1078
    class EdgeMap
1074 1079
      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1075 1080
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1076
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
1081
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1077 1082
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
... ...
@@ -1114,4 +1119,4 @@
1114 1119
    EF* _edge_filter;
1115
    SubGraphBase() 
1116
	  : Parent(), _node_filter(0), _edge_filter(0) { }
1120
    SubGraphBase()
1121
          : Parent(), _node_filter(0), _edge_filter(0) { }
1117 1122

	
... ...
@@ -1216,6 +1221,6 @@
1216 1221
    template <typename V>
1217
    class NodeMap 
1222
    class NodeMap
1218 1223
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1219 1224
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1220
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1225
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1221 1226
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
... ...
@@ -1243,6 +1248,6 @@
1243 1248
    template <typename V>
1244
    class ArcMap 
1249
    class ArcMap
1245 1250
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1246 1251
          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1247
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1252
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1248 1253
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
... ...
@@ -1270,7 +1275,7 @@
1270 1275
    template <typename V>
1271
    class EdgeMap 
1276
    class EdgeMap
1272 1277
      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1273 1278
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1274
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
1275
	LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1279
      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1280
        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1276 1281

	
... ...
@@ -1316,2 +1321,4 @@
1316 1321
  ///
1322
  /// This class provides only linear time counting for nodes, edges and arcs.
1323
  ///
1317 1324
  /// \tparam GR The type of the adapted graph.
... ...
@@ -1473,2 +1480,4 @@
1473 1480
  ///
1481
  /// This class provides only linear time item counting.
1482
  ///
1474 1483
  /// \tparam GR The type of the adapted digraph or graph.
... ...
@@ -1497,3 +1506,3 @@
1497 1506
    typedef DigraphAdaptorExtender<
1498
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
1507
      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1499 1508
                     true> > Parent;
... ...
@@ -1518,3 +1527,3 @@
1518 1527
    /// given node filter map.
1519
    FilterNodes(GR& graph, NF& node_filter) 
1528
    FilterNodes(GR& graph, NF& node_filter)
1520 1529
      : Parent(), const_true_map()
... ...
@@ -1556,3 +1565,3 @@
1556 1565
    public GraphAdaptorExtender<
1557
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1566
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1558 1567
                   true> > {
... ...
@@ -1560,3 +1569,3 @@
1560 1569
    typedef GraphAdaptorExtender<
1561
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
1570
      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1562 1571
                   true> > Parent;
... ...
@@ -1621,2 +1630,4 @@
1621 1630
  ///
1631
  /// This class provides only linear time counting for nodes and arcs.
1632
  ///
1622 1633
  /// \tparam DGR The type of the adapted digraph.
... ...
@@ -1644,3 +1655,3 @@
1644 1655
    typedef DigraphAdaptorExtender<
1645
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
1656
      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1646 1657
                     AF, false> > Parent;
... ...
@@ -1731,2 +1742,4 @@
1731 1742
  ///
1743
  /// This class provides only linear time counting for nodes, edges and arcs.
1744
  ///
1732 1745
  /// \tparam GR The type of the adapted graph.
... ...
@@ -1750,3 +1763,3 @@
1750 1763
    public GraphAdaptorExtender<
1751
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
1764
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1752 1765
                   EF, false> > {
... ...
@@ -1754,3 +1767,3 @@
1754 1767
    typedef GraphAdaptorExtender<
1755
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
1768
      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1756 1769
                   EF, false> > Parent;
... ...
@@ -1779,3 +1792,3 @@
1779 1792
    /// filter map.
1780
    FilterEdges(GR& graph, EF& edge_filter) 
1793
    FilterEdges(GR& graph, EF& edge_filter)
1781 1794
      : Parent(), const_true_map() {
... ...
@@ -1847,3 +1860,3 @@
1847 1860

	
1848
      Arc(const Edge& edge, bool forward) 
1861
      Arc(const Edge& edge, bool forward)
1849 1862
        : _edge(edge), _forward(forward) {}
... ...
@@ -2087,3 +2100,3 @@
2087 2100
      ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
2088
        : _forward(*adaptor._digraph, value), 
2101
        : _forward(*adaptor._digraph, value),
2089 2102
          _backward(*adaptor._digraph, value) {}
... ...
@@ -2205,3 +2218,3 @@
2205 2218
    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
2206
    
2219

	
2207 2220
    typedef EdgeNotifier ArcNotifier;
... ...
@@ -2234,2 +2247,5 @@
2234 2247
  ///
2248
  /// This class provides item counting in the same time as the adapted
2249
  /// digraph structure.
2250
  ///
2235 2251
  /// \tparam DGR The type of the adapted digraph.
... ...
@@ -2537,2 +2553,5 @@
2537 2553
  ///
2554
  /// This class provides item counting in the same time as the adapted
2555
  /// graph structure.
2556
  ///
2538 2557
  /// \tparam GR The type of the adapted graph.
... ...
@@ -2680,2 +2699,4 @@
2680 2699
  ///
2700
  /// This class provides only linear time counting for nodes and arcs.
2701
  ///
2681 2702
  /// \tparam DGR The type of the adapted digraph.
... ...
@@ -2709,3 +2730,3 @@
2709 2730
           typename TL = Tolerance<typename CM::Value> >
2710
  class ResidualDigraph 
2731
  class ResidualDigraph
2711 2732
    : public SubDigraph<
... ...
@@ -2766,3 +2787,3 @@
2766 2787
                    FM& flow, const TL& tolerance = Tolerance())
2767
      : Parent(), _capacity(&capacity), _flow(&flow), 
2788
      : Parent(), _capacity(&capacity), _flow(&flow),
2768 2789
        _graph(digraph), _node_filter(),
... ...
@@ -2848,3 +2869,3 @@
2848 2869
      /// Constructor
2849
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 
2870
      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
2850 2871
        : _adaptor(&adaptor) {}
... ...
@@ -3327,2 +3348,5 @@
3327 3348
  ///
3349
  /// This class provides item counting in the same time as the adapted
3350
  /// digraph structure.
3351
  ///
3328 3352
  /// \tparam DGR The type of the adapted digraph.
... ...
@@ -3425,3 +3449,3 @@
3425 3449
    /// Its value type is inherited from the first node map type (\c IN).
3426
    /// \tparam IN The type of the node map for the in-nodes. 
3450
    /// \tparam IN The type of the node map for the in-nodes.
3427 3451
    /// \tparam OUT The type of the node map for the out-nodes.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -22,2 +22,10 @@
22 22

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

	
30

	
23 31
  void ArgParser::_showHelp(void *p)
... ...
@@ -25,3 +33,3 @@
25 33
    (static_cast<ArgParser*>(p))->showHelp();
26
    exit(1);
34
    (static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP);
27 35
  }
... ...
@@ -29,3 +37,4 @@
29 37
  ArgParser::ArgParser(int argc, const char * const *argv)
30
    :_argc(argc), _argv(argv), _command_name(argv[0]) {
38
    :_argc(argc), _argv(argv), _command_name(argv[0]),
39
    _exit_on_problems(true) {
31 40
    funcOption("-help","Print a short help message",_showHelp,this);
... ...
@@ -344,3 +353,3 @@
344 353
    for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);
345
    exit(1);
354
    _terminate(ArgParserException::HELP);
346 355
  }
... ...
@@ -353,3 +362,3 @@
353 362
      " --help' to obtain a short summary on the usage.\n\n";
354
    exit(1);
363
    _terminate(ArgParserException::UNKNOWN_OPT);
355 364
  }
... ...
@@ -416,3 +425,3 @@
416 425
        " --help' to obtain a short summary on the usage.\n\n";
417
      exit(1);
426
      _terminate(ArgParserException::INVALID_OPT);
418 427
    }
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -36,2 +36,40 @@
36 36

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

	
46
  private:
47
    Reason _reason;
48

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

	
74

	
37 75
  ///Command line arguments parser
... ...
@@ -118,2 +156,6 @@
118 156

	
157
    bool _exit_on_problems;
158

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

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

	
425
    ///Throw instead of exit in case of problems
426
    void throwOnProblems()
427
    {
428
      _exit_on_problems=false;
429
    }
383 430
  };
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -49,3 +49,3 @@
49 49
    ///arcs of the shortest paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
... ...
@@ -64,3 +64,4 @@
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default, it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
... ...
@@ -83,3 +84,4 @@
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to
86
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 87
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
... ...
@@ -98,3 +100,3 @@
98 100
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
101
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 102
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -122,2 +124,7 @@
122 124
  ///The default type is \ref ListDigraph.
125
  ///\tparam TR The traits class that defines various types used by the
126
  ///algorithm. By default, it is \ref BfsDefaultTraits
127
  ///"BfsDefaultTraits<GR>".
128
  ///In most cases, this parameter should not be set directly,
129
  ///consider to use the named template parameters instead.
123 130
#ifdef DOXYGEN
... ...
@@ -227,3 +234,3 @@
227 234
    ///\c PredMap type.
228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
235
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 236
    template <class T>
... ...
@@ -247,3 +254,3 @@
247 254
    ///\c DistMap type.
248
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
255
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 256
    template <class T>
... ...
@@ -267,3 +274,4 @@
267 274
    ///\c ReachedMap type.
268
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
275
    ///It must conform to
276
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 277
    template <class T>
... ...
@@ -287,3 +295,3 @@
287 295
    ///\c ProcessedMap type.
288
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
296
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 297
    template <class T>
... ...
@@ -415,4 +423,4 @@
415 423
    ///member functions called \ref run(Node) "run()".\n
416
    ///If you need more control on the execution, first you have to call
417
    ///\ref init(), then you can add several source nodes with
424
    ///If you need better control on the execution, you have to call
425
    ///\ref init() first, then you can add several source nodes with
418 426
    ///\ref addSource(). Finally the actual path computation can be
... ...
@@ -702,8 +710,4 @@
702 710

	
703
    ///This method runs the %BFS algorithm in order to
704
    ///compute the shortest path to each node.
705
    ///
706
    ///The algorithm computes
707
    ///- the shortest path tree (forest),
708
    ///- the distance of each node from the root(s).
711
    ///This method runs the %BFS algorithm in order to visit all nodes
712
    ///in the digraph.
709 713
    ///
... ...
@@ -739,5 +743,5 @@
739 743

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

	
742
    ///Returns the shortest path to a node.
746
    ///Returns the shortest path to the given node from the root(s).
743 747
    ///
... ...
@@ -749,5 +753,5 @@
749 753

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

	
752
    ///Returns the distance of a node from the root(s).
756
    ///Returns the distance of the given node from the root(s).
753 757
    ///
... ...
@@ -760,4 +764,5 @@
760 764

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

	
765
    ///\brief Returns the 'previous arc' of the shortest path tree for
766
    ///the given node.
767
    ///
763 768
    ///This function returns the 'previous arc' of the shortest path
... ...
@@ -768,3 +773,3 @@
768 773
    ///The shortest path tree used here is equal to the shortest path
769
    ///tree used in \ref predNode().
774
    ///tree used in \ref predNode() and \ref predMap().
770 775
    ///
... ...
@@ -774,7 +779,8 @@
774 779

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

	
780
    ///\brief Returns the 'previous node' of the shortest path tree for
781
    ///the given node.
782
    ///
777 783
    ///This function returns the 'previous node' of the shortest path
778 784
    ///tree for the node \c v, i.e. it returns the last but one node
779
    ///from a shortest path from a root to \c v. It is \c INVALID
785
    ///of a shortest path from a root to \c v. It is \c INVALID
780 786
    ///if \c v is not reached from the root(s) or if \c v is a root.
... ...
@@ -782,3 +788,3 @@
782 788
    ///The shortest path tree used here is equal to the shortest path
783
    ///tree used in \ref predArc().
789
    ///tree used in \ref predArc() and \ref predMap().
784 790
    ///
... ...
@@ -803,3 +809,3 @@
803 809
    ///Returns a const reference to the node map that stores the predecessor
804
    ///arcs, which form the shortest path tree.
810
    ///arcs, which form the shortest path tree (forest).
805 811
    ///
... ...
@@ -809,3 +815,3 @@
809 815

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

	
... ...
@@ -835,3 +841,3 @@
835 841
    ///arcs of the shortest paths.
836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
842
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
837 843
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
... ...
@@ -850,4 +856,4 @@
850 856
    ///The type of the map that indicates which nodes are processed.
851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
852
    ///By default it is a NullMap.
857
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
858
    ///By default, it is a NullMap.
853 859
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
... ...
@@ -870,3 +876,4 @@
870 876
    ///The type of the map that indicates which nodes are reached.
871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
877
    ///It must conform to
878
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 879
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
... ...
@@ -885,3 +892,3 @@
885 892
    ///The type of the map that stores the distances of the nodes.
886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
893
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
887 894
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -900,3 +907,3 @@
900 907
    ///The type of the shortest paths.
901
    ///It must meet the \ref concepts::Path "Path" concept.
908
    ///It must conform to the \ref concepts::Path "Path" concept.
902 909
    typedef lemon::Path<Digraph> Path;
... ...
@@ -906,8 +913,4 @@
906 913

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

	
940
    /// This constructor does not require parameters, therefore it initiates
943
    /// This constructor does not require parameters, it initiates
941 944
    /// all of the attributes to \c 0.
... ...
@@ -964,2 +967,5 @@
964 967
  /// which makes it easier to use the algorithm.
968
  ///
969
  /// \tparam TR The traits class that defines various types used by the
970
  /// algorithm.
965 971
  template<class TR>
... ...
@@ -969,3 +975,2 @@
969 975

	
970
    ///The type of the digraph the algorithm runs on.
971 976
    typedef typename TR::Digraph Digraph;
... ...
@@ -977,12 +982,6 @@
977 982

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

	
1057
    ///This method runs BFS algorithm in order to compute
1058
    ///the shortest path to each node.
1056
    ///This method runs BFS algorithm in order to visit all nodes
1057
    ///in the digraph.
1059 1058
    void run()
... ...
@@ -1069,7 +1068,8 @@
1069 1068
    };
1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting PredMap object.
1069

	
1070
    ///\brief \ref named-templ-param "Named parameter" for setting
1071
    ///the predecessor map.
1072 1072
    ///
1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting PredMap object.
1073
    ///\ref named-templ-param "Named parameter" function for setting
1074
    ///the map that stores the predecessor arcs of the nodes.
1075 1075
    template<class T>
... ...
@@ -1087,7 +1087,8 @@
1087 1087
    };
1088
    ///\brief \ref named-func-param "Named parameter"
1089
    ///for setting ReachedMap object.
1088

	
1089
    ///\brief \ref named-templ-param "Named parameter" for setting
1090
    ///the reached map.
1090 1091
    ///
1091
    /// \ref named-func-param "Named parameter"
1092
    ///for setting ReachedMap object.
1092
    ///\ref named-templ-param "Named parameter" function for setting
1093
    ///the map that indicates which nodes are reached.
1093 1094
    template<class T>
... ...
@@ -1105,7 +1106,9 @@
1105 1106
    };
1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting DistMap object.
1107

	
1108
    ///\brief \ref named-templ-param "Named parameter" for setting
1109
    ///the distance map.
1108 1110
    ///
1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting DistMap object.
1111
    ///\ref named-templ-param "Named parameter" function for setting
1112
    ///the map that stores the distances of the nodes calculated
1113
    ///by the algorithm.
1111 1114
    template<class T>
... ...
@@ -1123,7 +1126,8 @@
1123 1126
    };
1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting ProcessedMap object.
1127

	
1128
    ///\brief \ref named-func-param "Named parameter" for setting
1129
    ///the processed map.
1126 1130
    ///
1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting ProcessedMap object.
1131
    ///\ref named-templ-param "Named parameter" function for setting
1132
    ///the map that indicates which nodes are processed.
1129 1133
    template<class T>
... ...
@@ -1266,3 +1270,4 @@
1266 1270
    /// The type of the map that indicates which nodes are reached.
1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1271
    /// It must conform to
1272
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1273
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
... ...
@@ -1304,7 +1309,7 @@
1304 1309
  /// events, you should implement your own visitor class.
1305
  /// \tparam TR Traits class to set various data types used by the
1306
  /// algorithm. The default traits class is
1307
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1308
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309
  /// a BFS visit traits class.
1310
  /// \tparam TR The traits class that defines various types used by the
1311
  /// algorithm. By default, it is \ref BfsVisitDefaultTraits
1312
  /// "BfsVisitDefaultTraits<GR>".
1313
  /// In most cases, this parameter should not be set directly,
1314
  /// consider to use the named template parameters instead.
1310 1315
#ifdef DOXYGEN
... ...
@@ -1427,4 +1432,4 @@
1427 1432
    /// member functions called \ref run(Node) "run()".\n
1428
    /// If you need more control on the execution, first you have to call
1429
    /// \ref init(), then you can add several source nodes with
1433
    /// If you need better control on the execution, you have to call
1434
    /// \ref init() first, then you can add several source nodes with
1430 1435
    /// \ref addSource(). Finally the actual path computation can be
... ...
@@ -1700,8 +1705,4 @@
1700 1705
    ///
1701
    /// This method runs the %BFS algorithm in order to
1702
    /// compute the shortest path to each node.
1703
    ///
1704
    /// The algorithm computes
1705
    /// - the shortest path tree (forest),
1706
    /// - the distance of each node from the root(s).
1706
    /// This method runs the %BFS algorithm in order to visit all nodes
1707
    /// in the digraph.
1707 1708
    ///
... ...
@@ -1737,3 +1738,3 @@
1737 1738

	
1738
    /// \brief Checks if a node is reached from the root(s).
1739
    /// \brief Checks if the given node is reached from the root(s).
1739 1740
    ///
Ignore white space 6 line context
... ...
@@ -21,5 +21,5 @@
21 21

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

	
... ...
@@ -31,41 +31,37 @@
31 31

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

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

	
67
    /// \brief Type to represent the items states.
63
    /// \brief Type to represent the states of the items.
68 64
    ///
69
    /// Each Item element have a state associated to it. It may be "in heap",
70
    /// "pre heap" or "post heap". The latter two are indifferent from the
65
    /// Each item has a state associated to it. It can be "in heap",
66
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
71 67
    /// heap's point of view, but may be useful to the user.
... ...
@@ -86,18 +82,18 @@
86 82
  public:
87
    /// \brief The constructor.
83

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

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

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

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

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

	
130
    static int second_child(int i) { return 2*i+2; }
127
    static int secondChild(int i) { return 2*i+2; }
131 128
    bool less(const Pair &p1, const Pair &p2) const {
... ...
@@ -134,3 +131,3 @@
134 131

	
135
    int bubble_up(int hole, Pair p) {
132
    int bubbleUp(int hole, Pair p) {
136 133
      int par = parent(hole);
... ...
@@ -145,4 +142,4 @@
145 142

	
146
    int bubble_down(int hole, Pair p, int length) {
147
      int child = second_child(hole);
143
    int bubbleDown(int hole, Pair p, int length) {
144
      int child = secondChild(hole);
148 145
      while(child < length) {
... ...
@@ -155,3 +152,3 @@
155 152
        hole = child;
156
        child = second_child(hole);
153
        child = secondChild(hole);
157 154
      }
... ...
@@ -173,6 +170,9 @@
173 170
  public:
171

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

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

	
191
    /// \brief Returns the item with minimum priority relative to \c Compare.
193
    /// \brief Return the item having minimum priority.
192 194
    ///
193
    /// This method returns the item with minimum priority relative to \c
194
    /// Compare.
195
    /// \pre The heap must be nonempty.
195
    /// This function returns the item having minimum priority.
196
    /// \pre The heap must be non-empty.
196 197
    Item top() const {
... ...
@@ -199,6 +200,6 @@
199 200

	
200
    /// \brief Returns the minimum priority relative to \c Compare.
201
    /// \brief The minimum priority.
201 202
    ///
202
    /// It returns the minimum priority relative to \c Compare.
203
    /// \pre The heap must be nonempty.
203
    /// This function returns the minimum priority.
204
    /// \pre The heap must be non-empty.
204 205
    Prio prio() const {
... ...
@@ -207,6 +208,5 @@
207 208

	
208
    /// \brief Deletes the item with minimum priority relative to \c Compare.
209
    /// \brief Remove the item having minimum priority.
209 210
    ///
210
    /// This method deletes the item with minimum priority relative to \c
211
    /// Compare from the heap.
211
    /// This function removes the item having minimum priority.
212 212
    /// \pre The heap must be non-empty.
... ...
@@ -216,3 +216,3 @@
216 216
      if (n > 0) {
217
        bubble_down(0, _data[n], n);
217
        bubbleDown(0, _data[n], n);
218 218
      }
... ...
@@ -221,7 +221,8 @@
221 221

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

	
239

	
240
    /// \brief Returns the priority of \c i.
240
    /// \brief The priority of the given item.
241 241
    ///
242
    /// This function returns the priority of item \c i.
242
    /// This function returns the priority of the given item.
243 243
    /// \param i The item.
244
    /// \pre \c i must be in the heap.
244
    /// \pre \e i must be in the heap.
245 245
    Prio operator[](const Item &i) const {
... ...
@@ -249,7 +249,8 @@
249 249

	
250
    /// \brief \c i gets to the heap with priority \c p independently
251
    /// if \c i was already there.
250
    /// \brief Set the priority of an item or insert it, if it is
251
    /// not stored in the heap.
252 252
    ///
253
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
254
    /// in the heap and sets the priority of \c i to \c p otherwise.
253
    /// This method sets the priority of the given item if it is
254
    /// already stored in the heap. Otherwise it inserts the given
255
    /// item into the heap with the given priority.
255 256
    /// \param i The item.
... ...
@@ -262,6 +263,6 @@
262 263
      else if( _comp(p, _data[idx].second) ) {
263
        bubble_up(idx, Pair(i,p));
264
        bubbleUp(idx, Pair(i,p));
264 265
      }
265 266
      else {
266
        bubble_down(idx, Pair(i,p), _data.size());
267
        bubbleDown(idx, Pair(i,p), _data.size());
267 268
      }
... ...
@@ -269,33 +270,31 @@
269 270

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

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

	
294
    /// \brief Returns if \c item is in, has already been in, or has
295
    /// never been in the heap.
293
    /// \brief Return the state of an item.
296 294
    ///
297
    /// This method returns PRE_HEAP if \c item has never been in the
298
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
299
    /// otherwise. In the latter case it is possible that \c item will
300
    /// get back to the heap again.
295
    /// This method returns \c PRE_HEAP if the given item has never
296
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
297
    /// and \c POST_HEAP otherwise.
298
    /// In the latter case it is possible that the item will get back
299
    /// to the heap again.
301 300
    /// \param i The item.
... ...
@@ -308,7 +307,7 @@
308 307

	
309
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
310 309
    ///
311
    /// Sets the state of the \c item in the heap. It can be used to
312
    /// manually clear the heap when it is important to achive the
313
    /// better time complexity.
310
    /// This function sets the state of the given item in the heap.
311
    /// It can be used to manually clear the heap when it is important
312
    /// to achive better time complexity.
314 313
    /// \param i The item.
... ...
@@ -329,8 +328,9 @@
329 328

	
330
    /// \brief Replaces an item in the heap.
329
    /// \brief Replace an item in the heap.
331 330
    ///
332
    /// The \c i item is replaced with \c j item. The \c i item should
333
    /// be in the heap, while the \c j should be out of the heap. The
334
    /// \c i item will out of the heap and \c j will be in the heap
335
    /// with the same prioriority as prevoiusly the \c i item.
331
    /// This function replaces item \c i with item \c j.
332
    /// Item \c i must be in the heap, while \c j must be out of the heap.
333
    /// After calling this method, item \c i will be out of the
334
    /// heap and \c j will be in the heap with the same prioriority
335
    /// as item \c i had before.
336 336
    void replace(const Item& i, const Item& j) {
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -72,3 +72,3 @@
72 72
  private:
73
  
73

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

	
161 161
    typedef typename Parent::GraphType GraphType;
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -65,7 +65,7 @@
65 65
      if (n == Parent::source(e))
66
	return Parent::target(e);
66
        return Parent::target(e);
67 67
      else if(n==Parent::target(e))
68
	return Parent::source(e);
68
        return Parent::source(e);
69 69
      else
70
	return INVALID;
70
        return INVALID;
71 71
    }
... ...
@@ -93,3 +93,3 @@
93 93

	
94
    class NodeIt : public Node { 
94
    class NodeIt : public Node {
95 95
      const Digraph* digraph;
... ...
@@ -102,11 +102,11 @@
102 102
      explicit NodeIt(const Digraph& _graph) : digraph(&_graph) {
103
	_graph.first(static_cast<Node&>(*this));
103
        _graph.first(static_cast<Node&>(*this));
104 104
      }
105 105

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

	
109
      NodeIt& operator++() { 
110
	digraph->next(*this);
111
	return *this; 
109
      NodeIt& operator++() {
110
        digraph->next(*this);
111
        return *this;
112 112
      }
... ...
@@ -116,3 +116,3 @@
116 116

	
117
    class ArcIt : public Arc { 
117
    class ArcIt : public Arc {
118 118
      const Digraph* digraph;
... ...
@@ -125,11 +125,11 @@
125 125
      explicit ArcIt(const Digraph& _graph) : digraph(&_graph) {
126
	_graph.first(static_cast<Arc&>(*this));
126
        _graph.first(static_cast<Arc&>(*this));
127 127
      }
128 128

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

	
132
      ArcIt& operator++() { 
133
	digraph->next(*this);
134
	return *this; 
132
      ArcIt& operator++() {
133
        digraph->next(*this);
134
        return *this;
135 135
      }
... ...
@@ -139,3 +139,3 @@
139 139

	
140
    class OutArcIt : public Arc { 
140
    class OutArcIt : public Arc {
141 141
      const Digraph* digraph;
... ...
@@ -147,13 +147,13 @@
147 147

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

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

	
156
      OutArcIt& operator++() { 
157
	digraph->nextOut(*this);
158
	return *this; 
156
      OutArcIt& operator++() {
157
        digraph->nextOut(*this);
158
        return *this;
159 159
      }
... ...
@@ -163,3 +163,3 @@
163 163

	
164
    class InArcIt : public Arc { 
164
    class InArcIt : public Arc {
165 165
      const Digraph* digraph;
... ...
@@ -171,13 +171,13 @@
171 171

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

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

	
180
      InArcIt& operator++() { 
181
	digraph->nextIn(*this);
182
	return *this; 
180
      InArcIt& operator++() {
181
        digraph->nextIn(*this);
182
        return *this;
183 183
      }
... ...
@@ -217,5 +217,5 @@
217 217
    // Mappable extension
218
    
218

	
219 219
    template <typename _Value>
220
    class ArcMap 
220
    class ArcMap
221 221
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
... ...
@@ -224,9 +224,9 @@
224 224
    public:
225
      explicit ArcMap(const Digraph& _g) 
226
	: Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v) 
228
	: Parent(_g, _v) {}
225
      explicit ArcMap(const Digraph& _g)
226
        : Parent(_g) {}
227
      ArcMap(const Digraph& _g, const _Value& _v)
228
        : Parent(_g, _v) {}
229 229

	
230 230
      ArcMap& operator=(const ArcMap& cmap) {
231
	return operator=<ArcMap>(cmap);
231
        return operator=<ArcMap>(cmap);
232 232
      }
... ...
@@ -236,3 +236,3 @@
236 236
        Parent::operator=(cmap);
237
	return *this;
237
        return *this;
238 238
      }
... ...
@@ -249,3 +249,3 @@
249 249
    }
250
    
250

	
251 251
    void clear() {
... ...
@@ -314,7 +314,7 @@
314 314
      if( n == Parent::u(e))
315
	return Parent::v(e);
315
        return Parent::v(e);
316 316
      else if( n == Parent::v(e))
317
	return Parent::u(e);
317
        return Parent::u(e);
318 318
      else
319
	return INVALID;
319
        return INVALID;
320 320
    }
... ...
@@ -342,3 +342,3 @@
342 342
    using Parent::notifier;
343
    
343

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

	
353
    class NodeIt : public Node { 
353
    class NodeIt : public Node {
354 354
      const Graph* graph;
... ...
@@ -361,11 +361,11 @@
361 361
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
362
	_graph.first(static_cast<Node&>(*this));
362
        _graph.first(static_cast<Node&>(*this));
363 363
      }
364 364

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

	
368
      NodeIt& operator++() { 
369
	graph->next(*this);
370
	return *this; 
368
      NodeIt& operator++() {
369
        graph->next(*this);
370
        return *this;
371 371
      }
... ...
@@ -375,3 +375,3 @@
375 375

	
376
    class ArcIt : public Arc { 
376
    class ArcIt : public Arc {
377 377
      const Graph* graph;
... ...
@@ -384,11 +384,11 @@
384 384
      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
385
	_graph.first(static_cast<Arc&>(*this));
385
        _graph.first(static_cast<Arc&>(*this));
386 386
      }
387 387

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

	
391
      ArcIt& operator++() { 
392
	graph->next(*this);
393
	return *this; 
391
      ArcIt& operator++() {
392
        graph->next(*this);
393
        return *this;
394 394
      }
... ...
@@ -398,3 +398,3 @@
398 398

	
399
    class OutArcIt : public Arc { 
399
    class OutArcIt : public Arc {
400 400
      const Graph* graph;
... ...
@@ -406,13 +406,13 @@
406 406

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

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

	
415
      OutArcIt& operator++() { 
416
	graph->nextOut(*this);
417
	return *this; 
415
      OutArcIt& operator++() {
416
        graph->nextOut(*this);
417
        return *this;
418 418
      }
... ...
@@ -422,3 +422,3 @@
422 422

	
423
    class InArcIt : public Arc { 
423
    class InArcIt : public Arc {
424 424
      const Graph* graph;
... ...
@@ -430,13 +430,13 @@
430 430

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

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

	
439
      InArcIt& operator++() { 
440
	graph->nextIn(*this);
441
	return *this; 
439
      InArcIt& operator++() {
440
        graph->nextIn(*this);
441
        return *this;
442 442
      }
... ...
@@ -446,3 +446,3 @@
446 446

	
447
    class EdgeIt : public Parent::Edge { 
447
    class EdgeIt : public Parent::Edge {
448 448
      const Graph* graph;
... ...
@@ -455,11 +455,11 @@
455 455
      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
456
	_graph.first(static_cast<Edge&>(*this));
456
        _graph.first(static_cast<Edge&>(*this));
457 457
      }
458 458

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

	
462
      EdgeIt& operator++() { 
463
	graph->next(*this);
464
	return *this; 
462
      EdgeIt& operator++() {
463
        graph->next(*this);
464
        return *this;
465 465
      }
... ...
@@ -479,3 +479,3 @@
479 479
      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
480
	_graph.firstInc(*this, direction, n);
480
        _graph.firstInc(*this, direction, n);
481 481
      }
... ...
@@ -483,4 +483,4 @@
483 483
      IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)
484
	: graph(&_graph), Edge(ue) {
485
	direction = (_graph.source(ue) == n);
484
        : graph(&_graph), Edge(ue) {
485
        direction = (_graph.source(ue) == n);
486 486
      }
... ...
@@ -488,4 +488,4 @@
488 488
      IncEdgeIt& operator++() {
489
	graph->nextInc(*this, direction);
490
	return *this; 
489
        graph->nextInc(*this, direction);
490
        return *this;
491 491
      }
... ...
@@ -536,3 +536,3 @@
536 536
    template <typename _Value>
537
    class ArcMap 
537
    class ArcMap
538 538
      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
... ...
@@ -541,9 +541,9 @@
541 541
    public:
542
      explicit ArcMap(const Graph& _g) 
543
	: Parent(_g) {}
544
      ArcMap(const Graph& _g, const _Value& _v) 
545
	: Parent(_g, _v) {}
542
      explicit ArcMap(const Graph& _g)
543
        : Parent(_g) {}
544
      ArcMap(const Graph& _g, const _Value& _v)
545
        : Parent(_g, _v) {}
546 546

	
547 547
      ArcMap& operator=(const ArcMap& cmap) {
548
	return operator=<ArcMap>(cmap);
548
        return operator=<ArcMap>(cmap);
549 549
      }
... ...
@@ -553,3 +553,3 @@
553 553
        Parent::operator=(cmap);
554
	return *this;
554
        return *this;
555 555
      }
... ...
@@ -560,3 +560,3 @@
560 560
    template <typename _Value>
561
    class EdgeMap 
561
    class EdgeMap
562 562
      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
... ...
@@ -565,10 +565,10 @@
565 565
    public:
566
      explicit EdgeMap(const Graph& _g) 
567
	: Parent(_g) {}
566
      explicit EdgeMap(const Graph& _g)
567
        : Parent(_g) {}
568 568

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

	
572 572
      EdgeMap& operator=(const EdgeMap& cmap) {
573
	return operator=<EdgeMap>(cmap);
573
        return operator=<EdgeMap>(cmap);
574 574
      }
... ...
@@ -578,3 +578,3 @@
578 578
        Parent::operator=(cmap);
579
	return *this;
579
        return *this;
580 580
      }
... ...
@@ -595,3 +595,3 @@
595 595
    }
596
    
596

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

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

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

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

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

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

	
366
    Edge fromId(int id, Edge) const {
366
    static Edge fromId(int id, Edge) {
367 367
      return Parent::edgeFromId(id);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -100,3 +100,3 @@
100 100
      char buf1[11], buf2[9], buf3[5];
101
	  if (GetDateFormat(MY_LOCALE, 0, &time,
101
          if (GetDateFormat(MY_LOCALE, 0, &time,
102 102
                        ("ddd MMM dd"), buf1, 11) &&
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -21,5 +21,5 @@
21 21

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

	
... ...
@@ -55,19 +55,24 @@
55 55

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

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

	
... ...
@@ -91,6 +97,6 @@
91 97

	
92
    /// \brief Type to represent the items states.
98
    /// \brief Type to represent the states of the items.
93 99
    ///
94
    /// Each Item element have a state associated to it. It may be "in heap",
95
    /// "pre heap" or "post heap". The latter two are indifferent from the
100
    /// Each item has a state associated to it. It can be "in heap",
101
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
96 102
    /// heap's point of view, but may be useful to the user.
... ...
@@ -106,26 +112,28 @@
106 112
  public:
107
    /// \brief The constructor.
113

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

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

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

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

	
137
    void relocate_last(int idx) {
145
    void relocateLast(int idx) {
138 146
      if (idx + 1 < int(_data.size())) {
... ...
@@ -176,6 +184,9 @@
176 184
  public:
185

	
177 186
    /// \brief Insert a pair of item and priority into the heap.
178 187
    ///
179
    /// Adds \c p.first to the heap with priority \c p.second.
188
    /// This function inserts \c p.first to the heap with priority
189
    /// \c p.second.
180 190
    /// \param p The pair to insert.
191
    /// \pre \c p.first must not be stored in the heap.
181 192
    void push(const Pair& p) {
... ...
@@ -186,5 +197,7 @@
186 197
    ///
187
    /// Adds \c i to the heap with priority \c p.
198
    /// This function inserts the given item into the heap with the
199
    /// given priority.
188 200
    /// \param i The item to insert.
189 201
    /// \param p The priority of the item.
202
    /// \pre \e i must not be stored in the heap.
190 203
    void push(const Item &i, const Prio &p) {
... ...
@@ -199,6 +212,6 @@
199 212

	
200
    /// \brief Returns the item with minimum priority.
213
    /// \brief Return the item having minimum priority.
201 214
    ///
202
    /// This method returns the item with minimum priority.
203
    /// \pre The heap must be nonempty.
215
    /// This function returns the item having minimum priority.
216
    /// \pre The heap must be non-empty.
204 217
    Item top() const {
... ...
@@ -210,6 +223,6 @@
210 223

	
211
    /// \brief Returns the minimum priority.
224
    /// \brief The minimum priority.
212 225
    ///
213
    /// It returns the minimum priority.
214
    /// \pre The heap must be nonempty.
226
    /// This function returns the minimum priority.
227
    /// \pre The heap must be non-empty.
215 228
    Prio prio() const {
... ...
@@ -221,5 +234,5 @@
221 234

	
222
    /// \brief Deletes the item with minimum priority.
235
    /// \brief Remove the item having minimum priority.
223 236
    ///
224
    /// This method deletes the item with minimum priority from the heap.
237
    /// This function removes the item having minimum priority.
225 238
    /// \pre The heap must be non-empty.
... ...
@@ -232,10 +245,11 @@
232 245
      unlace(idx);
233
      relocate_last(idx);
246
      relocateLast(idx);
234 247
    }
235 248

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

	
248

	
249
    /// \brief Returns the priority of \c i.
262
    /// \brief The priority of the given item.
250 263
    ///
251
    /// This function returns the priority of item \c i.
252
    /// \pre \c i must be in the heap.
264
    /// This function returns the priority of the given item.
253 265
    /// \param i The item.
266
    /// \pre \e i must be in the heap.
254 267
    Prio operator[](const Item &i) const {
... ...
@@ -258,7 +271,8 @@
258 271

	
259
    /// \brief \c i gets to the heap with priority \c p independently
260
    /// if \c i was already there.
272
    /// \brief Set the priority of an item or insert it, if it is
273
    /// not stored in the heap.
261 274
    ///
262
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
263
    /// in the heap and sets the priority of \c i to \c p otherwise.
275
    /// This method sets the priority of the given item if it is
276
    /// already stored in the heap. Otherwise it inserts the given
277
    /// item into the heap with the given priority.
264 278
    /// \param i The item.
... ...
@@ -276,9 +290,8 @@
276 290

	
277
    /// \brief Decreases the priority of \c i to \c p.
291
    /// \brief Decrease the priority of an item to the given value.
278 292
    ///
279
    /// This method decreases the priority of item \c i to \c p.
280
    /// \pre \c i must be stored in the heap with priority at least \c
281
    /// p relative to \c Compare.
293
    /// This function decreases the priority of an item to the given value.
282 294
    /// \param i The item.
283 295
    /// \param p The priority.
296
    /// \pre \e i must be stored in the heap with priority at least \e p.
284 297
    void decrease(const Item &i, const Prio &p) {
... ...
@@ -293,9 +306,8 @@
293 306

	
294
    /// \brief Increases the priority of \c i to \c p.
307
    /// \brief Increase the priority of an item to the given value.
295 308
    ///
296
    /// This method sets the priority of item \c i to \c p.
297
    /// \pre \c i must be stored in the heap with priority at most \c
298
    /// p relative to \c Compare.
309
    /// This function increases the priority of an item to the given value.
299 310
    /// \param i The item.
300 311
    /// \param p The priority.
312
    /// \pre \e i must be stored in the heap with priority at most \e p.
301 313
    void increase(const Item &i, const Prio &p) {
... ...
@@ -307,9 +319,9 @@
307 319

	
308
    /// \brief Returns if \c item is in, has already been in, or has
309
    /// never been in the heap.
320
    /// \brief Return the state of an item.
310 321
    ///
311
    /// This method returns PRE_HEAP if \c item has never been in the
312
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
313
    /// otherwise. In the latter case it is possible that \c item will
314
    /// get back to the heap again.
322
    /// This method returns \c PRE_HEAP if the given item has never
323
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
324
    /// and \c POST_HEAP otherwise.
325
    /// In the latter case it is possible that the item will get back
326
    /// to the heap again.
315 327
    /// \param i The item.
... ...
@@ -321,7 +333,7 @@
321 333

	
322
    /// \brief Sets the state of the \c item in the heap.
334
    /// \brief Set the state of an item in the heap.
323 335
    ///
324
    /// Sets the state of the \c item in the heap. It can be used to
325
    /// manually clear the heap when it is important to achive the
326
    /// better time complexity.
336
    /// This function sets the state of the given item in the heap.
337
    /// It can be used to manually clear the heap when it is important
338
    /// to achive better time complexity.
327 339
    /// \param i The item.
... ...
@@ -361,19 +373,25 @@
361 373

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

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

	
... ...
@@ -395,6 +418,6 @@
395 418

	
396
    /// \brief Type to represent the items states.
419
    /// \brief Type to represent the states of the items.
397 420
    ///
398
    /// Each Item element have a state associated to it. It may be "in heap",
399
    /// "pre heap" or "post heap". The latter two are indifferent from the
421
    /// Each item has a state associated to it. It can be "in heap",
422
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
400 423
    /// heap's point of view, but may be useful to the user.
... ...
@@ -411,8 +434,8 @@
411 434

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

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

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

	
431
    /// \brief Make empty this heap.
454
    /// \brief Make the heap empty.
432 455
    ///
433
    /// Make empty this heap. It does not change the cross reference
434
    /// map.  If you want to reuse a heap what is not surely empty you
435
    /// should first clear the heap and after that you should set the
436
    /// cross reference map for each item to \c PRE_HEAP.
456
    /// This functon makes the heap empty.
457
    /// It does not change the cross reference map. If you want to reuse
458
    /// a heap that is not surely empty, you should first clear it and
459
    /// then you should set the cross reference map to \c PRE_HEAP
460
    /// for each item.
437 461
    void clear() {
... ...
@@ -442,4 +466,6 @@
442 466
    ///
443
    /// Adds \c p.first to the heap with priority \c p.second.
467
    /// This function inserts \c p.first to the heap with priority
468
    /// \c p.second.
444 469
    /// \param p The pair to insert.
470
    /// \pre \c p.first must not be stored in the heap.
445 471
    void push(const Pair& p) {
... ...
@@ -450,5 +476,7 @@
450 476
    ///
451
    /// Adds \c i to the heap with priority \c p.
477
    /// This function inserts the given item into the heap with the
478
    /// given priority.
452 479
    /// \param i The item to insert.
453 480
    /// \param p The priority of the item.
481
    /// \pre \e i must not be stored in the heap.
454 482
    void push(const Item &i, const Prio &p) {
... ...
@@ -473,6 +501,6 @@
473 501

	
474
    /// \brief Returns the item with minimum priority.
502
    /// \brief Return the item having minimum priority.
475 503
    ///
476
    /// This method returns the item with minimum priority.
477
    /// \pre The heap must be nonempty.
504
    /// This function returns the item having minimum priority.
505
    /// \pre The heap must be non-empty.
478 506
    Item top() const {
... ...
@@ -484,6 +512,6 @@
484 512

	
485
    /// \brief Returns the minimum priority.
513
    /// \brief The minimum priority.
486 514
    ///
487
    /// It returns the minimum priority.
488
    /// \pre The heap must be nonempty.
515
    /// This function returns the minimum priority.
516
    /// \pre The heap must be non-empty.
489 517
    Prio prio() const {
... ...
@@ -495,5 +523,5 @@
495 523

	
496
    /// \brief Deletes the item with minimum priority.
524
    /// \brief Remove the item having minimum priority.
497 525
    ///
498
    /// This method deletes the item with minimum priority from the heap.
526
    /// This function removes the item having minimum priority.
499 527
    /// \pre The heap must be non-empty.
... ...
@@ -511,12 +539,11 @@
511 539

	
512
    /// \brief Returns the priority of \c i.
540
    /// \brief The priority of the given item.
513 541
    ///
514
    /// This function returns the priority of item \c i.
515
    /// \warning This operator is not a constant time function
516
    /// because it scans the whole data structure to find the proper
517
    /// value.
518
    /// \pre \c i must be in the heap.
542
    /// This function returns the priority of the given item.
519 543
    /// \param i The item.
544
    /// \pre \e i must be in the heap.
545
    /// \warning This operator is not a constant time function because
546
    /// it scans the whole data structure to find the proper value.
520 547
    Prio operator[](const Item &i) const {
521
      for (int k = 0; k < _first.size(); ++k) {
548
      for (int k = 0; k < int(_first.size()); ++k) {
522 549
        int idx = _first[k];
... ...
@@ -532,9 +559,9 @@
532 559

	
533
    /// \brief Returns if \c item is in, has already been in, or has
534
    /// never been in the heap.
560
    /// \brief Return the state of an item.
535 561
    ///
536
    /// This method returns PRE_HEAP if \c item has never been in the
537
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
538
    /// otherwise. In the latter case it is possible that \c item will
539
    /// get back to the heap again.
562
    /// This method returns \c PRE_HEAP if the given item has never
563
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
564
    /// and \c POST_HEAP otherwise.
565
    /// In the latter case it is possible that the item will get back
566
    /// to the heap again.
540 567
    /// \param i The item.
Ignore white space 6 line context
... ...
@@ -96,2 +96,14 @@
96 96

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

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

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

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

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

	
123
    
124

	
124 125

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

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

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

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

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

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

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

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

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

	
81 94

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

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

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

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

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

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

	
62
      /// Defalult constructor.
63

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

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

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

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

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

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

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

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

	
112 105
      };
113 106

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
459 460
      private:
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -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,21 +389,21 @@
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&) { }
392
        ///Next arc
405
        /// Next arc
393 406

	
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,9 +447,8 @@
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&) { }
443
        ///Next outgoing arc
453
        /// Next outgoing arc
444 454

	
... ...
@@ -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

	
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -20,3 +20,3 @@
20 20
///\file
21
///\brief The concept of graph components.
21
///\brief The concepts of graph components.
22 22

	
... ...
@@ -40,3 +40,3 @@
40 40
    /// create graph skeleton classes. The reason for this is that \c Node
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same 
41
    /// and \c Arc (or \c Edge) types should \e not derive from the same
42 42
    /// base class. For \c Node you should instantiate it with character
... ...
@@ -91,6 +91,6 @@
91 91
      /// This operator defines an ordering of the items.
92
      /// It makes possible to use graph item types as key types in 
92
      /// It makes possible to use graph item types as key types in
93 93
      /// associative containers (e.g. \c std::map).
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
... ...
@@ -124,3 +124,3 @@
124 124
    /// All digraph %concepts have to conform to this class.
125
    /// It just provides types for nodes and arcs and functions 
125
    /// It just provides types for nodes and arcs and functions
126 126
    /// to get the source and the target nodes of arcs.
... ...
@@ -428,3 +428,3 @@
428 428
    ///
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and 
429
    /// This class describes the concept of \c NodeIt, \c ArcIt and
430 430
    /// \c EdgeIt subtypes of digraph and graph types.
... ...
@@ -468,3 +468,3 @@
468 468
      GraphItemIt& operator++() { return *this; }
469
 
469

	
470 470
      /// \brief Equality operator
... ...
@@ -503,6 +503,6 @@
503 503

	
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and 
504
    /// \brief Concept class for \c InArcIt, \c OutArcIt and
505 505
    /// \c IncEdgeIt types.
506 506
    ///
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt 
507
    /// This class describes the concept of \c InArcIt, \c OutArcIt
508 508
    /// and \c IncEdgeIt subtypes of digraph and graph types.
... ...
@@ -511,3 +511,3 @@
511 511
    /// base class, there is an additional template parameter (selector)
512
    /// \c sel. For \c InArcIt you should instantiate it with character 
512
    /// \c sel. For \c InArcIt you should instantiate it with character
513 513
    /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
... ...
@@ -532,6 +532,6 @@
532 532

	
533
      /// \brief Constructor that sets the iterator to the first 
533
      /// \brief Constructor that sets the iterator to the first
534 534
      /// incoming or outgoing arc.
535 535
      ///
536
      /// Constructor that sets the iterator to the first arc 
536
      /// Constructor that sets the iterator to the first arc
537 537
      /// incoming to or outgoing from the given node.
... ...
@@ -806,5 +806,5 @@
806 806
      ///
807
      /// This function gives back the first edge incident to the given 
807
      /// This function gives back the first edge incident to the given
808 808
      /// node. The bool parameter gives back the direction for which the
809
      /// source node of the directed arc representing the edge is the 
809
      /// source node of the directed arc representing the edge is the
810 810
      /// given node.
... ...
@@ -815,3 +815,3 @@
815 815
      ///
816
      /// This function gives back the next edge incident to the given 
816
      /// This function gives back the next edge incident to the given
817 817
      /// node. The bool parameter should be used as \c firstInc() use it.
... ...
@@ -992,3 +992,3 @@
992 992
    /// This class describes the concept of standard graph maps, i.e.
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and 
993
    /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and
994 994
    /// graph types, which can be used for associating data to graph items.
... ...
@@ -1047,3 +1047,3 @@
1047 1047
          _Map m2(g,t);
1048
          
1048

	
1049 1049
          // Copy constructor
... ...
@@ -1070,3 +1070,3 @@
1070 1070
    /// This class describes the interface of mappable directed graphs.
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph 
1071
    /// It extends \ref BaseDigraphComponent with the standard digraph
1072 1072
    /// map classes, namely \c NodeMap and \c ArcMap.
... ...
@@ -1207,3 +1207,3 @@
1207 1207
    /// This class describes the interface of mappable undirected graphs.
1208
    /// It extends \ref MappableDigraphComponent with the standard graph 
1208
    /// It extends \ref MappableDigraphComponent with the standard graph
1209 1209
    /// map class for edges (\c EdgeMap).
... ...
@@ -1292,3 +1292,3 @@
1292 1292
    /// This class describes the interface of extendable directed graphs.
1293
    /// It extends \ref BaseDigraphComponent with functions for adding 
1293
    /// It extends \ref BaseDigraphComponent with functions for adding
1294 1294
    /// nodes and arcs to the digraph.
... ...
@@ -1336,3 +1336,3 @@
1336 1336
    /// This class describes the interface of extendable undirected graphs.
1337
    /// It extends \ref BaseGraphComponent with functions for adding 
1337
    /// It extends \ref BaseGraphComponent with functions for adding
1338 1338
    /// nodes and edges to the graph.
... ...
@@ -1380,3 +1380,3 @@
1380 1380
    /// This class describes the interface of erasable directed graphs.
1381
    /// It extends \ref BaseDigraphComponent with functions for removing 
1381
    /// It extends \ref BaseDigraphComponent with functions for removing
1382 1382
    /// nodes and arcs from the digraph.
... ...
@@ -1393,3 +1393,3 @@
1393 1393
      ///
1394
      /// This function erases the given node from the digraph and all arcs 
1394
      /// This function erases the given node from the digraph and all arcs
1395 1395
      /// connected to the node.
... ...
@@ -1419,3 +1419,3 @@
1419 1419
    /// This class describes the interface of erasable undirected graphs.
1420
    /// It extends \ref BaseGraphComponent with functions for removing 
1420
    /// It extends \ref BaseGraphComponent with functions for removing
1421 1421
    /// nodes and edges from the graph.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -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

	
Ignore white space 6 line context
... ...
@@ -20,3 +20,3 @@
20 20
///\file
21
///\brief Classes for representing paths in digraphs.
21
///\brief The concept of paths
22 22
///
... ...
@@ -40,9 +40,18 @@
40 40
    /// digraph.
41
    /// In a sense, a path can be treated as a list of arcs.
42
    /// LEMON path types just store this list. As a consequence, they cannot
43
    /// enumerate the nodes on the path directly and a zero length path
44
    /// cannot store its source node.
45
    ///
46
    /// The arcs of a path should be stored in the order of their directions,
47
    /// i.e. the target node of each arc should be the same as the source
48
    /// node of the next arc. This consistency could be checked using
49
    /// \ref checkPath().
50
    /// The source and target nodes of a (consistent) path can be obtained
51
    /// using \ref pathSource() and \ref pathTarget().
52
    ///
53
    /// A path can be constructed from another path of any type using the
54
    /// copy constructor or the assignment operator.
55
    ///
41 56
    /// \tparam GR The digraph type in which the path is.
42
    ///
43
    /// In a sense, the path can be treated as a list of arcs. The
44
    /// lemon path type stores just this list. As a consequence it
45
    /// cannot enumerate the nodes in the path and the zero length
46
    /// paths cannot store the source.
47
    ///
48 57
    template <typename GR>
... ...
@@ -61,3 +70,3 @@
61 70

	
62
      /// \brief Template constructor
71
      /// \brief Template copy constructor
63 72
      template <typename CPath>
... ...
@@ -65,3 +74,3 @@
65 74

	
66
      /// \brief Template assigment
75
      /// \brief Template assigment operator
67 76
      template <typename CPath>
... ...
@@ -72,3 +81,3 @@
72 81

	
73
      /// Length of the path ie. the number of arcs in the path.
82
      /// Length of the path, i.e. the number of arcs on the path.
74 83
      int length() const { return 0;}
... ...
@@ -81,5 +90,5 @@
81 90

	
82
      /// \brief LEMON style iterator for path arcs
91
      /// \brief LEMON style iterator for enumerating the arcs of a path.
83 92
      ///
84
      /// This class is used to iterate on the arcs of the paths.
93
      /// LEMON style iterator class for enumerating the arcs of a path.
85 94
      class ArcIt {
... ...
@@ -90,6 +99,6 @@
90 99
        ArcIt(Invalid) {}
91
        /// Constructor for first arc
100
        /// Sets the iterator to the first arc of the given path
92 101
        ArcIt(const Path &) {}
93 102

	
94
        /// Conversion to Arc
103
        /// Conversion to \c Arc
95 104
        operator Arc() const { return INVALID; }
... ...
@@ -194,14 +203,11 @@
194 203
    /// A skeleton structure for path dumpers. The path dumpers are
195
    /// the generalization of the paths. The path dumpers can
196
    /// enumerate the arcs of the path wheter in forward or in
197
    /// backward order.  In most time these classes are not used
198
    /// directly rather it used to assign a dumped class to a real
199
    /// path type.
204
    /// the generalization of the paths, they can enumerate the arcs
205
    /// of the path either in forward or in backward order.
206
    /// These classes are typically not used directly, they are rather
207
    /// used to be assigned to a real path type.
200 208
    ///
201 209
    /// The main purpose of this concept is that the shortest path
202
    /// algorithms can enumerate easily the arcs in reverse order.
203
    /// If we would like to give back a real path from these
204
    /// algorithms then we should create a temporarly path object. In
205
    /// LEMON such algorithms gives back a path dumper what can
206
    /// assigned to a real path and the dumpers can be implemented as
210
    /// algorithms can enumerate the arcs easily in reverse order.
211
    /// In LEMON, such algorithms give back a (reverse) path dumper that
212
    /// can be assigned to a real path. The dumpers can be implemented as
207 213
    /// an adaptor class to the predecessor map.
... ...
@@ -209,5 +215,2 @@
209 215
    /// \tparam GR The digraph type in which the path is.
210
    ///
211
    /// The paths can be constructed from any path type by a
212
    /// template constructor or a template assignment operator.
213 216
    template <typename GR>
... ...
@@ -221,3 +224,3 @@
221 224

	
222
      /// Length of the path ie. the number of arcs in the path.
225
      /// Length of the path, i.e. the number of arcs on the path.
223 226
      int length() const { return 0;}
... ...
@@ -229,11 +232,10 @@
229 232
      ///
230
      /// If the RevPathTag is defined and true then reverse dumping
231
      /// is provided in the path dumper. In this case instead of the
232
      /// ArcIt the RevArcIt iterator should be implemented in the
233
      /// dumper.
233
      /// If this tag is defined to be \c True, then reverse dumping
234
      /// is provided in the path dumper. In this case, \c RevArcIt
235
      /// iterator should be implemented instead of \c ArcIt iterator.
234 236
      typedef False RevPathTag;
235 237

	
236
      /// \brief LEMON style iterator for path arcs
238
      /// \brief LEMON style iterator for enumerating the arcs of a path.
237 239
      ///
238
      /// This class is used to iterate on the arcs of the paths.
240
      /// LEMON style iterator class for enumerating the arcs of a path.
239 241
      class ArcIt {
... ...
@@ -244,6 +246,6 @@
244 246
        ArcIt(Invalid) {}
245
        /// Constructor for first arc
247
        /// Sets the iterator to the first arc of the given path
246 248
        ArcIt(const PathDumper&) {}
247 249

	
248
        /// Conversion to Arc
250
        /// Conversion to \c Arc
249 251
        operator Arc() const { return INVALID; }
... ...
@@ -262,6 +264,7 @@
262 264

	
263
      /// \brief LEMON style iterator for path arcs
265
      /// \brief LEMON style iterator for enumerating the arcs of a path
266
      /// in reverse direction.
264 267
      ///
265
      /// This class is used to iterate on the arcs of the paths in
266
      /// reverse direction.
268
      /// LEMON style iterator class for enumerating the arcs of a path
269
      /// in reverse direction.
267 270
      class RevArcIt {
... ...
@@ -272,6 +275,6 @@
272 275
        RevArcIt(Invalid) {}
273
        /// Constructor for first arc
276
        /// Sets the iterator to the last arc of the given path
274 277
        RevArcIt(const PathDumper &) {}
275 278

	
276
        /// Conversion to Arc
279
        /// Conversion to \c Arc
277 280
        operator Arc() const { return INVALID; }
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -260,3 +260,3 @@
260 260
  /// \note By definition, the empty digraph is strongly connected.
261
  /// 
261
  ///
262 262
  /// \see countStronglyConnectedComponents(), stronglyConnectedComponents()
... ...
@@ -312,3 +312,3 @@
312 312
  ///
313
  /// \brief Count the number of strongly connected components of a 
313
  /// \brief Count the number of strongly connected components of a
314 314
  /// directed graph
... ...
@@ -746,3 +746,3 @@
746 746
  ///
747
  /// This function checks whether the given undirected graph is 
747
  /// This function checks whether the given undirected graph is
748 748
  /// bi-node-connected, i.e. any two edges are on same circle.
... ...
@@ -760,3 +760,3 @@
760 760
  ///
761
  /// \brief Count the number of bi-node-connected components of an 
761
  /// \brief Count the number of bi-node-connected components of an
762 762
  /// undirected graph.
... ...
@@ -814,3 +814,3 @@
814 814
  /// to the number of the bi-node-connected components minus one. Each
815
  /// value of the map will be set exactly once, and the values of a 
815
  /// value of the map will be set exactly once, and the values of a
816 816
  /// certain component will be set continuously.
... ...
@@ -860,3 +860,3 @@
860 860
  /// \param graph The undirected graph.
861
  /// \retval cutMap A writable node map. The values will be set to 
861
  /// \retval cutMap A writable node map. The values will be set to
862 862
  /// \c true for the nodes that separate two or more components
... ...
@@ -1087,3 +1087,3 @@
1087 1087
  ///
1088
  /// This function checks whether the given undirected graph is 
1088
  /// This function checks whether the given undirected graph is
1089 1089
  /// bi-edge-connected, i.e. any two nodes are connected with at least
... ...
@@ -1194,3 +1194,3 @@
1194 1194
  /// This function finds the bi-edge-connected cut edges in the given
1195
  /// undirected graph. 
1195
  /// undirected graph.
1196 1196
  ///
... ...
@@ -1351,3 +1351,3 @@
1351 1351
  /// \retval order A readable and writable node map. The values will be
1352
  /// set from 0 to the number of the nodes in the digraph minus one. 
1352
  /// set from 0 to the number of the nodes in the digraph minus one.
1353 1353
  /// Each value of the map will be set exactly once, and the values will
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -1243,3 +1243,4 @@
1243 1243

	
1244
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type {
1244
    class AutoNodeMap : public ItemSetTraits<GR, Node>::template Map<Arc>::Type
1245
    {
1245 1246
      typedef typename ItemSetTraits<GR, Node>::template Map<Arc>::Type Parent;
... ...
@@ -1282,3 +1283,3 @@
1282 1283

	
1283
  protected: 
1284
  protected:
1284 1285

	
Ignore white space 6 line context
... ...
@@ -214,3 +214,3 @@
214 214

	
215
  /// This class can be used in the same way as \ref Counter however it
215
  /// This class can be used in the same way as \ref Counter, but it
216 216
  /// does not count at all and does not print report on destruction.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -113,2 +113,35 @@
113 113

	
114
  int CplexBase::_addRow(Value lb, ExprIterator b,
115
                         ExprIterator e, Value ub) {
116
    int i = CPXgetnumrows(cplexEnv(), _prob);
117
    if (lb == -INF) {
118
      const char s = 'L';
119
      CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
120
    } else if (ub == INF) {
121
      const char s = 'G';
122
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
123
    } else if (lb == ub){
124
      const char s = 'E';
125
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
126
    } else {
127
      const char s = 'R';
128
      double len = ub - lb;
129
      CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
130
    }
131

	
132
    std::vector<int> indices;
133
    std::vector<int> rowlist;
134
    std::vector<Value> values;
135

	
136
    for(ExprIterator it=b; it!=e; ++it) {
137
      indices.push_back(it->first);
138
      values.push_back(it->second);
139
      rowlist.push_back(i);
140
    }
141

	
142
    CPXchgcoeflist(cplexEnv(), _prob, values.size(),
143
                   &rowlist.front(), &indices.front(), &values.front());
144

	
145
    return i;
146
  }
114 147

	
... ...
@@ -458,3 +491,3 @@
458 491
  void CplexBase::_applyMessageLevel() {
459
    CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND, 
492
    CPXsetintparam(cplexEnv(), CPX_PARAM_SCRIND,
460 493
                   _message_enabled ? CPX_ON : CPX_OFF);
Ignore white space 6 line context
... ...
@@ -95,2 +95,3 @@
95 95
    virtual int _addRow();
96
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
96 97

	
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -49,3 +49,3 @@
49 49
    ///arcs of the %DFS 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 DfsDefaultTraits
127
  ///"DfsDefaultTraits<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
... ...
@@ -226,3 +233,3 @@
226 233
    ///\c PredMap type.
227
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
234
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
228 235
    template <class T>
... ...
@@ -246,3 +253,3 @@
246 253
    ///\c DistMap type.
247
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
254
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
248 255
    template <class T>
... ...
@@ -266,3 +273,4 @@
266 273
    ///\c ReachedMap type.
267
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
274
    ///It must conform to
275
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268 276
    template <class T>
... ...
@@ -286,3 +294,3 @@
286 294
    ///\c ProcessedMap type.
287
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
295
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
288 296
    template <class T>
... ...
@@ -413,4 +421,4 @@
413 421
    ///member functions called \ref run(Node) "run()".\n
414
    ///If you need more control on the execution, first you have to call
415
    ///\ref init(), then you can add a source node with \ref addSource()
422
    ///If you need better control on the execution, you have to call
423
    ///\ref init() first, then you can add a source node with \ref addSource()
416 424
    ///and perform the actual computation with \ref start().
... ...
@@ -634,8 +642,4 @@
634 642

	
635
    ///This method runs the %DFS algorithm in order to compute the
636
    ///%DFS path to each node.
637
    ///
638
    ///The algorithm computes
639
    ///- the %DFS tree (forest),
640
    ///- the distance of each node from the root(s) in the %DFS tree.
643
    ///This method runs the %DFS algorithm in order to visit all nodes
644
    ///in the digraph.
641 645
    ///
... ...
@@ -671,5 +675,5 @@
671 675

	
672
    ///The DFS path to a node.
676
    ///The DFS path to the given node.
673 677

	
674
    ///Returns the DFS path to a node.
678
    ///Returns the DFS path to the given node from the root(s).
675 679
    ///
... ...
@@ -681,5 +685,5 @@
681 685

	
682
    ///The distance of a node from the root(s).
686
    ///The distance of the given node from the root(s).
683 687

	
684
    ///Returns the distance of a node from the root(s).
688
    ///Returns the distance of the given node from the root(s).
685 689
    ///
... ...
@@ -692,3 +696,3 @@
692 696

	
693
    ///Returns the 'previous arc' of the %DFS tree for a node.
697
    ///Returns the 'previous arc' of the %DFS tree for the given node.
694 698

	
... ...
@@ -700,3 +704,3 @@
700 704
    ///The %DFS tree used here is equal to the %DFS tree used in
701
    ///\ref predNode().
705
    ///\ref predNode() and \ref predMap().
702 706
    ///
... ...
@@ -706,3 +710,3 @@
706 710

	
707
    ///Returns the 'previous node' of the %DFS tree.
711
    ///Returns the 'previous node' of the %DFS tree for the given node.
708 712

	
... ...
@@ -710,3 +714,3 @@
710 714
    ///tree for the node \c v, i.e. it returns the last but one node
711
    ///from a %DFS path from a root to \c v. It is \c INVALID
715
    ///of a %DFS path from a root to \c v. It is \c INVALID
712 716
    ///if \c v is not reached from the root(s) or if \c v is a root.
... ...
@@ -714,3 +718,3 @@
714 718
    ///The %DFS tree used here is equal to the %DFS tree used in
715
    ///\ref predArc().
719
    ///\ref predArc() and \ref predMap().
716 720
    ///
... ...
@@ -735,3 +739,3 @@
735 739
    ///Returns a const reference to the node map that stores the predecessor
736
    ///arcs, which form the DFS tree.
740
    ///arcs, which form the DFS tree (forest).
737 741
    ///
... ...
@@ -741,3 +745,3 @@
741 745

	
742
    ///Checks if a node is reached from the root(s).
746
    ///Checks if the given node. node is reached from the root(s).
743 747

	
... ...
@@ -767,3 +771,3 @@
767 771
    ///arcs of the %DFS paths.
768
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
772
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
769 773
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
... ...
@@ -782,4 +786,4 @@
782 786
    ///The type of the map that indicates which nodes are processed.
783
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
784
    ///By default it is a NullMap.
787
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
788
    ///By default, it is a NullMap.
785 789
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
... ...
@@ -802,3 +806,4 @@
802 806
    ///The type of the map that indicates which nodes are reached.
803
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
807
    ///It must conform to
808
    ///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804 809
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
... ...
@@ -817,3 +822,3 @@
817 822
    ///The type of the map that stores the distances of the nodes.
818
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
823
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
819 824
    typedef typename Digraph::template NodeMap<int> DistMap;
... ...
@@ -832,3 +837,3 @@
832 837
    ///The type of the DFS paths.
833
    ///It must meet the \ref concepts::Path "Path" concept.
838
    ///It must conform to the \ref concepts::Path "Path" concept.
834 839
    typedef lemon::Path<Digraph> Path;
... ...
@@ -838,8 +843,4 @@
838 843

	
839
  /// To make it easier to use Dfs algorithm
840
  /// we have created a wizard class.
841
  /// This \ref DfsWizard class needs default traits,
842
  /// as well as the \ref Dfs class.
843
  /// The \ref DfsWizardBase is a class to be the default traits of the
844
  /// \ref DfsWizard class.
844
  /// Default traits class used by DfsWizard.
845
  /// \tparam GR The type of the digraph.
845 846
  template<class GR>
... ...
@@ -871,3 +872,3 @@
871 872

	
872
    /// This constructor does not require parameters, therefore it initiates
873
    /// This constructor does not require parameters, it initiates
873 874
    /// all of the attributes to \c 0.
... ...
@@ -896,2 +897,5 @@
896 897
  /// which makes it easier to use the algorithm.
898
  ///
899
  /// \tparam TR The traits class that defines various types used by the
900
  /// algorithm.
897 901
  template<class TR>
... ...
@@ -901,3 +905,2 @@
901 905

	
902
    ///The type of the digraph the algorithm runs on.
903 906
    typedef typename TR::Digraph Digraph;
... ...
@@ -909,12 +912,6 @@
909 912

	
910
    ///\brief The type of the map that stores the predecessor
911
    ///arcs of the DFS paths.
912 913
    typedef typename TR::PredMap PredMap;
913
    ///\brief The type of the map that stores the distances of the nodes.
914 914
    typedef typename TR::DistMap DistMap;
915
    ///\brief The type of the map that indicates which nodes are reached.
916 915
    typedef typename TR::ReachedMap ReachedMap;
917
    ///\brief The type of the map that indicates which nodes are processed.
918 916
    typedef typename TR::ProcessedMap ProcessedMap;
919
    ///The type of the DFS paths
920 917
    typedef typename TR::Path Path;
... ...
@@ -988,4 +985,4 @@
988 985

	
989
    ///This method runs DFS algorithm in order to compute
990
    ///the DFS path to each node.
986
    ///This method runs DFS algorithm in order to visit all nodes
987
    ///in the digraph.
991 988
    void run()
... ...
@@ -1001,7 +998,8 @@
1001 998
    };
1002
    ///\brief \ref named-func-param "Named parameter"
1003
    ///for setting PredMap object.
999

	
1000
    ///\brief \ref named-templ-param "Named parameter" for setting
1001
    ///the predecessor map.
1004 1002
    ///
1005
    ///\ref named-func-param "Named parameter"
1006
    ///for setting PredMap object.
1003
    ///\ref named-templ-param "Named parameter" function for setting
1004
    ///the map that stores the predecessor arcs of the nodes.
1007 1005
    template<class T>
... ...
@@ -1019,7 +1017,8 @@
1019 1017
    };
1020
    ///\brief \ref named-func-param "Named parameter"
1021
    ///for setting ReachedMap object.
1018

	
1019
    ///\brief \ref named-templ-param "Named parameter" for setting
1020
    ///the reached map.
1022 1021
    ///
1023
    /// \ref named-func-param "Named parameter"
1024
    ///for setting ReachedMap object.
1022
    ///\ref named-templ-param "Named parameter" function for setting
1023
    ///the map that indicates which nodes are reached.
1025 1024
    template<class T>
... ...
@@ -1037,7 +1036,9 @@
1037 1036
    };
1038
    ///\brief \ref named-func-param "Named parameter"
1039
    ///for setting DistMap object.
1037

	
1038
    ///\brief \ref named-templ-param "Named parameter" for setting
1039
    ///the distance map.
1040 1040
    ///
1041
    /// \ref named-func-param "Named parameter"
1042
    ///for setting DistMap object.
1041
    ///\ref named-templ-param "Named parameter" function for setting
1042
    ///the map that stores the distances of the nodes calculated
1043
    ///by the algorithm.
1043 1044
    template<class T>
... ...
@@ -1055,7 +1056,8 @@
1055 1056
    };
1056
    ///\brief \ref named-func-param "Named parameter"
1057
    ///for setting ProcessedMap object.
1057

	
1058
    ///\brief \ref named-func-param "Named parameter" for setting
1059
    ///the processed map.
1058 1060
    ///
1059
    /// \ref named-func-param "Named parameter"
1060
    ///for setting ProcessedMap object.
1061
    ///\ref named-templ-param "Named parameter" function for setting
1062
    ///the map that indicates which nodes are processed.
1061 1063
    template<class T>
... ...
@@ -1210,3 +1212,4 @@
1210 1212
    /// The type of the map that indicates which nodes are reached.
1211
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1213
    /// It must conform to the
1214
    /// \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1212 1215
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
... ...
@@ -1248,7 +1251,7 @@
1248 1251
  /// events, you should implement your own visitor class.
1249
  /// \tparam TR Traits class to set various data types used by the
1250
  /// algorithm. The default traits class is
1251
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
1252
  /// See \ref DfsVisitDefaultTraits for the documentation of
1253
  /// a DFS visit traits class.
1252
  /// \tparam TR The traits class that defines various types used by the
1253
  /// algorithm. By default, it is \ref DfsVisitDefaultTraits
1254
  /// "DfsVisitDefaultTraits<GR>".
1255
  /// In most cases, this parameter should not be set directly,
1256
  /// consider to use the named template parameters instead.
1254 1257
#ifdef DOXYGEN
... ...
@@ -1371,4 +1374,4 @@
1371 1374
    /// member functions called \ref run(Node) "run()".\n
1372
    /// If you need more control on the execution, first you have to call
1373
    /// \ref init(), then you can add a source node with \ref addSource()
1375
    /// If you need better control on the execution, you have to call
1376
    /// \ref init() first, then you can add a source node with \ref addSource()
1374 1377
    /// and perform the actual computation with \ref start().
... ...
@@ -1585,8 +1588,4 @@
1585 1588

	
1586
    /// This method runs the %DFS algorithm in order to
1587
    /// compute the %DFS path to each node.
1588
    ///
1589
    /// The algorithm computes
1590
    /// - the %DFS tree (forest),
1591
    /// - the distance of each node from the root(s) in the %DFS tree.
1589
    /// This method runs the %DFS algorithm in order to visit all nodes
1590
    /// in the digraph.
1592 1591
    ///
... ...
@@ -1622,3 +1621,3 @@
1622 1621

	
1623
    /// \brief Checks if a node is reached from the root(s).
1622
    /// \brief Checks if the given node is reached from the root(s).
1624 1623
    ///
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -72,5 +72,5 @@
72 72
    ///The type of the map that stores the arc lengths.
73
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
73
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
74 74
    typedef LEN LengthMap;
75
    ///The type of the length of the arcs.
75
    ///The type of the arc lengths.
76 76
    typedef typename LEN::Value Value;
... ...
@@ -118,3 +118,3 @@
118 118
    ///arcs of the shortest paths.
119
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
119
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
120 120
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
... ...
@@ -133,4 +133,4 @@
133 133
    ///The type of the map that indicates which nodes are processed.
134
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
135
    ///By default it is a NullMap.
134
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
135
    ///By default, it is a NullMap.
136 136
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
... ...
@@ -153,3 +153,3 @@
153 153
    ///The type of the map that stores the distances of the nodes.
154
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
154
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
155 155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
... ...
@@ -171,2 +171,6 @@
171 171
  ///
172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173
  ///when all arc lengths are non-negative. If there are negative lengths,
174
  ///the BellmanFord algorithm should be used instead.
175
  ///
172 176
  ///The arc lengths are passed to the algorithm using a
... ...
@@ -190,2 +194,7 @@
190 194
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
195
  ///\tparam TR The traits class that defines various types used by the
196
  ///algorithm. By default, it is \ref DijkstraDefaultTraits
197
  ///"DijkstraDefaultTraits<GR, LEN>".
198
  ///In most cases, this parameter should not be set directly,
199
  ///consider to use the named template parameters instead.
191 200
#ifdef DOXYGEN
... ...
@@ -203,4 +212,4 @@
203 212

	
204
    ///The type of the length of the arcs.
205
    typedef typename TR::LengthMap::Value Value;
213
    ///The type of the arc lengths.
214
    typedef typename TR::Value Value;
206 215
    ///The type of the map that stores the arc lengths.
... ...
@@ -306,3 +315,3 @@
306 315
    ///\c PredMap type.
307
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
316
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
308 317
    template <class T>
... ...
@@ -327,3 +336,3 @@
327 336
    ///\c DistMap type.
328
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
337
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
329 338
    template <class T>
... ...
@@ -348,3 +357,3 @@
348 357
    ///\c ProcessedMap type.
349
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
358
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
350 359
    template <class T>
... ...
@@ -424,3 +433,3 @@
424 433
    ///reference should be passed to the constructor of the heap).
425
    ///However external heap and cross reference objects could also be
434
    ///However, external heap and cross reference objects could also be
426 435
    ///passed to the algorithm using the \ref heap() function before
... ...
@@ -445,2 +454,3 @@
445 454
    ///\c OperationTraits type.
455
    /// For more information, see \ref DijkstraDefaultOperationTraits.
446 456
    template <class T>
... ...
@@ -586,4 +596,4 @@
586 596
    ///one of the member functions called \ref run(Node) "run()".\n
587
    ///If you need more control on the execution, first you have to call
588
    ///\ref init(), then you can add several source nodes with
597
    ///If you need better control on the execution, you have to call
598
    ///\ref init() first, then you can add several source nodes with
589 599
    ///\ref addSource(). Finally the actual path computation can be
... ...
@@ -803,3 +813,3 @@
803 813
    ///functions.\n
804
    ///Either \ref run(Node) "run()" or \ref start() should be called
814
    ///Either \ref run(Node) "run()" or \ref init() should be called
805 815
    ///before using them.
... ...
@@ -808,5 +818,5 @@
808 818

	
809
    ///The shortest path to a node.
819
    ///The shortest path to the given node.
810 820

	
811
    ///Returns the shortest path to a node.
821
    ///Returns the shortest path to the given node from the root(s).
812 822
    ///
... ...
@@ -818,5 +828,5 @@
818 828

	
819
    ///The distance of a node from the root(s).
829
    ///The distance of the given node from the root(s).
820 830

	
821
    ///Returns the distance of a node from the root(s).
831
    ///Returns the distance of the given node from the root(s).
822 832
    ///
... ...
@@ -829,4 +839,5 @@
829 839

	
830
    ///Returns the 'previous arc' of the shortest path tree for a node.
831

	
840
    ///\brief Returns the 'previous arc' of the shortest path tree for
841
    ///the given node.
842
    ///
832 843
    ///This function returns the 'previous arc' of the shortest path
... ...
@@ -837,3 +848,3 @@
837 848
    ///The shortest path tree used here is equal to the shortest path
838
    ///tree used in \ref predNode().
849
    ///tree used in \ref predNode() and \ref predMap().
839 850
    ///
... ...
@@ -843,7 +854,8 @@
843 854

	
844
    ///Returns the 'previous node' of the shortest path tree for a node.
845

	
855
    ///\brief Returns the 'previous node' of the shortest path tree for
856
    ///the given node.
857
    ///
846 858
    ///This function returns the 'previous node' of the shortest path
847 859
    ///tree for the node \c v, i.e. it returns the last but one node
848
    ///from a shortest path from a root to \c v. It is \c INVALID
860
    ///of a shortest path from a root to \c v. It is \c INVALID
849 861
    ///if \c v is not reached from the root(s) or if \c v is a root.
... ...
@@ -851,3 +863,3 @@
851 863
    ///The shortest path tree used here is equal to the shortest path
852
    ///tree used in \ref predArc().
864
    ///tree used in \ref predArc() and \ref predMap().
853 865
    ///
... ...
@@ -872,3 +884,3 @@
872 884
    ///Returns a const reference to the node map that stores the predecessor
873
    ///arcs, which form the shortest path tree.
885
    ///arcs, which form the shortest path tree (forest).
874 886
    ///
... ...
@@ -878,3 +890,3 @@
878 890

	
879
    ///Checks if a node is reached from the root(s).
891
    ///Checks if the given node is reached from the root(s).
880 892

	
... ...
@@ -897,5 +909,5 @@
897 909

	
898
    ///The current distance of a node from the root(s).
910
    ///The current distance of the given node from the root(s).
899 911

	
900
    ///Returns the current distance of a node from the root(s).
912
    ///Returns the current distance of the given node from the root(s).
901 913
    ///It may be decreased in the following processes.
... ...
@@ -926,5 +938,5 @@
926 938
    ///The type of the map that stores the arc lengths.
927
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
939
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
928 940
    typedef LEN LengthMap;
929
    ///The type of the length of the arcs.
941
    ///The type of the arc lengths.
930 942
    typedef typename LEN::Value Value;
... ...
@@ -975,3 +987,3 @@
975 987
    ///arcs of the shortest paths.
976
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
988
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
977 989
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
... ...
@@ -990,4 +1002,4 @@
990 1002
    ///The type of the map that indicates which nodes are processed.
991
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
992
    ///By default it is a NullMap.
1003
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1004
    ///By default, it is a NullMap.
993 1005
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
... ...
@@ -1010,3 +1022,3 @@
1010 1022
    ///The type of the map that stores the distances of the nodes.
1011
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1023
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1012 1024
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
... ...
@@ -1025,3 +1037,3 @@
1025 1037
    ///The type of the shortest paths.
1026
    ///It must meet the \ref concepts::Path "Path" concept.
1038
    ///It must conform to the \ref concepts::Path "Path" concept.
1027 1039
    typedef lemon::Path<Digraph> Path;
... ...
@@ -1031,8 +1043,5 @@
1031 1043

	
1032
  /// To make it easier to use Dijkstra algorithm
1033
  /// we have created a wizard class.
1034
  /// This \ref DijkstraWizard class needs default traits,
1035
  /// as well as the \ref Dijkstra class.
1036
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1037
  /// \ref DijkstraWizard class.
1044
  /// Default traits class used by DijkstraWizard.
1045
  /// \tparam GR The type of the digraph.
1046
  /// \tparam LEN The type of the length map.
1038 1047
  template<typename GR, typename LEN>
... ...
@@ -1090,2 +1099,5 @@
1090 1099
  /// which makes it easier to use the algorithm.
1100
  ///
1101
  /// \tparam TR The traits class that defines various types used by the
1102
  /// algorithm.
1091 1103
  template<class TR>
... ...
@@ -1095,3 +1107,2 @@
1095 1107

	
1096
    ///The type of the digraph the algorithm runs on.
1097 1108
    typedef typename TR::Digraph Digraph;
... ...
@@ -1103,16 +1114,8 @@
1103 1114

	
1104
    ///The type of the map that stores the arc lengths.
1105 1115
    typedef typename TR::LengthMap LengthMap;
1106
    ///The type of the length of the arcs.
1107 1116
    typedef typename LengthMap::Value Value;
1108
    ///\brief The type of the map that stores the predecessor
1109
    ///arcs of the shortest paths.
1110 1117
    typedef typename TR::PredMap PredMap;
1111
    ///The type of the map that stores the distances of the nodes.
1112 1118
    typedef typename TR::DistMap DistMap;
1113
    ///The type of the map that indicates which nodes are processed.
1114 1119
    typedef typename TR::ProcessedMap ProcessedMap;
1115
    ///The type of the shortest paths
1116 1120
    typedef typename TR::Path Path;
1117
    ///The heap type used by the dijkstra algorithm.
1118 1121
    typedef typename TR::Heap Heap;
... ...
@@ -1188,7 +1191,8 @@
1188 1191
    };
1189
    ///\brief \ref named-func-param "Named parameter"
1190
    ///for setting PredMap object.
1192

	
1193
    ///\brief \ref named-templ-param "Named parameter" for setting
1194
    ///the predecessor map.
1191 1195
    ///
1192
    ///\ref named-func-param "Named parameter"
1193
    ///for setting PredMap object.
1196
    ///\ref named-templ-param "Named parameter" function for setting
1197
    ///the map that stores the predecessor arcs of the nodes.
1194 1198
    template<class T>
... ...
@@ -1206,7 +1210,9 @@
1206 1210
    };
1207
    ///\brief \ref named-func-param "Named parameter"
1208
    ///for setting DistMap object.
1211

	
1212
    ///\brief \ref named-templ-param "Named parameter" for setting
1213
    ///the distance map.
1209 1214
    ///
1210
    ///\ref named-func-param "Named parameter"
1211
    ///for setting DistMap object.
1215
    ///\ref named-templ-param "Named parameter" function for setting
1216
    ///the map that stores the distances of the nodes calculated
1217
    ///by the algorithm.
1212 1218
    template<class T>
... ...
@@ -1224,7 +1230,8 @@
1224 1230
    };
1225
    ///\brief \ref named-func-param "Named parameter"
1226
    ///for setting ProcessedMap object.
1231

	
1232
    ///\brief \ref named-func-param "Named parameter" for setting
1233
    ///the processed map.
1227 1234
    ///
1228
    /// \ref named-func-param "Named parameter"
1229
    ///for setting ProcessedMap object.
1235
    ///\ref named-templ-param "Named parameter" function for setting
1236
    ///the map that indicates which nodes are processed.
1230 1237
    template<class T>
... ...
@@ -1241,2 +1248,3 @@
1241 1248
    };
1249

	
1242 1250
    ///\brief \ref named-func-param "Named parameter"
Ignore white space 6 line context
... ...
@@ -23,12 +23,5 @@
23 23

	
24
///\ingroup misc
24
///\ingroup geomdat
25 25
///\file
26 26
///\brief A simple two dimensional vector and a bounding box implementation
27
///
28
/// The class \ref lemon::dim2::Point "dim2::Point" implements
29
/// a two dimensional vector with the usual operations.
30
///
31
/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
32
/// the rectangular bounding box of a set of
33
/// \ref lemon::dim2::Point "dim2::Point"'s.
34 27

	
... ...
@@ -42,3 +35,3 @@
42 35

	
43
  /// \addtogroup misc
36
  /// \addtogroup geomdat
44 37
  /// @{
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -63,3 +63,3 @@
63 63
  ///This function starts seeking the beginning of the given file for the
64
  ///problem type and size info. 
64
  ///problem type and size info.
65 65
  ///The found data is returned in a special struct that can be evaluated
... ...
@@ -214,3 +214,3 @@
214 214
        std::numeric_limits<Capacity>::max();
215
 
215

	
216 216
    while (is >> c) {
... ...
@@ -239,3 +239,3 @@
239 239
          capacity.set(e, _cap);
240
        } 
240
        }
241 241
        else if (desc.type==DimacsDescriptor::MAX) {
... ...
@@ -364,3 +364,3 @@
364 364
  }
365
  
365

	
366 366
  /// \brief DIMACS plain (di)graph reader function.
... ...
@@ -368,3 +368,3 @@
368 368
  /// This function reads a plain (di)graph without any designated nodes
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from 
369
  /// and maps (e.g. a matching instance) from DIMACS format, i.e. from
370 370
  /// DIMACS files having a line starting with
... ...
@@ -394,3 +394,3 @@
394 394
    }
395
    
395

	
396 396
    while (is >> c) {
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -257,2 +257,6 @@
257 257
  ///
258
  /// This class fully conforms to the \ref concepts::Digraph
259
  /// "Digraph" concept.
260
  /// It provides only linear time counting for nodes and arcs.
261
  ///
258 262
  /// \param GR The type of the graph which shares its node set with
... ...
@@ -261,5 +265,2 @@
261 265
  /// concept.
262
  ///
263
  /// This class fully conforms to the \ref concepts::Digraph
264
  /// "Digraph" concept.
265 266
  template <typename GR>
... ...
@@ -687,2 +688,6 @@
687 688
  ///
689
  /// This class fully conforms to the \ref concepts::Graph "Graph"
690
  /// concept.
691
  /// It provides only linear time counting for nodes, edges and arcs.
692
  ///
688 693
  /// \param GR The type of the graph which shares its node set
... ...
@@ -691,5 +696,2 @@
691 696
  /// concept.
692
  ///
693
  /// This class fully conforms to the \ref concepts::Graph "Graph"
694
  /// concept.
695 697
  template <typename GR>
... ...
@@ -869,3 +871,3 @@
869 871

	
870
    void next(Arc& arc) const {
872
    static void next(Arc& arc) {
871 873
      --arc.id;
... ...
@@ -956,2 +958,6 @@
956 958
  ///
959
  /// This class fully conforms to the \ref concepts::Digraph "Digraph"
960
  /// concept.
961
  /// It provides only linear time counting for nodes and arcs.
962
  ///
957 963
  /// \warning If a node is erased from the underlying graph and this
... ...
@@ -960,5 +966,2 @@
960 966
  /// validity can be checked with the \c valid() member function.
961
  ///
962
  /// This class fully conforms to the \ref concepts::Digraph
963
  /// "Digraph" concept.
964 967
  template <typename GR>
... ...
@@ -1175,3 +1178,3 @@
1175 1178

	
1176
    void next(Arc& arc) const {
1179
    static void next(Arc& arc) {
1177 1180
      --arc.id;
... ...
@@ -1183,3 +1186,3 @@
1183 1186

	
1184
    void next(Edge& arc) const {
1187
    static void next(Edge& arc) {
1185 1188
      --arc.id;
... ...
@@ -1306,2 +1309,6 @@
1306 1309
  ///
1310
  /// This class fully conforms to the \ref concepts::Graph "Graph"
1311
  /// concept.
1312
  /// It provides only linear time counting for nodes, edges and arcs.
1313
  ///
1307 1314
  /// \warning If a node is erased from the underlying graph and this
... ...
@@ -1310,5 +1317,2 @@
1310 1317
  /// be checked with the \c valid() member function.
1311
  ///
1312
  /// This class fully conforms to the \ref concepts::Graph
1313
  /// "Graph" concept.
1314 1318
  template <typename GR>
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -28,3 +28,3 @@
28 28
/// \file
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian 
29
/// \brief Euler tour iterators and a function for checking the \e Eulerian
30 30
/// property.
... ...
@@ -43,3 +43,3 @@
43 43
  ///For example, if the given digraph has an Euler tour (i.e it has only one
44
  ///non-trivial component and the in-degree is equal to the out-degree 
44
  ///non-trivial component and the in-degree is equal to the out-degree
45 45
  ///for all nodes), then the following code will put the arcs of \c g
... ...
@@ -140,3 +140,3 @@
140 140
  ///
141
  ///For example, if the given graph has an Euler tour (i.e it has only one 
141
  ///For example, if the given graph has an Euler tour (i.e it has only one
142 142
  ///non-trivial component and the degree of each node is even),
... ...
@@ -149,3 +149,3 @@
149 149
  ///\endcode
150
  ///Although this iterator is for undirected graphs, it still returns 
150
  ///Although this iterator is for undirected graphs, it still returns
151 151
  ///arcs in order to indicate the direction of the tour.
... ...
@@ -235,3 +235,3 @@
235 235
    ///
236
    ///\warning This incrementation returns an \c Arc (which converts to 
236
    ///\warning This incrementation returns an \c Arc (which converts to
237 237
    ///an \c Edge), not an \ref EulerIt, as one may expect.
Ignore white space 6 line context
... ...
@@ -22,6 +22,7 @@
22 22
///\file
23
///\ingroup auxdat
24
///\brief Fibonacci Heap implementation.
23
///\ingroup heaps
24
///\brief Fibonacci heap implementation.
25 25

	
26 26
#include <vector>
27
#include <utility>
27 28
#include <functional>
... ...
@@ -31,28 +32,22 @@
31 32

	
32
  /// \ingroup auxdat
33
  /// \ingroup heaps
33 34
  ///
34
  ///\brief Fibonacci Heap.
35
  /// \brief Fibonacci heap data structure.
35 36
  ///
36
  ///This class implements the \e Fibonacci \e heap data structure. A \e heap
37
  ///is a data structure for storing items with specified values called \e
38
  ///priorities in such a way that finding the item with minimum priority is
39
  ///efficient. \c CMP specifies the ordering of the priorities. In a heap
40
  ///one can change the priority of an item, add or erase an item, etc.
37
  /// This class implements the \e Fibonacci \e heap data structure.
38
  /// It fully conforms to the \ref concepts::Heap "heap concept".
41 39
  ///
42
  ///The methods \ref increase and \ref erase are not efficient in a Fibonacci
43
  ///heap. In case of many calls to these operations, it is better to use a
44
  ///\ref BinHeap "binary heap".
40
  /// The methods \ref increase() and \ref erase() are not efficient in a
41
  /// Fibonacci heap. In case of many calls of these operations, it is
42
  /// better to use other heap structure, e.g. \ref BinHeap "binary heap".
45 43
  ///
46
  ///\param PRIO Type of the priority of the items.
47
  ///\param IM A read and writable Item int map, used internally
48
  ///to handle the cross references.
49
  ///\param CMP A class for the ordering of the priorities. The
50
  ///default is \c std::less<PRIO>.
51
  ///
52
  ///\sa BinHeap
53
  ///\sa Dijkstra
44
  /// \tparam PR Type of the priorities of the items.
45
  /// \tparam IM A read-writable item map with \c int values, used
46
  /// internally to handle the cross references.
47
  /// \tparam CMP A functor class for comparing the priorities.
48
  /// The default is \c std::less<PR>.
54 49
#ifdef DOXYGEN
55
  template <typename PRIO, typename IM, typename CMP>
50
  template <typename PR, typename IM, typename CMP>
56 51
#else
57
  template <typename PRIO, typename IM, typename CMP = std::less<PRIO> >
52
  template <typename PR, typename IM, typename CMP = std::less<PR> >
58 53
#endif
... ...
@@ -60,11 +55,12 @@
60 55
  public:
61
    ///\e
56

	
57
    /// Type of the item-int map.
62 58
    typedef IM ItemIntMap;
63
    ///\e
64
    typedef PRIO Prio;
65
    ///\e
59
    /// Type of the priorities.
60
    typedef PR Prio;
61
    /// Type of the items stored in the heap.
66 62
    typedef typename ItemIntMap::Key Item;
67
    ///\e
63
    /// Type of the item-priority pairs.
68 64
    typedef std::pair<Item,Prio> Pair;
69
    ///\e
65
    /// Functor type for comparing the priorities.
70 66
    typedef CMP Compare;
... ...
@@ -82,6 +78,6 @@
82 78

	
83
    /// \brief Type to represent the items states.
79
    /// \brief Type to represent the states of the items.
84 80
    ///
85
    /// Each Item element have a state associated to it. It may be "in heap",
86
    /// "pre heap" or "post heap". The latter two are indifferent from the
81
    /// Each item has a state associated to it. It can be "in heap",
82
    /// "pre-heap" or "post-heap". The latter two are indifferent from the
87 83
    /// heap's point of view, but may be useful to the user.
... ...
@@ -96,6 +92,8 @@
96 92

	
97
    /// \brief The constructor
93
    /// \brief Constructor.
98 94
    ///
99
    /// \c map should be given to the constructor, since it is
100
    ///   used internally to handle the cross references.
95
    /// Constructor.
96
    /// \param map A map that assigns \c int values to the items.
97
    /// It is used internally to handle the cross references.
98
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
101 99
    explicit FibHeap(ItemIntMap &map)
... ...
@@ -103,7 +101,9 @@
103 101

	
104
    /// \brief The constructor
102
    /// \brief Constructor.
105 103
    ///
106
    /// \c map should be given to the constructor, since it is used
107
    /// internally to handle the cross references. \c comp is an
108
    /// object for ordering of the priorities.
104
    /// Constructor.
105
    /// \param map A map that assigns \c int values to the items.
106
    /// It is used internally to handle the cross references.
107
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
108
    /// \param comp The function object used for comparing the priorities.
109 109
    FibHeap(ItemIntMap &map, const Compare &comp)
... ...
@@ -113,16 +113,17 @@
113 113
    ///
114
    /// Returns the number of items stored in the heap.
114
    /// This function returns the number of items stored in the heap.
115 115
    int size() const { return _num; }
116 116

	
117
    /// \brief Checks if the heap stores no items.
117
    /// \brief Check if the heap is empty.
118 118
    ///
119
    ///   Returns \c true if and only if the heap stores no items.
119
    /// This function returns \c true if the heap is empty.
120 120
    bool empty() const { return _num==0; }
121 121

	
122
    /// \brief Make empty this heap.
122
    /// \brief Make the heap empty.
123 123
    ///
124
    /// Make empty this heap. It does not change the cross reference
125
    /// map.  If you want to reuse a heap what is not surely empty you
126
    /// should first clear the heap and after that you should set the
127
    /// cross reference map for each item to \c PRE_HEAP.
124
    /// This functon makes the heap empty.
125
    /// It does not change the cross reference map. If you want to reuse
126
    /// a heap that is not surely empty, you should first clear it and
127
    /// then you should set the cross reference map to \c PRE_HEAP
128
    /// for each item.
128 129
    void clear() {
... ...
@@ -131,21 +132,10 @@
131 132

	
132
    /// \brief \c item gets to the heap with priority \c value independently
133
    /// if \c item was already there.
133
    /// \brief Insert an item into the heap with the given priority.
134 134
    ///
135
    /// This method calls \ref push(\c item, \c value) if \c item is not
136
    /// stored in the heap and it calls \ref decrease(\c item, \c value) or
137
    /// \ref increase(\c item, \c value) otherwise.
138
    void set (const Item& item, const Prio& value) {
139
      int i=_iim[item];
140
      if ( i >= 0 && _data[i].in ) {
141
        if ( _comp(value, _data[i].prio) ) decrease(item, value);
142
        if ( _comp(_data[i].prio, value) ) increase(item, value);
143
      } else push(item, value);
144
    }
145

	
146
    /// \brief Adds \c item to the heap with priority \c value.
147
    ///
148
    /// Adds \c item to the heap with priority \c value.
149
    /// \pre \c item must not be stored in the heap.
150
    void push (const Item& item, const Prio& value) {
135
    /// This function inserts the given item into the heap with the
136
    /// given priority.
137
    /// \param item The item to insert.
138
    /// \param prio The priority of the item.
139
    /// \pre \e item must not be stored in the heap.
140
    void push (const Item& item, const Prio& prio) {
151 141
      int i=_iim[item];
... ...
@@ -170,3 +160,3 @@
170 160
        _data[i].left_neighbor=_minimum;
171
        if ( _comp( value, _data[_minimum].prio) ) _minimum=i;
161
        if ( _comp( prio, _data[_minimum].prio) ) _minimum=i;
172 162
      } else {
... ...
@@ -175,3 +165,3 @@
175 165
      }
176
      _data[i].prio=value;
166
      _data[i].prio=prio;
177 167
      ++_num;
... ...
@@ -179,27 +169,17 @@
179 169

	
180
    /// \brief Returns the item with minimum priority relative to \c Compare.
170
    /// \brief Return the item having minimum priority.
181 171
    ///
182
    /// This method returns the item with minimum priority relative to \c
183
    /// Compare.
184
    /// \pre The heap must be nonempty.
172
    /// This function returns the item having minimum priority.
173
    /// \pre The heap must be non-empty.
185 174
    Item top() const { return _data[_minimum].name; }
186 175

	
187
    /// \brief Returns the minimum priority relative to \c Compare.
176
    /// \brief The minimum priority.
188 177
    ///
189
    /// It returns the minimum priority relative to \c Compare.
190
    /// \pre The heap must be nonempty.
191
    const Prio& prio() const { return _data[_minimum].prio; }
178
    /// This function returns the minimum priority.
179
    /// \pre The heap must be non-empty.
180
    Prio prio() const { return _data[_minimum].prio; }
192 181

	
193
    /// \brief Returns the priority of \c item.
182
    /// \brief Remove the item having minimum priority.
194 183
    ///
195
    /// It returns the priority of \c item.
196
    /// \pre \c item must be in the heap.
197
    const Prio& operator[](const Item& item) const {
198
      return _data[_iim[item]].prio;
199
    }
200

	
201
    /// \brief Deletes the item with minimum priority relative to \c Compare.
202
    ///
203
    /// This method deletes the item with minimum priority relative to \c
204
    /// Compare from the heap.
184
    /// This function removes the item having minimum priority.
205 185
    /// \pre The heap must be non-empty.
... ...
@@ -210,3 +190,3 @@
210 190
        if ( _data[_minimum].degree!=0 ) {
211
          makeroot(_data[_minimum].child);
191
          makeRoot(_data[_minimum].child);
212 192
          _minimum=_data[_minimum].child;
... ...
@@ -223,3 +203,3 @@
223 203

	
224
          makeroot(child);
204
          makeRoot(child);
225 205

	
... ...
@@ -236,6 +216,8 @@
236 216

	
237
    /// \brief Deletes \c item from the heap.
217
    /// \brief Remove the given item from the heap.
238 218
    ///
239
    /// This method deletes \c item from the heap, if \c item was already
240
    /// stored in the heap. It is quite inefficient in Fibonacci heaps.
219
    /// This function removes the given item from the heap if it is
220
    /// already stored.
221
    /// \param item The item to delete.
222
    /// \pre \e item must be in the heap.
241 223
    void erase (const Item& item) {
... ...
@@ -254,13 +236,39 @@
254 236

	
255
    /// \brief Decreases the priority of \c item to \c value.
237
    /// \brief The priority of the given item.
256 238
    ///
257
    /// This method decreases the priority of \c item to \c value.
258
    /// \pre \c item must be stored in the heap with priority at least \c
259
    ///   value relative to \c Compare.
260
    void decrease (Item item, const Prio& value) {
239
    /// This function returns the priority of the given item.
240
    /// \param item The item.
241
    /// \pre \e item must be in the heap.
242
    Prio operator[](const Item& item) const {
243
      return _data[_iim[item]].prio;
244
    }
245

	
246
    /// \brief Set the priority of an item or insert it, if it is
247
    /// not stored in the heap.
248
    ///
249
    /// This method sets the priority of the given item if it is
250
    /// already stored in the heap. Otherwise it inserts the given
251
    /// item into the heap with the given priority.
252
    /// \param item The item.
253
    /// \param prio The priority.
254
    void set (const Item& item, const Prio& prio) {
261 255
      int i=_iim[item];
262
      _data[i].prio=value;
256
      if ( i >= 0 && _data[i].in ) {
257
        if ( _comp(prio, _data[i].prio) ) decrease(item, prio);
258
        if ( _comp(_data[i].prio, prio) ) increase(item, prio);
259
      } else push(item, prio);
260
    }
261

	
262
    /// \brief Decrease the priority of an item to the given value.
263
    ///
264
    /// This function decreases the priority of an item to the given value.
265
    /// \param item The item.
266
    /// \param prio The priority.
267
    /// \pre \e item must be stored in the heap with priority at least \e prio.
268
    void decrease (const Item& item, const Prio& prio) {
269
      int i=_iim[item];
270
      _data[i].prio=prio;
263 271
      int p=_data[i].parent;
264 272

	
265
      if ( p!=-1 && _comp(value, _data[p].prio) ) {
273
      if ( p!=-1 && _comp(prio, _data[p].prio) ) {
266 274
        cut(i,p);
... ...
@@ -268,25 +276,24 @@
268 276
      }
269
      if ( _comp(value, _data[_minimum].prio) ) _minimum=i;
277
      if ( _comp(prio, _data[_minimum].prio) ) _minimum=i;
270 278
    }
271 279

	
272
    /// \brief Increases the priority of \c item to \c value.
280
    /// \brief Increase the priority of an item to the given value.
273 281
    ///
274
    /// This method sets the priority of \c item to \c value. Though
275
    /// there is no precondition on the priority of \c item, this
276
    /// method should be used only if it is indeed necessary to increase
277
    /// (relative to \c Compare) the priority of \c item, because this
278
    /// method is inefficient.
279
    void increase (Item item, const Prio& value) {
282
    /// This function increases the priority of an item to the given value.
283
    /// \param item The item.
284
    /// \param prio The priority.
285
    /// \pre \e item must be stored in the heap with priority at most \e prio.
286
    void increase (const Item& item, const Prio& prio) {
280 287
      erase(item);
281
      push(item, value);
288
      push(item, prio);
282 289
    }
283 290

	
284

	
285
    /// \brief Returns if \c item is in, has already been in, or has never
286
    /// been in the heap.
291
    /// \brief Return the state of an item.
287 292
    ///
288
    /// This method returns PRE_HEAP if \c item has never been in the
289
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
290
    /// otherwise. In the latter case it is possible that \c item will
291
    /// get back to the heap again.
293
    /// This method returns \c PRE_HEAP if the given item has never
294
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
295
    /// and \c POST_HEAP otherwise.
296
    /// In the latter case it is possible that the item will get back
297
    /// to the heap again.
298
    /// \param item The item.
292 299
    State state(const Item &item) const {
... ...
@@ -300,7 +307,7 @@
300 307

	
301
    /// \brief Sets the state of the \c item in the heap.
308
    /// \brief Set the state of an item in the heap.
302 309
    ///
303
    /// Sets the state of the \c item in the heap. It can be used to
304
    /// manually clear the heap when it is important to achive the
305
    /// 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.
306 313
    /// \param i The item.
... ...
@@ -367,3 +374,3 @@
367 374

	
368
    void makeroot(int c) {
375
    void makeRoot(int c) {
369 376
      int s=c;
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -26,3 +26,3 @@
26 26
///\file
27
///\brief FullGraph and FullDigraph classes.
27
///\brief FullDigraph and FullGraph classes.
28 28

	
... ...
@@ -53,3 +53,3 @@
53 53
    Node operator()(int ix) const { return Node(ix); }
54
    int index(const Node& node) const { return node._id; }
54
    static int index(const Node& node) { return node._id; }
55 55

	
... ...
@@ -150,20 +150,24 @@
150 150
  ///
151
  /// \brief A full digraph class.
151
  /// \brief A directed full graph class.
152 152
  ///
153
  /// This is a simple and fast directed full graph implementation.
154
  /// From each node go arcs to each node (including the source node),
155
  /// therefore the number of the arcs in the digraph is the square of
156
  /// the node number. This digraph type is completely static, so you
157
  /// can neither add nor delete either arcs or nodes, and it needs
158
  /// constant space in memory.
153
  /// FullDigraph is a simple and fast implmenetation of directed full
154
  /// (complete) graphs. It contains an arc from each node to each node
155
  /// (including a loop for each node), therefore the number of arcs
156
  /// is the square of the number of nodes.
157
  /// This class is completely static and it needs constant memory space.
158
  /// Thus you can neither add nor delete nodes or arcs, however
159
  /// the structure can be resized using resize().
159 160
  ///
160
  /// This class fully conforms to the \ref concepts::Digraph
161
  /// "Digraph concept".
161
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
162
  /// Most of its member functions and nested classes are documented
163
  /// only in the concept class.
162 164
  ///
163
  /// The \c FullDigraph and \c FullGraph classes are very similar,
165
  /// This class provides constant time counting for nodes and arcs.
166
  ///
167
  /// \note FullDigraph and FullGraph classes are very similar,
164 168
  /// but there are two differences. While this class conforms only
165
  /// to the \ref concepts::Digraph "Digraph" concept, the \c FullGraph
166
  /// class conforms to the \ref concepts::Graph "Graph" concept,
167
  /// moreover \c FullGraph does not contain a loop arc for each
168
  /// node as \c FullDigraph does.
169
  /// to the \ref concepts::Digraph "Digraph" concept, FullGraph
170
  /// conforms to the \ref concepts::Graph "Graph" concept,
171
  /// moreover FullGraph does not contain a loop for each
172
  /// node as this class does.
169 173
  ///
... ...
@@ -175,3 +179,5 @@
175 179

	
176
    /// \brief Constructor
180
    /// \brief Default constructor.
181
    ///
182
    /// Default constructor. The number of nodes and arcs will be zero.
177 183
    FullDigraph() { construct(0); }
... ...
@@ -186,4 +192,4 @@
186 192
    ///
187
    /// Resizes the digraph. The function will fully destroy and
188
    /// rebuild the digraph. This cause that the maps of the digraph will
193
    /// This function resizes the digraph. It fully destroys and
194
    /// rebuilds the structure, therefore the maps of the digraph will be
189 195
    /// reallocated automatically and the previous values will be lost.
... ...
@@ -199,5 +205,6 @@
199 205
    ///
200
    /// Returns the node with the given index. Since it is a static
201
    /// digraph its nodes can be indexed with integers from the range
202
    /// <tt>[0..nodeNum()-1]</tt>.
206
    /// Returns the node with the given index. Since this structure is
207
    /// completely static, the nodes can be indexed with integers from
208
    /// the range <tt>[0..nodeNum()-1]</tt>.
209
    /// The index of a node is the same as its ID.
203 210
    /// \sa index()
... ...
@@ -207,7 +214,8 @@
207 214
    ///
208
    /// Returns the index of the given node. Since it is a static
209
    /// digraph its nodes can be indexed with integers from the range
210
    /// <tt>[0..nodeNum()-1]</tt>.
211
    /// \sa operator()
212
    int index(const Node& node) const { return Parent::index(node); }
215
    /// Returns the index of the given node. Since this structure is
216
    /// completely static, the nodes can be indexed with integers from
217
    /// the range <tt>[0..nodeNum()-1]</tt>.
218
    /// The index of a node is the same as its ID.
219
    /// \sa operator()()
220
    static int index(const Node& node) { return Parent::index(node); }
213 221

	
... ...
@@ -216,3 +224,3 @@
216 224
    /// Returns the arc connecting the given nodes.
217
    Arc arc(const Node& u, const Node& v) const {
225
    Arc arc(Node u, Node v) const {
218 226
      return Parent::arc(u, v);
... ...
@@ -285,3 +293,3 @@
285 293
    Node operator()(int ix) const { return Node(ix); }
286
    int index(const Node& node) const { return node._id; }
294
    static int index(const Node& node) { return node._id; }
287 295

	
... ...
@@ -522,17 +530,21 @@
522 530
  ///
523
  /// This is a simple and fast undirected full graph
524
  /// implementation. From each node go edge to each other node,
525
  /// therefore the number of edges in the graph is \f$n(n-1)/2\f$.
526
  /// This graph type is completely static, so you can neither
527
  /// add nor delete either edges or nodes, and it needs constant
528
  /// space in memory.
531
  /// FullGraph is a simple and fast implmenetation of undirected full
532
  /// (complete) graphs. It contains an edge between every distinct pair
533
  /// of nodes, therefore the number of edges is <tt>n(n-1)/2</tt>.
534
  /// This class is completely static and it needs constant memory space.
535
  /// Thus you can neither add nor delete nodes or edges, however
536
  /// the structure can be resized using resize().
529 537
  ///
530
  /// This class fully conforms to the \ref concepts::Graph "Graph concept".
538
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
539
  /// Most of its member functions and nested classes are documented
540
  /// only in the concept class.
531 541
  ///
532
  /// The \c FullGraph and \c FullDigraph classes are very similar,
533
  /// but there are two differences. While the \c FullDigraph class
542
  /// This class provides constant time counting for nodes, edges and arcs.
543
  ///
544
  /// \note FullDigraph and FullGraph classes are very similar,
545
  /// but there are two differences. While FullDigraph
534 546
  /// conforms only to the \ref concepts::Digraph "Digraph" concept,
535 547
  /// this class conforms to the \ref concepts::Graph "Graph" concept,
536
  /// moreover \c FullGraph does not contain a loop arc for each
537
  /// node as \c FullDigraph does.
548
  /// moreover this class does not contain a loop for each
549
  /// node as FullDigraph does.
538 550
  ///
... ...
@@ -544,3 +556,5 @@
544 556

	
545
    /// \brief Constructor
557
    /// \brief Default constructor.
558
    ///
559
    /// Default constructor. The number of nodes and edges will be zero.
546 560
    FullGraph() { construct(0); }
... ...
@@ -555,4 +569,4 @@
555 569
    ///
556
    /// Resizes the graph. The function will fully destroy and
557
    /// rebuild the graph. This cause that the maps of the graph will
570
    /// This function resizes the graph. It fully destroys and
571
    /// rebuilds the structure, therefore the maps of the graph will be
558 572
    /// reallocated automatically and the previous values will be lost.
... ...
@@ -570,5 +584,6 @@
570 584
    ///
571
    /// Returns the node with the given index. Since it is a static
572
    /// graph its nodes can be indexed with integers from the range
573
    /// <tt>[0..nodeNum()-1]</tt>.
585
    /// Returns the node with the given index. Since this structure is
586
    /// completely static, the nodes can be indexed with integers from
587
    /// the range <tt>[0..nodeNum()-1]</tt>.
588
    /// The index of a node is the same as its ID.
574 589
    /// \sa index()
... ...
@@ -578,7 +593,8 @@
578 593
    ///
579
    /// Returns the index of the given node. Since it is a static
580
    /// graph its nodes can be indexed with integers from the range
581
    /// <tt>[0..nodeNum()-1]</tt>.
582
    /// \sa operator()
583
    int index(const Node& node) const { return Parent::index(node); }
594
    /// Returns the index of the given node. Since this structure is
595
    /// completely static, the nodes can be indexed with integers from
596
    /// the range <tt>[0..nodeNum()-1]</tt>.
597
    /// The index of a node is the same as its ID.
598
    /// \sa operator()()
599
    static int index(const Node& node) { return Parent::index(node); }
584 600

	
... ...
@@ -587,3 +603,3 @@
587 603
    /// Returns the arc connecting the given nodes.
588
    Arc arc(const Node& s, const Node& t) const {
604
    Arc arc(Node s, Node t) const {
589 605
      return Parent::arc(s, t);
... ...
@@ -591,6 +607,6 @@
591 607

	
592
    /// \brief Returns the edge connects the given nodes.
608
    /// \brief Returns the edge connecting the given nodes.
593 609
    ///
594
    /// Returns the edge connects the given nodes.
595
    Edge edge(const Node& u, const Node& v) const {
610
    /// Returns the edge connecting the given nodes.
611
    Edge edge(Node u, Node v) const {
596 612
      return Parent::edge(u, v);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -61,2 +61,38 @@
61 61

	
62
  int GlpkBase::_addRow(Value lo, ExprIterator b,
63
                        ExprIterator e, Value up) {
64
    int i = glp_add_rows(lp, 1);
65

	
66
    if (lo == -INF) {
67
      if (up == INF) {
68
        glp_set_row_bnds(lp, i, GLP_FR, lo, up);
69
      } else {
70
        glp_set_row_bnds(lp, i, GLP_UP, lo, up);
71
      }
72
    } else {
73
      if (up == INF) {
74
        glp_set_row_bnds(lp, i, GLP_LO, lo, up);
75
      } else if (lo != up) {
76
        glp_set_row_bnds(lp, i, GLP_DB, lo, up);
77
      } else {
78
        glp_set_row_bnds(lp, i, GLP_FX, lo, up);
79
      }
80
    }
81

	
82
    std::vector<int> indexes;
83
    std::vector<Value> values;
84

	
85
    indexes.push_back(0);
86
    values.push_back(0);
87

	
88
    for(ExprIterator it = b; it != e; ++it) {
89
      indexes.push_back(it->first);
90
      values.push_back(it->second);
91
    }
92

	
93
    glp_set_mat_row(lp, i, values.size() - 1,
94
                    &indexes.front(), &values.front());
95
    return i;
96
  }
97

	
62 98
  void GlpkBase::_eraseCol(int i) {
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -32,3 +32,3 @@
32 32
    private:
33
      void *_ptr;      
33
      void *_ptr;
34 34
    public:
... ...
@@ -40,4 +40,4 @@
40 40
      template <typename T>
41
      VoidPtr& operator=(T* ptr) { 
42
        _ptr = reinterpret_cast<void*>(ptr); 
41
      VoidPtr& operator=(T* ptr) {
42
        _ptr = reinterpret_cast<void*>(ptr);
43 43
        return *this;
... ...
@@ -67,2 +67,3 @@
67 67
    virtual int _addRow();
68
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
68 69

	
... ...
@@ -125,3 +126,3 @@
125 126
    };
126
    
127

	
127 128
    static FreeEnvHelper freeEnvHelper;
... ...
@@ -129,5 +130,5 @@
129 130
  protected:
130
    
131

	
131 132
    int _message_level;
132
    
133

	
133 134
  public:
Ignore white space 6 line context
1
/* -*- C++ -*-
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library
3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -29,3 +29,3 @@
29 29
/// \ingroup min_cut
30
/// \file 
30
/// \file
31 31
/// \brief Gomory-Hu cut tree in graphs.
... ...
@@ -40,3 +40,3 @@
40 40
  /// may contain edges which are not in the original graph. It has the
41
  /// property that the minimum capacity edge of the path between two nodes 
41
  /// property that the minimum capacity edge of the path between two nodes
42 42
  /// in this tree has the same weight as the minimum cut in the graph
... ...
@@ -46,3 +46,3 @@
46 46
  /// of nodes can easily be obtained.
47
  /// 
47
  ///
48 48
  /// The algorithm calculates \e n-1 distinct minimum cuts (currently with
... ...
@@ -62,6 +62,6 @@
62 62
  template <typename GR,
63
	    typename CAP>
63
            typename CAP>
64 64
#else
65 65
  template <typename GR,
66
	    typename CAP = typename GR::template EdgeMap<int> >
66
            typename CAP = typename GR::template EdgeMap<int> >
67 67
#endif
... ...
@@ -76,3 +76,3 @@
76 76
    typedef typename Capacity::Value Value;
77
    
77

	
78 78
  private:
... ...
@@ -91,9 +91,9 @@
91 91
      if (!_pred) {
92
	_pred = new typename Graph::template NodeMap<Node>(_graph);
92
        _pred = new typename Graph::template NodeMap<Node>(_graph);
93 93
      }
94 94
      if (!_weight) {
95
	_weight = new typename Graph::template NodeMap<Value>(_graph);
95
        _weight = new typename Graph::template NodeMap<Value>(_graph);
96 96
      }
97 97
      if (!_order) {
98
	_order = new typename Graph::template NodeMap<int>(_graph);
98
        _order = new typename Graph::template NodeMap<int>(_graph);
99 99
      }
... ...
@@ -103,12 +103,12 @@
103 103
      if (_pred) {
104
	delete _pred;
104
        delete _pred;
105 105
      }
106 106
      if (_weight) {
107
	delete _weight;
107
        delete _weight;
108 108
      }
109 109
      if (_order) {
110
	delete _order;
110
        delete _order;
111 111
      }
112 112
    }
113
  
113

	
114 114
  public:
... ...
@@ -120,5 +120,5 @@
120 120
    /// \param capacity The edge capacity map.
121
    GomoryHu(const Graph& graph, const Capacity& capacity) 
121
    GomoryHu(const Graph& graph, const Capacity& capacity)
122 122
      : _graph(graph), _capacity(capacity),
123
	_pred(0), _weight(0), _order(0) 
123
        _pred(0), _weight(0), _order(0)
124 124
    {
... ...
@@ -136,3 +136,3 @@
136 136
  private:
137
  
137

	
138 138
    // Initialize the internal data structures
... ...
@@ -147,3 +147,3 @@
147 147
      (*_pred)[_root] = INVALID;
148
      (*_weight)[_root] = std::numeric_limits<Value>::max(); 
148
      (*_weight)[_root] = std::numeric_limits<Value>::max();
149 149
    }
... ...
@@ -156,23 +156,23 @@
156 156
      for (NodeIt n(_graph); n != INVALID; ++n) {
157
	if (n == _root) continue;
157
        if (n == _root) continue;
158 158

	
159
	Node pn = (*_pred)[n];
160
	fa.source(n);
161
	fa.target(pn);
159
        Node pn = (*_pred)[n];
160
        fa.source(n);
161
        fa.target(pn);
162 162

	
163
	fa.runMinCut();
163
        fa.runMinCut();
164 164

	
165
	(*_weight)[n] = fa.flowValue();
165
        (*_weight)[n] = fa.flowValue();
166 166

	
167
	for (NodeIt nn(_graph); nn != INVALID; ++nn) {
168
	  if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
169
	    (*_pred)[nn] = n;
170
	  }
171
	}
172
	if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
173
	  (*_pred)[n] = (*_pred)[pn];
174
	  (*_pred)[pn] = n;
175
	  (*_weight)[n] = (*_weight)[pn];
176
	  (*_weight)[pn] = fa.flowValue();
177
	}
167
        for (NodeIt nn(_graph); nn != INVALID; ++nn) {
168
          if (nn != n && fa.minCut(nn) && (*_pred)[nn] == pn) {
169
            (*_pred)[nn] = n;
170
          }
171
        }
172
        if ((*_pred)[pn] != INVALID && fa.minCut((*_pred)[pn])) {
173
          (*_pred)[n] = (*_pred)[pn];
174
          (*_pred)[pn] = n;
175
          (*_weight)[n] = (*_weight)[pn];
176
          (*_weight)[pn] = fa.flowValue();
177
        }
178 178
      }
... ...
@@ -183,12 +183,12 @@
183 183
      for (NodeIt n(_graph); n != INVALID; ++n) {
184
	std::vector<Node> st;
185
	Node nn = n;
186
	while ((*_order)[nn] == -1) {
187
	  st.push_back(nn);
188
	  nn = (*_pred)[nn];
189
	}
190
	while (!st.empty()) {
191
	  (*_order)[st.back()] = index++;
192
	  st.pop_back();
193
	}
184
        std::vector<Node> st;
185
        Node nn = n;
186
        while ((*_order)[nn] == -1) {
187
          st.push_back(nn);
188
          nn = (*_pred)[nn];
189
        }
190
        while (!st.empty()) {
191
          (*_order)[st.back()] = index++;
192
          st.pop_back();
193
        }
194 194
      }
... ...
@@ -199,3 +199,3 @@
199 199
    ///\name Execution Control
200
 
200

	
201 201
    ///@{
... ...
@@ -209,3 +209,3 @@
209 209
    }
210
    
210

	
211 211
    /// @}
... ...
@@ -234,3 +234,3 @@
234 234
    ///
235
    /// This function returns the weight of the predecessor edge of the 
235
    /// This function returns the weight of the predecessor edge of the
236 236
    /// given node in the Gomory-Hu tree.
... ...
@@ -256,3 +256,3 @@
256 256
    /// This function returns the minimum cut value between the nodes
257
    /// \c s and \c t. 
257
    /// \c s and \c t.
258 258
    /// It finds the nearest common ancestor of the given nodes in the
... ...
@@ -265,11 +265,11 @@
265 265
      Value value = std::numeric_limits<Value>::max();
266
      
266

	
267 267
      while (sn != tn) {
268
	if ((*_order)[sn] < (*_order)[tn]) {
269
	  if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270
	  tn = (*_pred)[tn];
271
	} else {
272
	  if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273
	  sn = (*_pred)[sn];
274
	}
268
        if ((*_order)[sn] < (*_order)[tn]) {
269
          if ((*_weight)[tn] <= value) value = (*_weight)[tn];
270
          tn = (*_pred)[tn];
271
        } else {
272
          if ((*_weight)[sn] <= value) value = (*_weight)[sn];
273
          sn = (*_pred)[sn];
274
        }
275 275
      }
... ...
@@ -296,7 +296,5 @@
296 296
    template <typename CutMap>
297
    Value minCutMap(const Node& s, ///< 
297
    Value minCutMap(const Node& s,
298 298
                    const Node& t,
299
                    ///< 
300 299
                    CutMap& cutMap
301
                    ///< 
302 300
                    ) const {
... ...
@@ -306,19 +304,19 @@
306 304
      Value value = std::numeric_limits<Value>::max();
307
      
305

	
308 306
      while (sn != tn) {
309
	if ((*_order)[sn] < (*_order)[tn]) {
310
	  if ((*_weight)[tn] <= value) {
311
	    rn = tn;
307
        if ((*_order)[sn] < (*_order)[tn]) {
308
          if ((*_weight)[tn] <= value) {
309
            rn = tn;
312 310
            s_root = false;
313
	    value = (*_weight)[tn];
314
	  }
315
	  tn = (*_pred)[tn];
316
	} else {
317
	  if ((*_weight)[sn] <= value) {
318
	    rn = sn;
311
            value = (*_weight)[tn];
312
          }
313
          tn = (*_pred)[tn];
314
        } else {
315
          if ((*_weight)[sn] <= value) {
316
            rn = sn;
319 317
            s_root = true;
320
	    value = (*_weight)[sn];
321
	  }
322
	  sn = (*_pred)[sn];
323
	}
318
            value = (*_weight)[sn];
319
          }
320
          sn = (*_pred)[sn];
321
        }
324 322
      }
... ...
@@ -333,14 +331,14 @@
333 331
      for (NodeIt n(_graph); n != INVALID; ++n) {
334
	st.clear();
332
        st.clear();
335 333
        Node nn = n;
336
	while (!reached[nn]) {
337
	  st.push_back(nn);
338
	  nn = (*_pred)[nn];
339
	}
340
	while (!st.empty()) {
341
	  cutMap.set(st.back(), cutMap[nn]);
342
	  st.pop_back();
343
	}
334
        while (!reached[nn]) {
335
          st.push_back(nn);
336
          nn = (*_pred)[nn];
337
        }
338
        while (!st.empty()) {
339
          cutMap.set(st.back(), cutMap[nn]);
340
          st.pop_back();
341
        }
344 342
      }
345
      
343

	
346 344
      return value;
... ...
@@ -353,3 +351,3 @@
353 351
    /// Iterate on the nodes of a minimum cut
354
    
352

	
355 353
    /// This iterator class lists the nodes of a minimum cut found by
... ...
@@ -361,6 +359,6 @@
361 359
    /// \code
362
    /// GomoruHu<Graph> gom(g, capacities);
360
    /// GomoryHu<Graph> gom(g, capacities);
363 361
    /// gom.run();
364 362
    /// int cnt=0;
365
    /// for(GomoruHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
363
    /// for(GomoryHu<Graph>::MinCutNodeIt n(gom,s,t); n!=INVALID; ++n) ++cnt;
366 364
    /// \endcode
... ...
@@ -396,3 +394,3 @@
396 394
                   /// does not necessarily give the same set of nodes.
397
                   /// However it is ensured that
395
                   /// However, it is ensured that
398 396
                   /// \code
... ...
@@ -446,7 +444,7 @@
446 444
    };
447
    
445

	
448 446
    friend class MinCutEdgeIt;
449
    
447

	
450 448
    /// Iterate on the edges of a minimum cut
451
    
449

	
452 450
    /// This iterator class lists the edges of a minimum cut found by
... ...
@@ -458,6 +456,6 @@
458 456
    /// \code
459
    /// GomoruHu<Graph> gom(g, capacities);
457
    /// GomoryHu<Graph> gom(g, capacities);
460 458
    /// gom.run();
461 459
    /// int value=0;
462
    /// for(GomoruHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
460
    /// for(GomoryHu<Graph>::MinCutEdgeIt e(gom,s,t); e!=INVALID; ++e)
463 461
    ///   value+=capacities[e];
... ...
@@ -483,3 +481,3 @@
483 481
      }
484
      
482

	
485 483
    public:
... ...
@@ -552,3 +550,3 @@
552 550
      /// Postfix incrementation
553
      
551

	
554 552
      /// Postfix incrementation.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -144,3 +144,3 @@
144 144
  ///\param ost Reference to the output stream.
145
  ///By default it is <tt>std::cout</tt>.
145
  ///By default, it is <tt>std::cout</tt>.
146 146
  ///\param pros If it is \c true, then the \c ostream referenced by \c os
... ...
@@ -514,3 +514,3 @@
514 514

	
515
  ///By default graphToEps() rescales the whole image in order to avoid
515
  ///By default, graphToEps() rescales the whole image in order to avoid
516 516
  ///very big or very small bounding boxes.
... ...
@@ -1116,3 +1116,3 @@
1116 1116
///\param os Reference to the output stream.
1117
///By default it is <tt>std::cout</tt>.
1117
///By default, it is <tt>std::cout</tt>.
1118 1118
///
... ...
@@ -1128,3 +1128,3 @@
1128 1128
///
1129
///For more detailed examples see the \ref graph_to_eps_demo.cc demo file.
1129
///For more detailed examples, see the \ref graph_to_eps_demo.cc demo file.
1130 1130
///
Ignore white space 6 line context
... ...
@@ -472,10 +472,10 @@
472 472
  ///
473
  /// This class implements a special graph type. The nodes of the
474
  /// graph can be indexed by two integer \c (i,j) value where \c i is
475
  /// in the \c [0..width()-1] range and j is in the \c
476
  /// [0..height()-1] range.  Two nodes are connected in the graph if
477
  /// the indexes differ exactly on one position and exactly one is
478
  /// the difference. The nodes of the graph can be indexed by position
479
  /// with the \c operator()() function. The positions of the nodes can be
480
  /// get with \c pos(), \c col() and \c row() members. The outgoing
473
  /// GridGraph implements a special graph type. The nodes of the
474
  /// graph can be indexed by two integer values \c (i,j) where \c i is
475
  /// in the range <tt>[0..width()-1]</tt> and j is in the range
476
  /// <tt>[0..height()-1]</tt>. Two nodes are connected in the graph if
477
  /// the indices differ exactly on one position and the difference is
478
  /// also exactly one. The nodes of the graph can be obtained by position
479
  /// using the \c operator()() function and the indices of the nodes can
480
  /// be obtained using \c pos(), \c col() and \c row() members. The outgoing
481 481
  /// arcs can be retrieved with the \c right(), \c up(), \c left()
... ...
@@ -484,2 +484,6 @@
484 484
  ///
485
  /// This class is completely static and it needs constant memory space.
486
  /// Thus you can neither add nor delete nodes or edges, however
487
  /// the structure can be resized using resize().
488
  ///
485 489
  /// \image html grid_graph.png
... ...
@@ -498,4 +502,7 @@
498 502
  ///
499
  /// This graph type fully conforms to the \ref concepts::Graph
500
  /// "Graph concept".
503
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
504
  /// Most of its member functions and nested classes are documented
505
  /// only in the concept class.
506
  ///
507
  /// This class provides constant time counting for nodes, edges and arcs.
501 508
  class GridGraph : public ExtendedGridGraphBase {
... ...
@@ -505,5 +512,7 @@
505 512

	
506
    /// \brief Map to get the indices of the nodes as dim2::Point<int>.
513
    /// \brief Map to get the indices of the nodes as \ref dim2::Point
514
    /// "dim2::Point<int>".
507 515
    ///
508
    /// Map to get the indices of the nodes as dim2::Point<int>.
516
    /// Map to get the indices of the nodes as \ref dim2::Point
517
    /// "dim2::Point<int>".
509 518
    class IndexMap {
... ...
@@ -516,4 +525,2 @@
516 525
      /// \brief Constructor
517
      ///
518
      /// Constructor
519 526
      IndexMap(const GridGraph& graph) : _graph(graph) {}
... ...
@@ -521,4 +528,2 @@
521 528
      /// \brief The subscript operator
522
      ///
523
      /// The subscript operator.
524 529
      Value operator[](Key key) const {
... ...
@@ -542,4 +547,2 @@
542 547
      /// \brief Constructor
543
      ///
544
      /// Constructor
545 548
      ColMap(const GridGraph& graph) : _graph(graph) {}
... ...
@@ -547,4 +550,2 @@
547 550
      /// \brief The subscript operator
548
      ///
549
      /// The subscript operator.
550 551
      Value operator[](Key key) const {
... ...
@@ -568,4 +569,2 @@
568 569
      /// \brief Constructor
569
      ///
570
      /// Constructor
571 570
      RowMap(const GridGraph& graph) : _graph(graph) {}
... ...
@@ -573,4 +572,2 @@
573 572
      /// \brief The subscript operator
574
      ///
575
      /// The subscript operator.
576 573
      Value operator[](Key key) const {
... ...
@@ -585,11 +582,10 @@
585 582
    ///
586
    /// Construct a grid graph with given size.
583
    /// Construct a grid graph with the given size.
587 584
    GridGraph(int width, int height) { construct(width, height); }
588 585

	
589
    /// \brief Resize the graph
586
    /// \brief Resizes the graph
590 587
    ///
591
    /// Resize the graph. The function will fully destroy and rebuild
592
    /// the graph.  This cause that the maps of the graph will
593
    /// reallocated automatically and the previous values will be
594
    /// lost.
588
    /// This function resizes the graph. It fully destroys and
589
    /// rebuilds the structure, therefore the maps of the graph will be
590
    /// reallocated automatically and the previous values will be lost.
595 591
    void resize(int width, int height) {
... ...
@@ -611,3 +607,3 @@
611 607

	
612
    /// \brief Gives back the column index of the node.
608
    /// \brief The column index of the node.
613 609
    ///
... ...
@@ -618,3 +614,3 @@
618 614

	
619
    /// \brief Gives back the row index of the node.
615
    /// \brief The row index of the node.
620 616
    ///
... ...
@@ -625,3 +621,3 @@
625 621

	
626
    /// \brief Gives back the position of the node.
622
    /// \brief The position of the node.
627 623
    ///
... ...
@@ -632,3 +628,3 @@
632 628

	
633
    /// \brief Gives back the number of the columns.
629
    /// \brief The number of the columns.
634 630
    ///
... ...
@@ -639,3 +635,3 @@
639 635

	
640
    /// \brief Gives back the number of the rows.
636
    /// \brief The number of the rows.
641 637
    ///
... ...
@@ -646,3 +642,3 @@
646 642

	
647
    /// \brief Gives back the arc goes right from the node.
643
    /// \brief The arc goes right from the node.
648 644
    ///
... ...
@@ -654,3 +650,3 @@
654 650

	
655
    /// \brief Gives back the arc goes left from the node.
651
    /// \brief The arc goes left from the node.
656 652
    ///
... ...
@@ -662,3 +658,3 @@
662 658

	
663
    /// \brief Gives back the arc goes up from the node.
659
    /// \brief The arc goes up from the node.
664 660
    ///
... ...
@@ -670,3 +666,3 @@
670 666

	
671
    /// \brief Gives back the arc goes down from the node.
667
    /// \brief The arc goes down from the node.
672 668
    ///
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -33,3 +33,3 @@
33 33
///
34
/// Implementation of the Hao-Orlin algorithm for finding a minimum cut 
34
/// Implementation of the Hao-Orlin algorithm for finding a minimum cut
35 35
/// in a digraph.
... ...
@@ -43,3 +43,3 @@
43 43
  /// This class implements the Hao-Orlin algorithm for finding a minimum
44
  /// value cut in a directed graph \f$D=(V,A)\f$. 
44
  /// value cut in a directed graph \f$D=(V,A)\f$.
45 45
  /// It takes a fixed node \f$ source \in V \f$ and
... ...
@@ -60,3 +60,3 @@
60 60
  /// algorithm or you can use the algorithm of Nagamochi and Ibaraki,
61
  /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$ 
61
  /// which solves the undirected problem in \f$ O(nm + n^2 \log n) \f$
62 62
  /// time. It is implemented in the NagamochiIbaraki algorithm class.
... ...
@@ -78,3 +78,3 @@
78 78
  public:
79
   
79

	
80 80
    /// The digraph type of the algorithm
... ...
@@ -167,2 +167,19 @@
167 167

	
168
    /// \brief Set the tolerance used by the algorithm.
169
    ///
170
    /// This function sets the tolerance object used by the algorithm.
171
    /// \return <tt>(*this)</tt>
172
    HaoOrlin& tolerance(const Tolerance& tolerance) {
173
      _tolerance = tolerance;
174
      return *this;
175
    }
176

	
177
    /// \brief Returns a const reference to the tolerance.
178
    ///
179
    /// This function returns a const reference to the tolerance object
180
    /// used by the algorithm.
181
    const Tolerance& tolerance() const {
182
      return _tolerance;
183
    }
184

	
168 185
  private:
... ...
@@ -849,3 +866,3 @@
849 866
    /// This function initializes the internal data structures. It creates
850
    /// the maps and some bucket structures for the algorithm. 
867
    /// the maps and some bucket structures for the algorithm.
851 868
    /// The given node is used as the source node for the push-relabel
... ...
@@ -929,3 +946,3 @@
929 946
    ///
930
    /// This function runs the algorithm. It uses the given \c source node, 
947
    /// This function runs the algorithm. It uses the given \c source node,
931 948
    /// finds a proper \c target node and then calls the \ref init(),
... ...
@@ -943,3 +960,3 @@
943 960
    /// can be obtained using these functions.\n
944
    /// \ref run(), \ref calculateOut() or \ref calculateIn() 
961
    /// \ref run(), \ref calculateOut() or \ref calculateIn()
945 962
    /// should be called before using them.
... ...
@@ -952,3 +969,3 @@
952 969
    ///
953
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
970
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
954 971
    /// must be called before using this function.
... ...
@@ -971,3 +988,3 @@
971 988
    ///
972
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn() 
989
    /// \pre \ref run(), \ref calculateOut() or \ref calculateIn()
973 990
    /// must be called before using this function.
Ignore white space 6 line context
... ...
@@ -264,3 +264,3 @@
264 264

	
265
    int index(Node node) const {
265
    static int index(Node node) {
266 266
      return node._id;
... ...
@@ -284,6 +284,15 @@
284 284
  ///
285
  /// This class implements a special graph type. The nodes of the graph
286
  /// are indiced with integers with at most \c dim binary digits.
285
  /// HypercubeGraph implements a special graph type. The nodes of the
286
  /// graph are indexed with integers having at most \c dim binary digits.
287 287
  /// Two nodes are connected in the graph if and only if their indices
288 288
  /// differ only on one position in the binary form.
289
  /// This class is completely static and it needs constant memory space.
290
  /// Thus you can neither add nor delete nodes or edges, however,
291
  /// the structure can be resized using resize().
292
  ///
293
  /// This type fully conforms to the \ref concepts::Graph "Graph concept".
294
  /// Most of its member functions and nested classes are documented
295
  /// only in the concept class.
296
  ///
297
  /// This class provides constant time counting for nodes, edges and arcs.
289 298
  ///
... ...
@@ -292,5 +301,2 @@
292 301
  /// (assuming that the size of \c int is 32 bit).
293
  ///
294
  /// This graph type fully conforms to the \ref concepts::Graph
295
  /// "Graph concept".
296 302
  class HypercubeGraph : public ExtendedHypercubeGraphBase {
... ...
@@ -305,2 +311,17 @@
305 311

	
312
    /// \brief Resizes the graph
313
    ///
314
    /// This function resizes the graph. It fully destroys and
315
    /// rebuilds the structure, therefore the maps of the graph will be
316
    /// reallocated automatically and the previous values will be lost.
317
    void resize(int dim) {
318
      Parent::notifier(Arc()).clear();
319
      Parent::notifier(Edge()).clear();
320
      Parent::notifier(Node()).clear();
321
      construct(dim);
322
      Parent::notifier(Node()).build();
323
      Parent::notifier(Edge()).build();
324
      Parent::notifier(Arc()).build();
325
    }
326

	
306 327
    /// \brief The number of dimensions.
... ...
@@ -322,3 +343,3 @@
322 343
    /// Gives back the dimension id of the given edge.
323
    /// It is in the [0..dim-1] range.
344
    /// It is in the range <tt>[0..dim-1]</tt>.
324 345
    int dimension(Edge edge) const {
... ...
@@ -330,3 +351,3 @@
330 351
    /// Gives back the dimension id of the given arc.
331
    /// It is in the [0..dim-1] range.
352
    /// It is in the range <tt>[0..dim-1]</tt>.
332 353
    int dimension(Arc arc) const {
... ...
@@ -339,3 +360,3 @@
339 360
    /// The lower bits of the integer describes the node.
340
    int index(Node node) const {
361
    static int index(Node node) {
341 362
      return Parent::index(node);
Ignore white space 6 line context
... ...
@@ -429,3 +429,3 @@
429 429
  ///
430
  /// By default the reader uses the first section in the file of the
430
  /// By default, the reader uses the first section in the file of the
431 431
  /// proper type. If a section has an optional name, then it can be
... ...
@@ -564,3 +564,3 @@
564 564
    template <typename TDGR>
565
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph, 
565
    friend DigraphReader<TDGR> digraphReader(TDGR& digraph,
566 566
                                             const std::string& fn);
... ...
@@ -1196,3 +1196,3 @@
1196 1196
  };
1197
  
1197

	
1198 1198
  /// \ingroup lemon_io
... ...
@@ -1203,3 +1203,3 @@
1203 1203
  ///
1204
  /// With this function a digraph can be read from an 
1204
  /// With this function a digraph can be read from an
1205 1205
  /// \ref lgf-format "LGF" file or input stream with several maps and
... ...
@@ -1258,3 +1258,3 @@
1258 1258
  class GraphReader;
1259
 
1259

	
1260 1260
  template <typename TGR>
... ...
@@ -1395,3 +1395,3 @@
1395 1395
    template <typename TGR>
1396
    friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn); 
1396
    friend GraphReader<TGR> graphReader(TGR& graph, const std::string& fn);
1397 1397
    template <typename TGR>
... ...
@@ -2079,5 +2079,5 @@
2079 2079
  ///
2080
  /// This function just returns a \ref GraphReader class. 
2080
  /// This function just returns a \ref GraphReader class.
2081 2081
  ///
2082
  /// With this function a graph can be read from an 
2082
  /// With this function a graph can be read from an
2083 2083
  /// \ref lgf-format "LGF" file or input stream with several maps and
... ...
@@ -2237,3 +2237,3 @@
2237 2237
    ///
2238
    /// For example let's see a section, which contain several
2238
    /// For example, let's see a section, which contain several
2239 2239
    /// integers, which should be inserted into a vector.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -353,3 +353,3 @@
353 353
  template <typename TDGR>
354
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
354
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
355 355
                                   std::ostream& os = std::cout);
... ...
@@ -506,3 +506,3 @@
506 506
    template <typename TDGR>
507
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
507
    friend DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
508 508
                                             std::ostream& os);
... ...
@@ -919,3 +919,3 @@
919 919
  ///
920
  /// This function just returns a \ref DigraphWriter class. 
920
  /// This function just returns a \ref DigraphWriter class.
921 921
  ///
... ...
@@ -959,3 +959,3 @@
959 959
  template <typename TDGR>
960
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph, 
960
  DigraphWriter<TDGR> digraphWriter(const TDGR& digraph,
961 961
                                    const std::string& fn) {
... ...
@@ -1103,3 +1103,3 @@
1103 1103
    template <typename TGR>
1104
    friend GraphWriter<TGR> graphWriter(const TGR& graph, 
1104
    friend GraphWriter<TGR> graphWriter(const TGR& graph,
1105 1105
                                        const std::string& fn);
... ...
@@ -1107,3 +1107,3 @@
1107 1107
    friend GraphWriter<TGR> graphWriter(const TGR& graph, const char *fn);
1108
    
1108

	
1109 1109
    GraphWriter(GraphWriter& other)
... ...
@@ -1558,3 +1558,3 @@
1558 1558
  ///
1559
  /// This function just returns a \ref GraphWriter class. 
1559
  /// This function just returns a \ref GraphWriter class.
1560 1560
  ///
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -23,3 +23,3 @@
23 23
///\file
24
///\brief ListDigraph, ListGraph classes.
24
///\brief ListDigraph and ListGraph classes.
25 25

	
... ...
@@ -34,2 +34,4 @@
34 34

	
35
  class ListDigraph;
36

	
35 37
  class ListDigraphBase {
... ...
@@ -64,2 +66,3 @@
64 66
      friend class ListDigraphBase;
67
      friend class ListDigraph;
65 68
    protected:
... ...
@@ -79,2 +82,3 @@
79 82
      friend class ListDigraphBase;
83
      friend class ListDigraph;
80 84
    protected:
... ...
@@ -118,5 +122,5 @@
118 122
      for(n = first_node;
119
          n!=-1 && nodes[n].first_in == -1;
123
          n != -1 && nodes[n].first_out == -1;
120 124
          n = nodes[n].next) {}
121
      arc.id = (n == -1) ? -1 : nodes[n].first_in;
125
      arc.id = (n == -1) ? -1 : nodes[n].first_out;
122 126
    }
... ...
@@ -124,10 +128,10 @@
124 128
    void next(Arc& arc) const {
125
      if (arcs[arc.id].next_in != -1) {
126
        arc.id = arcs[arc.id].next_in;
129
      if (arcs[arc.id].next_out != -1) {
130
        arc.id = arcs[arc.id].next_out;
127 131
      } else {
128 132
        int n;
129
        for(n = nodes[arcs[arc.id].target].next;
130
            n!=-1 && nodes[n].first_in == -1;
133
        for(n = nodes[arcs[arc.id].source].next;
134
            n != -1 && nodes[n].first_out == -1;
131 135
            n = nodes[n].next) {}
132
        arc.id = (n == -1) ? -1 : nodes[n].first_in;
136
        arc.id = (n == -1) ? -1 : nodes[n].first_out;
133 137
      }
... ...
@@ -313,13 +317,15 @@
313 317

	
314
  ///\ref ListDigraph is a simple and fast <em>directed graph</em>
315
  ///implementation based on static linked lists that are stored in
318
  ///\ref ListDigraph is a versatile and fast directed graph
319
  ///implementation based on linked lists that are stored in
316 320
  ///\c std::vector structures.
317 321
  ///
318
  ///It conforms to the \ref concepts::Digraph "Digraph concept" and it
319
  ///also provides several useful additional functionalities.
320
  ///Most of the member functions and nested classes are documented
322
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
323
  ///and it also provides several useful additional functionalities.
324
  ///Most of its member functions and nested classes are documented
321 325
  ///only in the concept class.
322 326
  ///
327
  ///This class provides only linear time counting for nodes and arcs.
328
  ///
323 329
  ///\sa concepts::Digraph
324

	
330
  ///\sa ListGraph
325 331
  class ListDigraph : public ExtendedListDigraphBase {
... ...
@@ -328,12 +334,6 @@
328 334
  private:
329
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
330

	
331
    ///ListDigraph is \e not copy constructible. Use copyDigraph() instead.
332
    ///
335
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
333 336
    ListDigraph(const ListDigraph &) :ExtendedListDigraphBase() {};
334
    ///\brief Assignment of ListDigraph to another one is \e not allowed.
335
    ///Use copyDigraph() instead.
336

	
337
    ///Assignment of ListDigraph to another one is \e not allowed.
338
    ///Use copyDigraph() instead.
337
    /// \brief Assignment of a digraph to another one is \e not allowed.
338
    /// Use DigraphCopy instead.
339 339
    void operator=(const ListDigraph &) {}
... ...
@@ -349,3 +349,3 @@
349 349

	
350
    ///Add a new node to the digraph.
350
    ///This function adds a new node to the digraph.
351 351
    ///\return The new node.
... ...
@@ -355,6 +355,6 @@
355 355

	
356
    ///Add a new arc to the digraph with source node \c s
356
    ///This function adds a new arc to the digraph with source node \c s
357 357
    ///and target node \c t.
358 358
    ///\return The new arc.
359
    Arc addArc(const Node& s, const Node& t) {
359
    Arc addArc(Node s, Node t) {
360 360
      return Parent::addArc(s, t);
... ...
@@ -364,5 +364,8 @@
364 364
    ///
365
    ///Erase a node from the digraph.
365
    ///This function erases the given node along with its outgoing and
366
    ///incoming arcs from the digraph.
366 367
    ///
367
    void erase(const Node& n) { Parent::erase(n); }
368
    ///\note All iterators referencing the removed node or the connected
369
    ///arcs are invalidated, of course.
370
    void erase(Node n) { Parent::erase(n); }
368 371

	
... ...
@@ -370,5 +373,7 @@
370 373
    ///
371
    ///Erase an arc from the digraph.
374
    ///This function erases the given arc from the digraph.
372 375
    ///
373
    void erase(const Arc& a) { Parent::erase(a); }
376
    ///\note All iterators referencing the removed arc are invalidated,
377
    ///of course.
378
    void erase(Arc a) { Parent::erase(a); }
374 379

	
... ...
@@ -376,8 +381,7 @@
376 381

	
377
    /// This function gives back true if the given node is valid,
378
    /// ie. it is a real node of the graph.
382
    /// This function gives back \c true if the given node is valid,
383
    /// i.e. it is a real node of the digraph.
379 384
    ///
380
    /// \warning A Node pointing to a removed item
381
    /// could become valid again later if new nodes are
382
    /// added to the graph.
385
    /// \warning A removed node could become valid again if new nodes are
386
    /// added to the digraph.
383 387
    bool valid(Node n) const { return Parent::valid(n); }
... ...
@@ -386,17 +390,15 @@
386 390

	
387
    /// This function gives back true if the given arc is valid,
388
    /// ie. it is a real arc of the graph.
391
    /// This function gives back \c true if the given arc is valid,
392
    /// i.e. it is a real arc of the digraph.
389 393
    ///
390
    /// \warning An Arc pointing to a removed item
391
    /// could become valid again later if new nodes are
392
    /// added to the graph.
394
    /// \warning A removed arc could become valid again if new arcs are
395
    /// added to the digraph.
393 396
    bool valid(Arc a) const { return Parent::valid(a); }
394 397

	
395
    /// Change the target of \c a to \c n
398
    /// Change the target node of an arc
396 399

	
397
    /// Change the target of \c a to \c n
400
    /// This function changes the target node of the given arc \c a to \c n.
398 401
    ///
399
    ///\note The <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s referencing
400
    ///the changed arc remain valid. However <tt>InArcIt</tt>s are
401
    ///invalidated.
402
    ///\note \c ArcIt and \c OutArcIt iterators referencing the changed
403
    ///arc remain valid, but \c InArcIt iterators are invalidated.
402 404
    ///
... ...
@@ -407,9 +409,8 @@
407 409
    }
408
    /// Change the source of \c a to \c n
410
    /// Change the source node of an arc
409 411

	
410
    /// Change the source of \c a to \c n
412
    /// This function changes the source node of the given arc \c a to \c n.
411 413
    ///
412
    ///\note The <tt>InArcIt</tt>s referencing the changed arc remain
413
    ///valid. However the <tt>ArcIt</tt>s and <tt>OutArcIt</tt>s are
414
    ///invalidated.
414
    ///\note \c InArcIt iterators referencing the changed arc remain
415
    ///valid, but \c ArcIt and \c OutArcIt iterators are invalidated.
415 416
    ///
... ...
@@ -421,7 +422,7 @@
421 422

	
422
    /// Invert the direction of an arc.
423
    /// Reverse the direction of an arc.
423 424

	
424
    ///\note The <tt>ArcIt</tt>s referencing the changed arc remain
425
    ///valid. However <tt>OutArcIt</tt>s and <tt>InArcIt</tt>s are
426
    ///invalidated.
425
    /// This function reverses the direction of the given arc.
426
    ///\note \c ArcIt, \c OutArcIt and \c InArcIt iterators referencing
427
    ///the changed arc are invalidated.
427 428
    ///
... ...
@@ -429,39 +430,22 @@
429 430
    ///feature.
430
    void reverseArc(Arc e) {
431
      Node t=target(e);
432
      changeTarget(e,source(e));
433
      changeSource(e,t);
431
    void reverseArc(Arc a) {
432
      Node t=target(a);
433
      changeTarget(a,source(a));
434
      changeSource(a,t);
434 435
    }
435 436

	
436
    /// Reserve memory for nodes.
437

	
438
    /// Using this function it is possible to avoid the superfluous memory
439
    /// allocation: if you know that the digraph you want to build will
440
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
441
    /// then it is worth reserving space for this amount before starting
442
    /// to build the digraph.
443
    /// \sa reserveArc
444
    void reserveNode(int n) { nodes.reserve(n); };
445

	
446
    /// Reserve memory for arcs.
447

	
448
    /// Using this function it is possible to avoid the superfluous memory
449
    /// allocation: if you know that the digraph you want to build will
450
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
451
    /// then it is worth reserving space for this amount before starting
452
    /// to build the digraph.
453
    /// \sa reserveNode
454
    void reserveArc(int m) { arcs.reserve(m); };
455

	
456 437
    ///Contract two nodes.
457 438

	
458
    ///This function contracts two nodes.
459
    ///Node \p b will be removed but instead of deleting
460
    ///incident arcs, they will be joined to \p a.
461
    ///The last parameter \p r controls whether to remove loops. \c true
462
    ///means that loops will be removed.
439
    ///This function contracts the given two nodes.
440
    ///Node \c v is removed, but instead of deleting its
441
    ///incident arcs, they are joined to node \c u.
442
    ///If the last parameter \c r is \c true (this is the default value),
443
    ///then the newly created loops are removed.
463 444
    ///
464
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
465
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s
466
    ///may be invalidated.
445
    ///\note The moved arcs are joined to node \c u using changeSource()
446
    ///or changeTarget(), thus \c ArcIt and \c OutArcIt iterators are
447
    ///invalidated for the outgoing arcs of node \c v and \c InArcIt
448
    ///iterators are invalidated for the incomming arcs of \c v.
449
    ///Moreover all iterators referencing node \c v or the removed
450
    ///loops are also invalidated. Other iterators remain valid.
467 451
    ///
... ...
@@ -469,19 +453,19 @@
469 453
    ///feature.
470
    void contract(Node a, Node b, bool r = true)
454
    void contract(Node u, Node v, bool r = true)
471 455
    {
472
      for(OutArcIt e(*this,b);e!=INVALID;) {
456
      for(OutArcIt e(*this,v);e!=INVALID;) {
473 457
        OutArcIt f=e;
474 458
        ++f;
475
        if(r && target(e)==a) erase(e);
476
        else changeSource(e,a);
459
        if(r && target(e)==u) erase(e);
460
        else changeSource(e,u);
477 461
        e=f;
478 462
      }
479
      for(InArcIt e(*this,b);e!=INVALID;) {
463
      for(InArcIt e(*this,v);e!=INVALID;) {
480 464
        InArcIt f=e;
481 465
        ++f;
482
        if(r && source(e)==a) erase(e);
483
        else changeTarget(e,a);
466
        if(r && source(e)==u) erase(e);
467
        else changeTarget(e,u);
484 468
        e=f;
485 469
      }
486
      erase(b);
470
      erase(v);
487 471
    }
... ...
@@ -490,13 +474,13 @@
490 474

	
491
    ///This function splits a node. First a new node is added to the digraph,
492
    ///then the source of each outgoing arc of \c n is moved to this new node.
493
    ///If \c connect is \c true (this is the default value), then a new arc
494
    ///from \c n to the newly created node is also added.
475
    ///This function splits the given node. First, a new node is added
476
    ///to the digraph, then the source of each outgoing arc of node \c n
477
    ///is moved to this new node.
478
    ///If the second parameter \c connect is \c true (this is the default
479
    ///value), then a new arc from node \c n to the newly created node
480
    ///is also added.
495 481
    ///\return The newly created node.
496 482
    ///
497
    ///\note The <tt>ArcIt</tt>s referencing a moved arc remain
498
    ///valid. However <tt>InArcIt</tt>s and <tt>OutArcIt</tt>s may
499
    ///be invalidated.
483
    ///\note All iterators remain valid.
500 484
    ///
501
    ///\warning This functionality cannot be used in conjunction with the
485
    ///\warning This functionality cannot be used together with the
502 486
    ///Snapshot feature.
... ...
@@ -504,7 +488,6 @@
504 488
      Node b = addNode();
505
      for(OutArcIt e(*this,n);e!=INVALID;) {
506
        OutArcIt f=e;
507
        ++f;
508
        changeSource(e,b);
509
        e=f;
489
      nodes[b.id].first_out=nodes[n.id].first_out;
490
      nodes[n.id].first_out=-1;
491
      for(int i=nodes[b.id].first_out; i!=-1; i=arcs[i].next_out) {
492
        arcs[i].source=b.id;
510 493
      }
... ...
@@ -516,7 +499,10 @@
516 499

	
517
    ///This function splits an arc. First a new node \c b is added to
518
    ///the digraph, then the original arc is re-targeted to \c
519
    ///b. Finally an arc from \c b to the original target is added.
500
    ///This function splits the given arc. First, a new node \c v is
501
    ///added to the digraph, then the target node of the original arc
502
    ///is set to \c v. Finally, an arc from \c v to the original target
503
    ///is added.
504
    ///\return The newly created node.
520 505
    ///
521
    ///\return The newly created node.
506
    ///\note \c InArcIt iterators referencing the original arc are
507
    ///invalidated. Other iterators remain valid.
522 508
    ///
... ...
@@ -524,9 +510,38 @@
524 510
    ///Snapshot feature.
525
    Node split(Arc e) {
526
      Node b = addNode();
527
      addArc(b,target(e));
528
      changeTarget(e,b);
529
      return b;
511
    Node split(Arc a) {
512
      Node v = addNode();
513
      addArc(v,target(a));
514
      changeTarget(a,v);
515
      return v;
530 516
    }
531 517

	
518
    ///Clear the digraph.
519

	
520
    ///This function erases all nodes and arcs from the digraph.
521
    ///
522
    ///\note All iterators of the digraph are invalidated, of course.
523
    void clear() {
524
      Parent::clear();
525
    }
526

	
527
    /// Reserve memory for nodes.
528

	
529
    /// Using this function, it is possible to avoid superfluous memory
530
    /// allocation: if you know that the digraph you want to build will
531
    /// be large (e.g. it will contain millions of nodes and/or arcs),
532
    /// then it is worth reserving space for this amount before starting
533
    /// to build the digraph.
534
    /// \sa reserveArc()
535
    void reserveNode(int n) { nodes.reserve(n); };
536

	
537
    /// Reserve memory for arcs.
538

	
539
    /// Using this function, it is possible to avoid superfluous memory
540
    /// allocation: if you know that the digraph you want to build will
541
    /// be large (e.g. it will contain millions of nodes and/or arcs),
542
    /// then it is worth reserving space for this amount before starting
543
    /// to build the digraph.
544
    /// \sa reserveNode()
545
    void reserveArc(int m) { arcs.reserve(m); };
546

	
532 547
    /// \brief Class to make a snapshot of the digraph and restore
... ...
@@ -539,5 +554,11 @@
539 554
    ///
540
    /// \warning Arc and node deletions and other modifications (e.g.
541
    /// contracting, splitting, reversing arcs or nodes) cannot be
555
    /// \note After a state is restored, you cannot restore a later state,
556
    /// i.e. you cannot add the removed nodes and arcs again using
557
    /// another Snapshot instance.
558
    ///
559
    /// \warning Node and arc deletions and other modifications (e.g.
560
    /// reversing, contracting, splitting arcs or nodes) cannot be
542 561
    /// restored. These events invalidate the snapshot.
562
    /// However, the arcs and nodes that were added to the digraph after
563
    /// making the current snapshot can be removed without invalidating it.
543 564
    class Snapshot {
... ...
@@ -711,3 +732,3 @@
711 732
      /// Default constructor.
712
      /// To actually make a snapshot you must call save().
733
      /// You have to call save() to actually make a snapshot.
713 734
      Snapshot()
... ...
@@ -718,8 +739,7 @@
718 739
      ///
719
      /// This constructor immediately makes a snapshot of the digraph.
720
      /// \param _digraph The digraph we make a snapshot of.
721
      Snapshot(ListDigraph &_digraph)
740
      /// This constructor immediately makes a snapshot of the given digraph.
741
      Snapshot(ListDigraph &gr)
722 742
        : node_observer_proxy(*this),
723 743
          arc_observer_proxy(*this) {
724
        attach(_digraph);
744
        attach(gr);
725 745
      }
... ...
@@ -728,8 +748,6 @@
728 748
      ///
729
      /// Make a snapshot of the digraph.
730
      ///
731
      /// This function can be called more than once. In case of a repeated
749
      /// This function makes a snapshot of the given digraph.
750
      /// It can be called more than once. In case of a repeated
732 751
      /// call, the previous snapshot gets lost.
733
      /// \param _digraph The digraph we make the snapshot of.
734
      void save(ListDigraph &_digraph) {
752
      void save(ListDigraph &gr) {
735 753
        if (attached()) {
... ...
@@ -738,3 +756,3 @@
738 756
        }
739
        attach(_digraph);
757
        attach(gr);
740 758
      }
... ...
@@ -742,4 +760,8 @@
742 760
      /// \brief Undo the changes until the last snapshot.
743
      //
744
      /// Undo the changes until the last snapshot created by save().
761
      ///
762
      /// This function undos the changes until the last snapshot
763
      /// created by save() or Snapshot(ListDigraph&).
764
      ///
765
      /// \warning This method invalidates the snapshot, i.e. repeated
766
      /// restoring is not supported unless you call save() again.
745 767
      void restore() {
... ...
@@ -757,5 +779,5 @@
757 779

	
758
      /// \brief Gives back true when the snapshot is valid.
780
      /// \brief Returns \c true if the snapshot is valid.
759 781
      ///
760
      /// Gives back true when the snapshot is valid.
782
      /// This function returns \c true if the snapshot is valid.
761 783
      bool valid() const {
... ...
@@ -797,6 +819,2 @@
797 819

	
798
    class Node;
799
    class Arc;
800
    class Edge;
801

	
802 820
    class Node {
... ...
@@ -850,4 +868,2 @@
850 868

	
851

	
852

	
853 869
    ListGraphBase()
... ...
@@ -1166,13 +1182,15 @@
1166 1182

	
1167
  ///\ref ListGraph is a simple and fast <em>undirected graph</em>
1168
  ///implementation based on static linked lists that are stored in
1183
  ///\ref ListGraph is a versatile and fast undirected graph
1184
  ///implementation based on linked lists that are stored in
1169 1185
  ///\c std::vector structures.
1170 1186
  ///
1171
  ///It conforms to the \ref concepts::Graph "Graph concept" and it
1172
  ///also provides several useful additional functionalities.
1173
  ///Most of the member functions and nested classes are documented
1187
  ///This type fully conforms to the \ref concepts::Graph "Graph concept"
1188
  ///and it also provides several useful additional functionalities.
1189
  ///Most of its member functions and nested classes are documented
1174 1190
  ///only in the concept class.
1175 1191
  ///
1192
  ///This class provides only linear time counting for nodes, edges and arcs.
1193
  ///
1176 1194
  ///\sa concepts::Graph
1177

	
1195
  ///\sa ListDigraph
1178 1196
  class ListGraph : public ExtendedListGraphBase {
... ...
@@ -1181,12 +1199,6 @@
1181 1199
  private:
1182
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1183

	
1184
    ///ListGraph is \e not copy constructible. Use copyGraph() instead.
1185
    ///
1200
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
1186 1201
    ListGraph(const ListGraph &) :ExtendedListGraphBase()  {};
1187
    ///\brief Assignment of ListGraph to another one is \e not allowed.
1188
    ///Use copyGraph() instead.
1189

	
1190
    ///Assignment of ListGraph to another one is \e not allowed.
1191
    ///Use copyGraph() instead.
1202
    /// \brief Assignment of a graph to another one is \e not allowed.
1203
    /// Use GraphCopy instead.
1192 1204
    void operator=(const ListGraph &) {}
... ...
@@ -1203,3 +1215,3 @@
1203 1215
    ///
1204
    /// Add a new node to the graph.
1216
    /// This function adds a new node to the graph.
1205 1217
    /// \return The new node.
... ...
@@ -1209,55 +1221,58 @@
1209 1221
    ///
1210
    /// Add a new edge to the graph with source node \c s
1211
    /// and target node \c t.
1222
    /// This function adds a new edge to the graph between nodes
1223
    /// \c u and \c v with inherent orientation from node \c u to
1224
    /// node \c v.
1212 1225
    /// \return The new edge.
1213
    Edge addEdge(const Node& s, const Node& t) {
1214
      return Parent::addEdge(s, t);
1226
    Edge addEdge(Node u, Node v) {
1227
      return Parent::addEdge(u, v);
1215 1228
    }
1216 1229

	
1217
    /// \brief Erase a node from the graph.
1230
    ///\brief Erase a node from the graph.
1218 1231
    ///
1219
    /// Erase a node from the graph.
1232
    /// This function erases the given node along with its incident arcs
1233
    /// from the graph.
1220 1234
    ///
1221
    void erase(const Node& n) { Parent::erase(n); }
1235
    /// \note All iterators referencing the removed node or the incident
1236
    /// edges are invalidated, of course.
1237
    void erase(Node n) { Parent::erase(n); }
1222 1238

	
1223
    /// \brief Erase an edge from the graph.
1239
    ///\brief Erase an edge from the graph.
1224 1240
    ///
1225
    /// Erase an edge from the graph.
1241
    /// This function erases the given edge from the graph.
1226 1242
    ///
1227
    void erase(const Edge& e) { Parent::erase(e); }
1243
    /// \note All iterators referencing the removed edge are invalidated,
1244
    /// of course.
1245
    void erase(Edge e) { Parent::erase(e); }
1228 1246
    /// Node validity check
1229 1247

	
1230
    /// This function gives back true if the given node is valid,
1231
    /// ie. it is a real node of the graph.
1248
    /// This function gives back \c true if the given node is valid,
1249
    /// i.e. it is a real node of the graph.
1232 1250
    ///
1233
    /// \warning A Node pointing to a removed item
1234
    /// could become valid again later if new nodes are
1251
    /// \warning A removed node could become valid again if new nodes are
1235 1252
    /// added to the graph.
1236 1253
    bool valid(Node n) const { return Parent::valid(n); }
1254
    /// Edge validity check
1255

	
1256
    /// This function gives back \c true if the given edge is valid,
1257
    /// i.e. it is a real edge of the graph.
1258
    ///
1259
    /// \warning A removed edge could become valid again if new edges are
1260
    /// added to the graph.
1261
    bool valid(Edge e) const { return Parent::valid(e); }
1237 1262
    /// Arc validity check
1238 1263

	
1239
    /// This function gives back true if the given arc is valid,
1240
    /// ie. it is a real arc of the graph.
1264
    /// This function gives back \c true if the given arc is valid,
1265
    /// i.e. it is a real arc of the graph.
1241 1266
    ///
1242
    /// \warning An Arc pointing to a removed item
1243
    /// could become valid again later if new edges are
1267
    /// \warning A removed arc could become valid again if new edges are
1244 1268
    /// added to the graph.
1245 1269
    bool valid(Arc a) const { return Parent::valid(a); }
1246
    /// Edge validity check
1247 1270

	
1248
    /// This function gives back true if the given edge is valid,
1249
    /// ie. it is a real arc of the graph.
1271
    /// \brief Change the first node of an edge.
1250 1272
    ///
1251
    /// \warning A Edge pointing to a removed item
1252
    /// could become valid again later if new edges are
1253
    /// added to the graph.
1254
    bool valid(Edge e) const { return Parent::valid(e); }
1255
    /// \brief Change the end \c u of \c e to \c n
1273
    /// This function changes the first node of the given edge \c e to \c n.
1256 1274
    ///
1257
    /// This function changes the end \c u of \c e to node \c n.
1258
    ///
1259
    ///\note The <tt>EdgeIt</tt>s and <tt>ArcIt</tt>s referencing the
1260
    ///changed edge are invalidated and if the changed node is the
1261
    ///base node of an iterator then this iterator is also
1262
    ///invalidated.
1275
    ///\note \c EdgeIt and \c ArcIt iterators referencing the
1276
    ///changed edge are invalidated and all other iterators whose
1277
    ///base node is the changed node are also invalidated.
1263 1278
    ///
... ...
@@ -1268,9 +1283,10 @@
1268 1283
    }
1269
    /// \brief Change the end \c v of \c e to \c n
1284
    /// \brief Change the second node of an edge.
1270 1285
    ///
1271
    /// This function changes the end \c v of \c e to \c n.
1286
    /// This function changes the second node of the given edge \c e to \c n.
1272 1287
    ///
1273
    ///\note The <tt>EdgeIt</tt>s referencing the changed edge remain
1274
    ///valid, however <tt>ArcIt</tt>s and if the changed node is the
1275
    ///base node of an iterator then this iterator is invalidated.
1288
    ///\note \c EdgeIt iterators referencing the changed edge remain
1289
    ///valid, but \c ArcIt iterators referencing the changed edge and
1290
    ///all other iterators whose base node is the changed node are also
1291
    ///invalidated.
1276 1292
    ///
... ...
@@ -1281,12 +1297,16 @@
1281 1297
    }
1298

	
1282 1299
    /// \brief Contract two nodes.
1283 1300
    ///
1284
    /// This function contracts two nodes.
1285
    /// Node \p b will be removed but instead of deleting
1286
    /// its neighboring arcs, they will be joined to \p a.
1287
    /// The last parameter \p r controls whether to remove loops. \c true
1288
    /// means that loops will be removed.
1301
    /// This function contracts the given two nodes.
1302
    /// Node \c b is removed, but instead of deleting
1303
    /// its incident edges, they are joined to node \c a.
1304
    /// If the last parameter \c r is \c true (this is the default value),
1305
    /// then the newly created loops are removed.
1289 1306
    ///
1290
    /// \note The <tt>ArcIt</tt>s referencing a moved arc remain
1291
    /// valid.
1307
    /// \note The moved edges are joined to node \c a using changeU()
1308
    /// or changeV(), thus all edge and arc iterators whose base node is
1309
    /// \c b are invalidated.
1310
    /// Moreover all iterators referencing node \c b or the removed
1311
    /// loops are also invalidated. Other iterators remain valid.
1292 1312
    ///
... ...
@@ -1309,2 +1329,30 @@
1309 1329

	
1330
    ///Clear the graph.
1331

	
1332
    ///This function erases all nodes and arcs from the graph.
1333
    ///
1334
    ///\note All iterators of the graph are invalidated, of course.
1335
    void clear() {
1336
      Parent::clear();
1337
    }
1338

	
1339
    /// Reserve memory for nodes.
1340

	
1341
    /// Using this function, it is possible to avoid superfluous memory
1342
    /// allocation: if you know that the graph you want to build will
1343
    /// be large (e.g. it will contain millions of nodes and/or edges),
1344
    /// then it is worth reserving space for this amount before starting
1345
    /// to build the graph.
1346
    /// \sa reserveEdge()
1347
    void reserveNode(int n) { nodes.reserve(n); };
1348

	
1349
    /// Reserve memory for edges.
1350

	
1351
    /// Using this function, it is possible to avoid superfluous memory
1352
    /// allocation: if you know that the graph you want to build will
1353
    /// be large (e.g. it will contain millions of nodes and/or edges),
1354
    /// then it is worth reserving space for this amount before starting
1355
    /// to build the graph.
1356
    /// \sa reserveNode()
1357
    void reserveEdge(int m) { arcs.reserve(2 * m); };
1310 1358

	
... ...
@@ -1318,5 +1366,11 @@
1318 1366
    ///
1319
    /// \warning Edge and node deletions and other modifications
1320
    /// (e.g. changing nodes of edges, contracting nodes) cannot be
1321
    /// restored. These events invalidate the snapshot.
1367
    /// \note After a state is restored, you cannot restore a later state,
1368
    /// i.e. you cannot add the removed nodes and edges again using
1369
    /// another Snapshot instance.
1370
    ///
1371
    /// \warning Node and edge deletions and other modifications
1372
    /// (e.g. changing the end-nodes of edges or contracting nodes)
1373
    /// cannot be restored. These events invalidate the snapshot.
1374
    /// However, the edges and nodes that were added to the graph after
1375
    /// making the current snapshot can be removed without invalidating it.
1322 1376
    class Snapshot {
... ...
@@ -1490,3 +1544,3 @@
1490 1544
      /// Default constructor.
1491
      /// To actually make a snapshot you must call save().
1545
      /// You have to call save() to actually make a snapshot.
1492 1546
      Snapshot()
... ...
@@ -1497,8 +1551,7 @@
1497 1551
      ///
1498
      /// This constructor immediately makes a snapshot of the graph.
1499
      /// \param _graph The graph we make a snapshot of.
1500
      Snapshot(ListGraph &_graph)
1552
      /// This constructor immediately makes a snapshot of the given graph.
1553
      Snapshot(ListGraph &gr)
1501 1554
        : node_observer_proxy(*this),
1502 1555
          edge_observer_proxy(*this) {
1503
        attach(_graph);
1556
        attach(gr);
1504 1557
      }
... ...
@@ -1507,8 +1560,6 @@
1507 1560
      ///
1508
      /// Make a snapshot of the graph.
1509
      ///
1510
      /// This function can be called more than once. In case of a repeated
1561
      /// This function makes a snapshot of the given graph.
1562
      /// It can be called more than once. In case of a repeated
1511 1563
      /// call, the previous snapshot gets lost.
1512
      /// \param _graph The graph we make the snapshot of.
1513
      void save(ListGraph &_graph) {
1564
      void save(ListGraph &gr) {
1514 1565
        if (attached()) {
... ...
@@ -1517,3 +1568,3 @@
1517 1568
        }
1518
        attach(_graph);
1569
        attach(gr);
1519 1570
      }
... ...
@@ -1521,4 +1572,8 @@
1521 1572
      /// \brief Undo the changes until the last snapshot.
1522
      //
1523
      /// Undo the changes until the last snapshot created by save().
1573
      ///
1574
      /// This function undos the changes until the last snapshot
1575
      /// created by save() or Snapshot(ListGraph&).
1576
      ///
1577
      /// \warning This method invalidates the snapshot, i.e. repeated
1578
      /// restoring is not supported unless you call save() again.
1524 1579
      void restore() {
... ...
@@ -1536,5 +1591,5 @@
1536 1591

	
1537
      /// \brief Gives back true when the snapshot is valid.
1592
      /// \brief Returns \c true if the snapshot is valid.
1538 1593
      ///
1539
      /// Gives back true when the snapshot is valid.
1594
      /// This function returns \c true if the snapshot is valid.
1540 1595
      bool valid() const {
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -86,3 +86,3 @@
86 86
# define DEFAULT_LP CLP
87
  typedef ClpLp Lp;  
87
  typedef ClpLp Lp;
88 88
#endif
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
Show white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -84,3 +84,3 @@
84 84
    };
85
    
85

	
86 86

	
... ...
@@ -116,3 +116,3 @@
116 116
      /// Default constructor
117
      
117

	
118 118
      /// \warning The default constructor sets the Col to an
... ...
@@ -121,5 +121,5 @@
121 121
      /// Invalid constructor \& conversion.
122
      
122

	
123 123
      /// This constructor initializes the Col to be invalid.
124
      /// \sa Invalid for more details.      
124
      /// \sa Invalid for more details.
125 125
      Col(const Invalid&) : _id(-1) {}
... ...
@@ -148,3 +148,3 @@
148 148

	
149
    /// Its usage is quite simple, for example you can count the number
149
    /// Its usage is quite simple, for example, you can count the number
150 150
    /// of columns in an LP \c lp:
... ...
@@ -158,3 +158,3 @@
158 158
      /// Default constructor
159
      
159

	
160 160
      /// \warning The default constructor sets the iterator
... ...
@@ -163,3 +163,3 @@
163 163
      /// Sets the iterator to the first Col
164
      
164

	
165 165
      /// Sets the iterator to the first Col.
... ...
@@ -171,3 +171,3 @@
171 171
      /// Invalid constructor \& conversion
172
      
172

	
173 173
      /// Initialize the iterator to be invalid.
... ...
@@ -176,3 +176,3 @@
176 176
      /// Next column
177
      
177

	
178 178
      /// Assign the iterator to the next column.
... ...
@@ -211,3 +211,3 @@
211 211
      /// Default constructor
212
      
212

	
213 213
      /// \warning The default constructor sets the Row to an
... ...
@@ -216,5 +216,5 @@
216 216
      /// Invalid constructor \& conversion.
217
      
217

	
218 218
      /// This constructor initializes the Row to be invalid.
219
      /// \sa Invalid for more details.      
219
      /// \sa Invalid for more details.
220 220
      Row(const Invalid&) : _id(-1) {}
... ...
@@ -226,3 +226,3 @@
226 226
      /// Inequality operator
227
      
227

	
228 228
      /// \sa operator==(Row r)
... ...
@@ -243,3 +243,3 @@
243 243

	
244
    /// Its usage is quite simple, for example you can count the number
244
    /// Its usage is quite simple, for example, you can count the number
245 245
    /// of rows in an LP \c lp:
... ...
@@ -253,3 +253,3 @@
253 253
      /// Default constructor
254
      
254

	
255 255
      /// \warning The default constructor sets the iterator
... ...
@@ -258,3 +258,3 @@
258 258
      /// Sets the iterator to the first Row
259
      
259

	
260 260
      /// Sets the iterator to the first Row.
... ...
@@ -266,3 +266,3 @@
266 266
      /// Invalid constructor \& conversion
267
      
267

	
268 268
      /// Initialize the iterator to be invalid.
... ...
@@ -271,3 +271,3 @@
271 271
      /// Next row
272
      
272

	
273 273
      /// Assign the iterator to the next row.
... ...
@@ -349,3 +349,3 @@
349 349
      /// Default constructor
350
      
350

	
351 351
      /// Construct an empty expression, the coefficients and
... ...
@@ -450,5 +450,5 @@
450 450
      ///Iterator over the expression
451
      
452
      ///The iterator iterates over the terms of the expression. 
453
      /// 
451

	
452
      ///The iterator iterates over the terms of the expression.
453
      ///
454 454
      ///\code
... ...
@@ -466,3 +466,3 @@
466 466
        /// Sets the iterator to the first term
467
        
467

	
468 468
        /// Sets the iterator to the first term of the expression.
... ...
@@ -483,3 +483,3 @@
483 483
        /// Next term
484
        
484

	
485 485
        /// Assign the iterator to the next term.
... ...
@@ -495,5 +495,5 @@
495 495
      /// Const iterator over the expression
496
      
497
      ///The iterator iterates over the terms of the expression. 
498
      /// 
496

	
497
      ///The iterator iterates over the terms of the expression.
498
      ///
499 499
      ///\code
... ...
@@ -511,3 +511,3 @@
511 511
        /// Sets the iterator to the first term
512
        
512

	
513 513
        /// Sets the iterator to the first term of the expression.
... ...
@@ -526,3 +526,3 @@
526 526
        /// Next term
527
        
527

	
528 528
        /// Assign the iterator to the next term.
... ...
@@ -675,3 +675,3 @@
675 675
      /// Default constructor
676
      
676

	
677 677
      /// Construct an empty expression, the coefficients are
... ...
@@ -710,3 +710,3 @@
710 710
      /// \brief Removes the coefficients which's absolute value does
711
      /// not exceed \c epsilon. 
711
      /// not exceed \c epsilon.
712 712
      void simplify(Value epsilon = 0.0) {
... ...
@@ -759,5 +759,5 @@
759 759
      ///Iterator over the expression
760
      
761
      ///The iterator iterates over the terms of the expression. 
762
      /// 
760

	
761
      ///The iterator iterates over the terms of the expression.
762
      ///
763 763
      ///\code
... ...
@@ -775,3 +775,3 @@
775 775
        /// Sets the iterator to the first term
776
        
776

	
777 777
        /// Sets the iterator to the first term of the expression.
... ...
@@ -793,3 +793,3 @@
793 793
        /// Next term
794
        
794

	
795 795
        /// Assign the iterator to the next term.
... ...
@@ -805,5 +805,5 @@
805 805
      ///Iterator over the expression
806
      
807
      ///The iterator iterates over the terms of the expression. 
808
      /// 
806

	
807
      ///The iterator iterates over the terms of the expression.
808
      ///
809 809
      ///\code
... ...
@@ -821,3 +821,3 @@
821 821
        /// Sets the iterator to the first term
822
        
822

	
823 823
        /// Sets the iterator to the first term of the expression.
... ...
@@ -836,3 +836,3 @@
836 836
        /// Next term
837
        
837

	
838 838
        /// Assign the iterator to the next term.
... ...
@@ -945,2 +945,10 @@
945 945

	
946
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
947
      int row = _addRow();
948
      _setRowCoeffs(row, b, e);
949
      _setRowLowerBound(row, l);
950
      _setRowUpperBound(row, u);
951
      return row;
952
    }
953

	
946 954
    virtual void _eraseCol(int col) = 0;
... ...
@@ -1209,4 +1217,6 @@
1209 1217
    Row addRow(Value l,const Expr &e, Value u) {
1210
      Row r=addRow();
1211
      row(r,l,e,u);
1218
      Row r;
1219
      e.simplify();
1220
      r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols),
1221
                                ExprIterator(e.comps.end(), cols), u - *e));
1212 1222
      return r;
... ...
@@ -1219,4 +1229,8 @@
1219 1229
    Row addRow(const Constr &c) {
1220
      Row r=addRow();
1221
      row(r,c);
1230
      Row r;
1231
      c.expr().simplify();
1232
      r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound()-*c.expr():-INF,
1233
                                ExprIterator(c.expr().comps.begin(), cols),
1234
                                ExprIterator(c.expr().comps.end(), cols),
1235
                                c.upperBounded()?c.upperBound()-*c.expr():INF));
1222 1236
      return r;
... ...
@@ -1805,6 +1819,6 @@
1805 1819
      /// The variable is in the basis
1806
      BASIC, 
1820
      BASIC,
1807 1821
      /// The variable is free, but not basic
1808 1822
      FREE,
1809
      /// The variable has active lower bound 
1823
      /// The variable has active lower bound
1810 1824
      LOWER,
... ...
@@ -1887,3 +1901,3 @@
1887 1901
    /// Returns a component of the primal ray
1888
    
1902

	
1889 1903
    /// The primal ray is solution of the modified primal problem,
... ...
@@ -1921,3 +1935,3 @@
1921 1935
    /// Returns a component of the dual ray
1922
    
1936

	
1923 1937
    /// The dual ray is solution of the modified primal problem, where
... ...
@@ -2063,3 +2077,3 @@
2063 2077
    ///The value of the objective function
2064
    
2078

	
2065 2079
    ///\return
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -34,2 +34,7 @@
34 34

	
35
  int SkeletonSolverBase::_addRow(Value, ExprIterator, ExprIterator, Value)
36
  {
37
    return ++row_num;
38
  }
39

	
35 40
  void SkeletonSolverBase::_eraseCol(int) {}
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -25,3 +25,3 @@
25 25
///\brief Skeleton file to implement LP/MIP solver interfaces
26
///  
26
///
27 27
///The classes in this file do nothing, but they can serve as skeletons when
... ...
@@ -31,3 +31,3 @@
31 31
  ///A skeleton class to implement LP/MIP solver base interface
32
  
32

	
33 33
  ///This class does nothing, but it can serve as a skeleton when
... ...
@@ -47,2 +47,4 @@
47 47
    /// \e
48
    virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u);
49
    /// \e
48 50
    virtual void _eraseCol(int i);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -24,2 +24,3 @@
24 24
#include <vector>
25
#include <map>
25 26

	
... ...
@@ -31,4 +32,2 @@
31 32

	
32
#include <map>
33

	
34 33
namespace lemon {
... ...
@@ -59,3 +58,3 @@
59 58
  /// <tt>/dev/null</tt>).
60
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
59
  /// It conforms to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
61 60
  ///
... ...
@@ -92,3 +91,3 @@
92 91
  /// In other aspects it is equivalent to \c NullMap.
93
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
92
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
94 93
  /// concept, but it absorbs the data written to it.
... ...
@@ -161,3 +160,3 @@
161 160
  /// In other aspects it is equivalent to \c NullMap.
162
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
161
  /// So it conforms to the \ref concepts::ReadWriteMap "ReadWriteMap"
163 162
  /// concept, but it absorbs the data written to it.
... ...
@@ -233,5 +232,5 @@
233 232
  /// values to integer keys from the range <tt>[0..size-1]</tt>.
234
  /// It can be used with some data structures, for example
235
  /// \c UnionFind, \c BinHeap, when the used items are small
236
  /// integers. This map conforms the \ref concepts::ReferenceMap
233
  /// It can be used together with some data structures, e.g.
234
  /// heap types and \c UnionFind, when the used items are small
235
  /// integers. This map conforms to the \ref concepts::ReferenceMap
237 236
  /// "ReferenceMap" concept.
... ...
@@ -343,3 +342,3 @@
343 342
  /// contructed value (i.e. \c %Value()).
344
  /// This type conforms the \ref concepts::ReferenceMap "ReferenceMap"
343
  /// This type conforms to the \ref concepts::ReferenceMap "ReferenceMap"
345 344
  /// concept.
... ...
@@ -351,5 +350,5 @@
351 350
  ///
352
  /// Apart form that this map can be used in many other cases since it
351
  /// Apart form that, this map can be used in many other cases since it
353 352
  /// is based on \c std::map, which is a general associative container.
354
  /// However keep in mind that it is usually not as efficient as other
353
  /// However, keep in mind that it is usually not as efficient as other
355 354
  /// maps.
... ...
@@ -709,3 +708,3 @@
709 708
  /// type is \c V.
710
  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
709
  /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
711 710
  ///
... ...
@@ -1788,3 +1787,3 @@
1788 1787
  /// that were marked \c true by an algorithm.
1789
  /// For example it makes easier to store the nodes in the processing
1788
  /// For example, it makes easier to store the nodes in the processing
1790 1789
  /// order of Dfs algorithm, as the following examples show.
... ...
@@ -1792,3 +1791,3 @@
1792 1791
  ///   std::vector<Node> v;
1793
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1792
  ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1794 1793
  /// \endcode
... ...
@@ -1796,3 +1795,3 @@
1796 1795
  ///   std::vector<Node> v(countNodes(g));
1797
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1796
  ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1798 1797
  /// \endcode
... ...
@@ -1803,3 +1802,3 @@
1803 1802
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1804
  /// it cannot be used when a readable map is needed, for example as
1803
  /// it cannot be used when a readable map is needed, for example, as
1805 1804
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
... ...
@@ -1820,3 +1819,3 @@
1820 1819
  /// IdMap provides a unique and immutable id for each item of the
1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1820
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is
1822 1821
  ///  - \b unique: different items get different ids,
... ...
@@ -1828,3 +1827,3 @@
1828 1827
  /// function of the graph. This map can be inverted with its member
1829
  /// class \c InverseMap or with the \c operator() member.
1828
  /// class \c InverseMap or with the \c operator()() member.
1830 1829
  ///
... ...
@@ -1868,5 +1867,7 @@
1868 1867

	
1869
    /// \brief This class represents the inverse of its owner (IdMap).
1868
    /// \brief The inverse map type of IdMap.
1870 1869
    ///
1871
    /// This class represents the inverse of its owner (IdMap).
1870
    /// The inverse map type of IdMap. The subscript operator gives back
1871
    /// an item by its id.
1872
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
1872 1873
    /// \see inverse()
... ...
@@ -1885,5 +1886,5 @@
1885 1886

	
1886
      /// \brief Gives back the given item from its id.
1887
      /// \brief Gives back an item by its id.
1887 1888
      ///
1888
      /// Gives back the given item from its id.
1889
      /// Gives back an item by its id.
1889 1890
      Item operator[](int id) const { return _graph->fromId(id, Item());}
... ...
@@ -1900,2 +1901,10 @@
1900 1901

	
1902
  /// \brief Returns an \c IdMap class.
1903
  ///
1904
  /// This function just returns an \c IdMap class.
1905
  /// \relates IdMap
1906
  template <typename K, typename GR>
1907
  inline IdMap<GR, K> idMap(const GR& graph) {
1908
    return IdMap<GR, K>(graph);
1909
  }
1901 1910

	
... ...
@@ -1906,4 +1915,13 @@
1906 1915
  /// and if a key is set to a new value, then stores it in the inverse map.
1907
  /// The values of the map can be accessed
1908
  /// with stl compatible forward iterator.
1916
  /// The graph items can be accessed by their values either using
1917
  /// \c InverseMap or \c operator()(), and the values of the map can be
1918
  /// accessed with an STL compatible forward iterator (\c ValueIt).
1919
  ///
1920
  /// This map is intended to be used when all associated values are
1921
  /// different (the map is actually invertable) or there are only a few
1922
  /// items with the same value.
1923
  /// Otherwise consider to use \c IterableValueMap, which is more
1924
  /// suitable and more efficient for such cases. It provides iterators
1925
  /// to traverse the items with the same associated value, but
1926
  /// it does not have \c InverseMap.
1909 1927
  ///
... ...
@@ -1948,3 +1966,3 @@
1948 1966
    ///
1949
    /// This iterator is an stl compatible forward
1967
    /// This iterator is an STL compatible forward
1950 1968
    /// iterator on the values of the map. The values can
... ...
@@ -1953,3 +1971,3 @@
1953 1971
    /// traversed for each item it is assigned to.
1954
    class ValueIterator
1972
    class ValueIt
1955 1973
      : public std::iterator<std::forward_iterator_tag, Value> {
... ...
@@ -1957,3 +1975,3 @@
1957 1975
    private:
1958
      ValueIterator(typename Container::const_iterator _it)
1976
      ValueIt(typename Container::const_iterator _it)
1959 1977
        : it(_it) {}
... ...
@@ -1961,7 +1979,10 @@
1961 1979

	
1962
      ValueIterator() {}
1963

	
1964
      ValueIterator& operator++() { ++it; return *this; }
1965
      ValueIterator operator++(int) {
1966
        ValueIterator tmp(*this);
1980
      /// Constructor
1981
      ValueIt() {}
1982

	
1983
      /// \e
1984
      ValueIt& operator++() { ++it; return *this; }
1985
      /// \e
1986
      ValueIt operator++(int) {
1987
        ValueIt tmp(*this);
1967 1988
        operator++();
... ...
@@ -1970,7 +1991,11 @@
1970 1991

	
1992
      /// \e
1971 1993
      const Value& operator*() const { return it->first; }
1994
      /// \e
1972 1995
      const Value* operator->() const { return &(it->first); }
1973 1996

	
1974
      bool operator==(ValueIterator jt) const { return it == jt.it; }
1975
      bool operator!=(ValueIterator jt) const { return it != jt.it; }
1997
      /// \e
1998
      bool operator==(ValueIt jt) const { return it == jt.it; }
1999
      /// \e
2000
      bool operator!=(ValueIt jt) const { return it != jt.it; }
1976 2001

	
... ...
@@ -1980,5 +2005,8 @@
1980 2005

	
2006
    /// Alias for \c ValueIt
2007
    typedef ValueIt ValueIterator;
2008

	
1981 2009
    /// \brief Returns an iterator to the first value.
1982 2010
    ///
1983
    /// Returns an stl compatible iterator to the
2011
    /// Returns an STL compatible iterator to the
1984 2012
    /// first value of the map. The values of the
... ...
@@ -1986,4 +2014,4 @@
1986 2014
    /// range.
1987
    ValueIterator beginValue() const {
1988
      return ValueIterator(_inv_map.begin());
2015
    ValueIt beginValue() const {
2016
      return ValueIt(_inv_map.begin());
1989 2017
    }
... ...
@@ -1992,3 +2020,3 @@
1992 2020
    ///
1993
    /// Returns an stl compatible iterator after the
2021
    /// Returns an STL compatible iterator after the
1994 2022
    /// last value of the map. The values of the
... ...
@@ -1996,4 +2024,4 @@
1996 2024
    /// range.
1997
    ValueIterator endValue() const {
1998
      return ValueIterator(_inv_map.end());
2025
    ValueIt endValue() const {
2026
      return ValueIt(_inv_map.end());
1999 2027
    }
... ...
@@ -2036,2 +2064,10 @@
2036 2064

	
2065
    /// \brief Returns the number of items with the given value.
2066
    ///
2067
    /// This function returns the number of items with the given value
2068
    /// associated with it.
2069
    int count(const Value &val) const {
2070
      return _inv_map.count(val);
2071
    }
2072

	
2037 2073
  protected:
... ...
@@ -2085,6 +2121,8 @@
2085 2121

	
2086
    /// \brief The inverse map type.
2122
    /// \brief The inverse map type of CrossRefMap.
2087 2123
    ///
2088
    /// The inverse of this map. The subscript operator of the map
2089
    /// gives back the item that was last assigned to the value.
2124
    /// The inverse map type of CrossRefMap. The subscript operator gives
2125
    /// back an item by its value.
2126
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2127
    /// \see inverse()
2090 2128
    class InverseMap {
... ...
@@ -2115,5 +2153,5 @@
2115 2153

	
2116
    /// \brief It gives back the read-only inverse map.
2154
    /// \brief Gives back the inverse of the map.
2117 2155
    ///
2118
    /// It gives back the read-only inverse map.
2156
    /// Gives back the inverse of the CrossRefMap.
2119 2157
    InverseMap inverse() const {
... ...
@@ -2124,3 +2162,3 @@
2124 2162

	
2125
  /// \brief Provides continuous and unique ID for the
2163
  /// \brief Provides continuous and unique id for the
2126 2164
  /// items of a graph.
... ...
@@ -2128,3 +2166,3 @@
2128 2166
  /// RangeIdMap provides a unique and continuous
2129
  /// ID for each item of a given type (\c Node, \c Arc or
2167
  /// id for each item of a given type (\c Node, \c Arc or
2130 2168
  /// \c Edge) in a graph. This id is
... ...
@@ -2139,3 +2177,3 @@
2139 2177
  /// This map can be inverted with its member class \c InverseMap,
2140
  /// or with the \c operator() member.
2178
  /// or with the \c operator()() member.
2141 2179
  ///
... ...
@@ -2267,5 +2305,5 @@
2267 2305

	
2268
    /// \brief Gives back the \e RangeId of the item
2306
    /// \brief Gives back the \e range \e id of the item
2269 2307
    ///
2270
    /// Gives back the \e RangeId of the item.
2308
    /// Gives back the \e range \e id of the item.
2271 2309
    int operator[](const Item& item) const {
... ...
@@ -2274,5 +2312,5 @@
2274 2312

	
2275
    /// \brief Gives back the item belonging to a \e RangeId
2276
    /// 
2277
    /// Gives back the item belonging to a \e RangeId.
2313
    /// \brief Gives back the item belonging to a \e range \e id
2314
    ///
2315
    /// Gives back the item belonging to the given \e range \e id.
2278 2316
    Item operator()(int id) const {
... ...
@@ -2290,3 +2328,5 @@
2290 2328
    ///
2291
    /// The inverse map type of RangeIdMap.
2329
    /// The inverse map type of RangeIdMap. The subscript operator gives
2330
    /// back an item by its \e range \e id.
2331
    /// This type conforms to the \ref concepts::ReadMap "ReadMap" concept.
2292 2332
    class InverseMap {
... ...
@@ -2308,3 +2348,3 @@
2308 2348
      /// Subscript operator. It gives back the item
2309
      /// that the descriptor currently belongs to.
2349
      /// that the given \e range \e id currently belongs to.
2310 2350
      Value operator[](const Key& key) const {
... ...
@@ -2326,3 +2366,3 @@
2326 2366
    ///
2327
    /// Gives back the inverse of the map.
2367
    /// Gives back the inverse of the RangeIdMap.
2328 2368
    const InverseMap inverse() const {
... ...
@@ -2332,2 +2372,922 @@
2332 2372

	
2373
  /// \brief Returns a \c RangeIdMap class.
2374
  ///
2375
  /// This function just returns an \c RangeIdMap class.
2376
  /// \relates RangeIdMap
2377
  template <typename K, typename GR>
2378
  inline RangeIdMap<GR, K> rangeIdMap(const GR& graph) {
2379
    return RangeIdMap<GR, K>(graph);
2380
  }
2381

	
2382
  /// \brief Dynamic iterable \c bool map.
2383
  ///
2384
  /// This class provides a special graph map type which can store a
2385
  /// \c bool value for graph items (\c Node, \c Arc or \c Edge).
2386
  /// For both \c true and \c false values it is possible to iterate on
2387
  /// the keys mapped to the value.
2388
  ///
2389
  /// This type is a reference map, so it can be modified with the
2390
  /// subscript operator.
2391
  ///
2392
  /// \tparam GR The graph type.
2393
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2394
  /// \c GR::Edge).
2395
  ///
2396
  /// \see IterableIntMap, IterableValueMap
2397
  /// \see CrossRefMap
2398
  template <typename GR, typename K>
2399
  class IterableBoolMap
2400
    : protected ItemSetTraits<GR, K>::template Map<int>::Type {
2401
  private:
2402
    typedef GR Graph;
2403

	
2404
    typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt;
2405
    typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent;
2406

	
2407
    std::vector<K> _array;
2408
    int _sep;
2409

	
2410
  public:
2411

	
2412
    /// Indicates that the map is reference map.
2413
    typedef True ReferenceMapTag;
2414

	
2415
    /// The key type
2416
    typedef K Key;
2417
    /// The value type
2418
    typedef bool Value;
2419
    /// The const reference type.
2420
    typedef const Value& ConstReference;
2421

	
2422
  private:
2423

	
2424
    int position(const Key& key) const {
2425
      return Parent::operator[](key);
2426
    }
2427

	
2428
  public:
2429

	
2430
    /// \brief Reference to the value of the map.
2431
    ///
2432
    /// This class is similar to the \c bool type. It can be converted to
2433
    /// \c bool and it provides the same operators.
2434
    class Reference {
2435
      friend class IterableBoolMap;
2436
    private:
2437
      Reference(IterableBoolMap& map, const Key& key)
2438
        : _key(key), _map(map) {}
2439
    public:
2440

	
2441
      Reference& operator=(const Reference& value) {
2442
        _map.set(_key, static_cast<bool>(value));
2443
         return *this;
2444
      }
2445

	
2446
      operator bool() const {
2447
        return static_cast<const IterableBoolMap&>(_map)[_key];
2448
      }
2449

	
2450
      Reference& operator=(bool value) {
2451
        _map.set(_key, value);
2452
        return *this;
2453
      }
2454
      Reference& operator&=(bool value) {
2455
        _map.set(_key, _map[_key] & value);
2456
        return *this;
2457
      }
2458
      Reference& operator|=(bool value) {
2459
        _map.set(_key, _map[_key] | value);
2460
        return *this;
2461
      }
2462
      Reference& operator^=(bool value) {
2463
        _map.set(_key, _map[_key] ^ value);
2464
        return *this;
2465
      }
2466
    private:
2467
      Key _key;
2468
      IterableBoolMap& _map;
2469
    };
2470

	
2471
    /// \brief Constructor of the map with a default value.
2472
    ///
2473
    /// Constructor of the map with a default value.
2474
    explicit IterableBoolMap(const Graph& graph, bool def = false)
2475
      : Parent(graph) {
2476
      typename Parent::Notifier* nf = Parent::notifier();
2477
      Key it;
2478
      for (nf->first(it); it != INVALID; nf->next(it)) {
2479
        Parent::set(it, _array.size());
2480
        _array.push_back(it);
2481
      }
2482
      _sep = (def ? _array.size() : 0);
2483
    }
2484

	
2485
    /// \brief Const subscript operator of the map.
2486
    ///
2487
    /// Const subscript operator of the map.
2488
    bool operator[](const Key& key) const {
2489
      return position(key) < _sep;
2490
    }
2491

	
2492
    /// \brief Subscript operator of the map.
2493
    ///
2494
    /// Subscript operator of the map.
2495
    Reference operator[](const Key& key) {
2496
      return Reference(*this, key);
2497
    }
2498

	
2499
    /// \brief Set operation of the map.
2500
    ///
2501
    /// Set operation of the map.
2502
    void set(const Key& key, bool value) {
2503
      int pos = position(key);
2504
      if (value) {
2505
        if (pos < _sep) return;
2506
        Key tmp = _array[_sep];
2507
        _array[_sep] = key;
2508
        Parent::set(key, _sep);
2509
        _array[pos] = tmp;
2510
        Parent::set(tmp, pos);
2511
        ++_sep;
2512
      } else {
2513
        if (pos >= _sep) return;
2514
        --_sep;
2515
        Key tmp = _array[_sep];
2516
        _array[_sep] = key;
2517
        Parent::set(key, _sep);
2518
        _array[pos] = tmp;
2519
        Parent::set(tmp, pos);
2520
      }
2521
    }
2522

	
2523
    /// \brief Set all items.
2524
    ///
2525
    /// Set all items in the map.
2526
    /// \note Constant time operation.
2527
    void setAll(bool value) {
2528
      _sep = (value ? _array.size() : 0);
2529
    }
2530

	
2531
    /// \brief Returns the number of the keys mapped to \c true.
2532
    ///
2533
    /// Returns the number of the keys mapped to \c true.
2534
    int trueNum() const {
2535
      return _sep;
2536
    }
2537

	
2538
    /// \brief Returns the number of the keys mapped to \c false.
2539
    ///
2540
    /// Returns the number of the keys mapped to \c false.
2541
    int falseNum() const {
2542
      return _array.size() - _sep;
2543
    }
2544

	
2545
    /// \brief Iterator for the keys mapped to \c true.
2546
    ///
2547
    /// Iterator for the keys mapped to \c true. It works
2548
    /// like a graph item iterator, it can be converted to
2549
    /// the key type of the map, incremented with \c ++ operator, and
2550
    /// if the iterator leaves the last valid key, it will be equal to
2551
    /// \c INVALID.
2552
    class TrueIt : public Key {
2553
    public:
2554
      typedef Key Parent;
2555

	
2556
      /// \brief Creates an iterator.
2557
      ///
2558
      /// Creates an iterator. It iterates on the
2559
      /// keys mapped to \c true.
2560
      /// \param map The IterableBoolMap.
2561
      explicit TrueIt(const IterableBoolMap& map)
2562
        : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID),
2563
          _map(&map) {}
2564

	
2565
      /// \brief Invalid constructor \& conversion.
2566
      ///
2567
      /// This constructor initializes the iterator to be invalid.
2568
      /// \sa Invalid for more details.
2569
      TrueIt(Invalid) : Parent(INVALID), _map(0) {}
2570

	
2571
      /// \brief Increment operator.
2572
      ///
2573
      /// Increment operator.
2574
      TrueIt& operator++() {
2575
        int pos = _map->position(*this);
2576
        Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID);
2577
        return *this;
2578
      }
2579

	
2580
    private:
2581
      const IterableBoolMap* _map;
2582
    };
2583

	
2584
    /// \brief Iterator for the keys mapped to \c false.
2585
    ///
2586
    /// Iterator for the keys mapped to \c false. It works
2587
    /// like a graph item iterator, it can be converted to
2588
    /// the key type of the map, incremented with \c ++ operator, and
2589
    /// if the iterator leaves the last valid key, it will be equal to
2590
    /// \c INVALID.
2591
    class FalseIt : public Key {
2592
    public:
2593
      typedef Key Parent;
2594

	
2595
      /// \brief Creates an iterator.
2596
      ///
2597
      /// Creates an iterator. It iterates on the
2598
      /// keys mapped to \c false.
2599
      /// \param map The IterableBoolMap.
2600
      explicit FalseIt(const IterableBoolMap& map)
2601
        : Parent(map._sep < int(map._array.size()) ?
2602
                 map._array.back() : INVALID), _map(&map) {}
2603

	
2604
      /// \brief Invalid constructor \& conversion.
2605
      ///
2606
      /// This constructor initializes the iterator to be invalid.
2607
      /// \sa Invalid for more details.
2608
      FalseIt(Invalid) : Parent(INVALID), _map(0) {}
2609

	
2610
      /// \brief Increment operator.
2611
      ///
2612
      /// Increment operator.
2613
      FalseIt& operator++() {
2614
        int pos = _map->position(*this);
2615
        Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID);
2616
        return *this;
2617
      }
2618

	
2619
    private:
2620
      const IterableBoolMap* _map;
2621
    };
2622

	
2623
    /// \brief Iterator for the keys mapped to a given value.
2624
    ///
2625
    /// Iterator for the keys mapped to a given value. It works
2626
    /// like a graph item iterator, it can be converted to
2627
    /// the key type of the map, incremented with \c ++ operator, and
2628
    /// if the iterator leaves the last valid key, it will be equal to
2629
    /// \c INVALID.
2630
    class ItemIt : public Key {
2631
    public:
2632
      typedef Key Parent;
2633

	
2634
      /// \brief Creates an iterator with a value.
2635
      ///
2636
      /// Creates an iterator with a value. It iterates on the
2637
      /// keys mapped to the given value.
2638
      /// \param map The IterableBoolMap.
2639
      /// \param value The value.
2640
      ItemIt(const IterableBoolMap& map, bool value)
2641
        : Parent(value ?
2642
                 (map._sep > 0 ?
2643
                  map._array[map._sep - 1] : INVALID) :
2644
                 (map._sep < int(map._array.size()) ?
2645
                  map._array.back() : INVALID)), _map(&map) {}
2646

	
2647
      /// \brief Invalid constructor \& conversion.
2648
      ///
2649
      /// This constructor initializes the iterator to be invalid.
2650
      /// \sa Invalid for more details.
2651
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2652

	
2653
      /// \brief Increment operator.
2654
      ///
2655
      /// Increment operator.
2656
      ItemIt& operator++() {
2657
        int pos = _map->position(*this);
2658
        int _sep = pos >= _map->_sep ? _map->_sep : 0;
2659
        Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID);
2660
        return *this;
2661
      }
2662

	
2663
    private:
2664
      const IterableBoolMap* _map;
2665
    };
2666

	
2667
  protected:
2668

	
2669
    virtual void add(const Key& key) {
2670
      Parent::add(key);
2671
      Parent::set(key, _array.size());
2672
      _array.push_back(key);
2673
    }
2674

	
2675
    virtual void add(const std::vector<Key>& keys) {
2676
      Parent::add(keys);
2677
      for (int i = 0; i < int(keys.size()); ++i) {
2678
        Parent::set(keys[i], _array.size());
2679
        _array.push_back(keys[i]);
2680
      }
2681
    }
2682

	
2683
    virtual void erase(const Key& key) {
2684
      int pos = position(key);
2685
      if (pos < _sep) {
2686
        --_sep;
2687
        Parent::set(_array[_sep], pos);
2688
        _array[pos] = _array[_sep];
2689
        Parent::set(_array.back(), _sep);
2690
        _array[_sep] = _array.back();
2691
        _array.pop_back();
2692
      } else {
2693
        Parent::set(_array.back(), pos);
2694
        _array[pos] = _array.back();
2695
        _array.pop_back();
2696
      }
2697
      Parent::erase(key);
2698
    }
2699

	
2700
    virtual void erase(const std::vector<Key>& keys) {
2701
      for (int i = 0; i < int(keys.size()); ++i) {
2702
        int pos = position(keys[i]);
2703
        if (pos < _sep) {
2704
          --_sep;
2705
          Parent::set(_array[_sep], pos);
2706
          _array[pos] = _array[_sep];
2707
          Parent::set(_array.back(), _sep);
2708
          _array[_sep] = _array.back();
2709
          _array.pop_back();
2710
        } else {
2711
          Parent::set(_array.back(), pos);
2712
          _array[pos] = _array.back();
2713
          _array.pop_back();
2714
        }
2715
      }
2716
      Parent::erase(keys);
2717
    }
2718

	
2719
    virtual void build() {
2720
      Parent::build();
2721
      typename Parent::Notifier* nf = Parent::notifier();
2722
      Key it;
2723
      for (nf->first(it); it != INVALID; nf->next(it)) {
2724
        Parent::set(it, _array.size());
2725
        _array.push_back(it);
2726
      }
2727
      _sep = 0;
2728
    }
2729

	
2730
    virtual void clear() {
2731
      _array.clear();
2732
      _sep = 0;
2733
      Parent::clear();
2734
    }
2735

	
2736
  };
2737

	
2738

	
2739
  namespace _maps_bits {
2740
    template <typename Item>
2741
    struct IterableIntMapNode {
2742
      IterableIntMapNode() : value(-1) {}
2743
      IterableIntMapNode(int _value) : value(_value) {}
2744
      Item prev, next;
2745
      int value;
2746
    };
2747
  }
2748

	
2749
  /// \brief Dynamic iterable integer map.
2750
  ///
2751
  /// This class provides a special graph map type which can store an
2752
  /// integer value for graph items (\c Node, \c Arc or \c Edge).
2753
  /// For each non-negative value it is possible to iterate on the keys
2754
  /// mapped to the value.
2755
  ///
2756
  /// This map is intended to be used with small integer values, for which
2757
  /// it is efficient, and supports iteration only for non-negative values.
2758
  /// If you need large values and/or iteration for negative integers,
2759
  /// consider to use \ref IterableValueMap instead.
2760
  ///
2761
  /// This type is a reference map, so it can be modified with the
2762
  /// subscript operator.
2763
  ///
2764
  /// \note The size of the data structure depends on the largest
2765
  /// value in the map.
2766
  ///
2767
  /// \tparam GR The graph type.
2768
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
2769
  /// \c GR::Edge).
2770
  ///
2771
  /// \see IterableBoolMap, IterableValueMap
2772
  /// \see CrossRefMap
2773
  template <typename GR, typename K>
2774
  class IterableIntMap
2775
    : protected ItemSetTraits<GR, K>::
2776
        template Map<_maps_bits::IterableIntMapNode<K> >::Type {
2777
  public:
2778
    typedef typename ItemSetTraits<GR, K>::
2779
      template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent;
2780

	
2781
    /// The key type
2782
    typedef K Key;
2783
    /// The value type
2784
    typedef int Value;
2785
    /// The graph type
2786
    typedef GR Graph;
2787

	
2788
    /// \brief Constructor of the map.
2789
    ///
2790
    /// Constructor of the map. It sets all values to -1.
2791
    explicit IterableIntMap(const Graph& graph)
2792
      : Parent(graph) {}
2793

	
2794
    /// \brief Constructor of the map with a given value.
2795
    ///
2796
    /// Constructor of the map with a given value.
2797
    explicit IterableIntMap(const Graph& graph, int value)
2798
      : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) {
2799
      if (value >= 0) {
2800
        for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
2801
          lace(it);
2802
        }
2803
      }
2804
    }
2805

	
2806
  private:
2807

	
2808
    void unlace(const Key& key) {
2809
      typename Parent::Value& node = Parent::operator[](key);
2810
      if (node.value < 0) return;
2811
      if (node.prev != INVALID) {
2812
        Parent::operator[](node.prev).next = node.next;
2813
      } else {
2814
        _first[node.value] = node.next;
2815
      }
2816
      if (node.next != INVALID) {
2817
        Parent::operator[](node.next).prev = node.prev;
2818
      }
2819
      while (!_first.empty() && _first.back() == INVALID) {
2820
        _first.pop_back();
2821
      }
2822
    }
2823

	
2824
    void lace(const Key& key) {
2825
      typename Parent::Value& node = Parent::operator[](key);
2826
      if (node.value < 0) return;
2827
      if (node.value >= int(_first.size())) {
2828
        _first.resize(node.value + 1, INVALID);
2829
      }
2830
      node.prev = INVALID;
2831
      node.next = _first[node.value];
2832
      if (node.next != INVALID) {
2833
        Parent::operator[](node.next).prev = key;
2834
      }
2835
      _first[node.value] = key;
2836
    }
2837

	
2838
  public:
2839

	
2840
    /// Indicates that the map is reference map.
2841
    typedef True ReferenceMapTag;
2842

	
2843
    /// \brief Reference to the value of the map.
2844
    ///
2845
    /// This class is similar to the \c int type. It can
2846
    /// be converted to \c int and it has the same operators.
2847
    class Reference {
2848
      friend class IterableIntMap;
2849
    private:
2850
      Reference(IterableIntMap& map, const Key& key)
2851
        : _key(key), _map(map) {}
2852
    public:
2853

	
2854
      Reference& operator=(const Reference& value) {
2855
        _map.set(_key, static_cast<const int&>(value));
2856
         return *this;
2857
      }
2858

	
2859
      operator const int&() const {
2860
        return static_cast<const IterableIntMap&>(_map)[_key];
2861
      }
2862

	
2863
      Reference& operator=(int value) {
2864
        _map.set(_key, value);
2865
        return *this;
2866
      }
2867
      Reference& operator++() {
2868
        _map.set(_key, _map[_key] + 1);
2869
        return *this;
2870
      }
2871
      int operator++(int) {
2872
        int value = _map[_key];
2873
        _map.set(_key, value + 1);
2874
        return value;
2875
      }
2876
      Reference& operator--() {
2877
        _map.set(_key, _map[_key] - 1);
2878
        return *this;
2879
      }
2880
      int operator--(int) {
2881
        int value = _map[_key];
2882
        _map.set(_key, value - 1);
2883
        return value;
2884
      }
2885
      Reference& operator+=(int value) {
2886
        _map.set(_key, _map[_key] + value);
2887
        return *this;
2888
      }
2889
      Reference& operator-=(int value) {
2890
        _map.set(_key, _map[_key] - value);
2891
        return *this;
2892
      }
2893
      Reference& operator*=(int value) {
2894
        _map.set(_key, _map[_key] * value);
2895
        return *this;
2896
      }
2897
      Reference& operator/=(int value) {
2898
        _map.set(_key, _map[_key] / value);
2899
        return *this;
2900
      }
2901
      Reference& operator%=(int value) {
2902
        _map.set(_key, _map[_key] % value);
2903
        return *this;
2904
      }
2905
      Reference& operator&=(int value) {
2906
        _map.set(_key, _map[_key] & value);
2907
        return *this;
2908
      }
2909
      Reference& operator|=(int value) {
2910
        _map.set(_key, _map[_key] | value);
2911
        return *this;
2912
      }
2913
      Reference& operator^=(int value) {
2914
        _map.set(_key, _map[_key] ^ value);
2915
        return *this;
2916
      }
2917
      Reference& operator<<=(int value) {
2918
        _map.set(_key, _map[_key] << value);
2919
        return *this;
2920
      }
2921
      Reference& operator>>=(int value) {
2922
        _map.set(_key, _map[_key] >> value);
2923
        return *this;
2924
      }
2925

	
2926
    private:
2927
      Key _key;
2928
      IterableIntMap& _map;
2929
    };
2930

	
2931
    /// The const reference type.
2932
    typedef const Value& ConstReference;
2933

	
2934
    /// \brief Gives back the maximal value plus one.
2935
    ///
2936
    /// Gives back the maximal value plus one.
2937
    int size() const {
2938
      return _first.size();
2939
    }
2940

	
2941
    /// \brief Set operation of the map.
2942
    ///
2943
    /// Set operation of the map.
2944
    void set(const Key& key, const Value& value) {
2945
      unlace(key);
2946
      Parent::operator[](key).value = value;
2947
      lace(key);
2948
    }
2949

	
2950
    /// \brief Const subscript operator of the map.
2951
    ///
2952
    /// Const subscript operator of the map.
2953
    const Value& operator[](const Key& key) const {
2954
      return Parent::operator[](key).value;
2955
    }
2956

	
2957
    /// \brief Subscript operator of the map.
2958
    ///
2959
    /// Subscript operator of the map.
2960
    Reference operator[](const Key& key) {
2961
      return Reference(*this, key);
2962
    }
2963

	
2964
    /// \brief Iterator for the keys with the same value.
2965
    ///
2966
    /// Iterator for the keys with the same value. It works
2967
    /// like a graph item iterator, it can be converted to
2968
    /// the item type of the map, incremented with \c ++ operator, and
2969
    /// if the iterator leaves the last valid item, it will be equal to
2970
    /// \c INVALID.
2971
    class ItemIt : public Key {
2972
    public:
2973
      typedef Key Parent;
2974

	
2975
      /// \brief Invalid constructor \& conversion.
2976
      ///
2977
      /// This constructor initializes the iterator to be invalid.
2978
      /// \sa Invalid for more details.
2979
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
2980

	
2981
      /// \brief Creates an iterator with a value.
2982
      ///
2983
      /// Creates an iterator with a value. It iterates on the
2984
      /// keys mapped to the given value.
2985
      /// \param map The IterableIntMap.
2986
      /// \param value The value.
2987
      ItemIt(const IterableIntMap& map, int value) : _map(&map) {
2988
        if (value < 0 || value >= int(_map->_first.size())) {
2989
          Parent::operator=(INVALID);
2990
        } else {
2991
          Parent::operator=(_map->_first[value]);
2992
        }
2993
      }
2994

	
2995
      /// \brief Increment operator.
2996
      ///
2997
      /// Increment operator.
2998
      ItemIt& operator++() {
2999
        Parent::operator=(_map->IterableIntMap::Parent::
3000
                          operator[](static_cast<Parent&>(*this)).next);
3001
        return *this;
3002
      }
3003

	
3004
    private:
3005
      const IterableIntMap* _map;
3006
    };
3007

	
3008
  protected:
3009

	
3010
    virtual void erase(const Key& key) {
3011
      unlace(key);
3012
      Parent::erase(key);
3013
    }
3014

	
3015
    virtual void erase(const std::vector<Key>& keys) {
3016
      for (int i = 0; i < int(keys.size()); ++i) {
3017
        unlace(keys[i]);
3018
      }
3019
      Parent::erase(keys);
3020
    }
3021

	
3022
    virtual void clear() {
3023
      _first.clear();
3024
      Parent::clear();
3025
    }
3026

	
3027
  private:
3028
    std::vector<Key> _first;
3029
  };
3030

	
3031
  namespace _maps_bits {
3032
    template <typename Item, typename Value>
3033
    struct IterableValueMapNode {
3034
      IterableValueMapNode(Value _value = Value()) : value(_value) {}
3035
      Item prev, next;
3036
      Value value;
3037
    };
3038
  }
3039

	
3040
  /// \brief Dynamic iterable map for comparable values.
3041
  ///
3042
  /// This class provides a special graph map type which can store a
3043
  /// comparable value for graph items (\c Node, \c Arc or \c Edge).
3044
  /// For each value it is possible to iterate on the keys mapped to
3045
  /// the value (\c ItemIt), and the values of the map can be accessed
3046
  /// with an STL compatible forward iterator (\c ValueIt).
3047
  /// The map stores a linked list for each value, which contains
3048
  /// the items mapped to the value, and the used values are stored
3049
  /// in balanced binary tree (\c std::map).
3050
  ///
3051
  /// \ref IterableBoolMap and \ref IterableIntMap are similar classes
3052
  /// specialized for \c bool and \c int values, respectively.
3053
  ///
3054
  /// This type is not reference map, so it cannot be modified with
3055
  /// the subscript operator.
3056
  ///
3057
  /// \tparam GR The graph type.
3058
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
3059
  /// \c GR::Edge).
3060
  /// \tparam V The value type of the map. It can be any comparable
3061
  /// value type.
3062
  ///
3063
  /// \see IterableBoolMap, IterableIntMap
3064
  /// \see CrossRefMap
3065
  template <typename GR, typename K, typename V>
3066
  class IterableValueMap
3067
    : protected ItemSetTraits<GR, K>::
3068
        template Map<_maps_bits::IterableValueMapNode<K, V> >::Type {
3069
  public:
3070
    typedef typename ItemSetTraits<GR, K>::
3071
      template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent;
3072

	
3073
    /// The key type
3074
    typedef K Key;
3075
    /// The value type
3076
    typedef V Value;
3077
    /// The graph type
3078
    typedef GR Graph;
3079

	
3080
  public:
3081

	
3082
    /// \brief Constructor of the map with a given value.
3083
    ///
3084
    /// Constructor of the map with a given value.
3085
    explicit IterableValueMap(const Graph& graph,
3086
                              const Value& value = Value())
3087
      : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) {
3088
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3089
        lace(it);
3090
      }
3091
    }
3092

	
3093
  protected:
3094

	
3095
    void unlace(const Key& key) {
3096
      typename Parent::Value& node = Parent::operator[](key);
3097
      if (node.prev != INVALID) {
3098
        Parent::operator[](node.prev).next = node.next;
3099
      } else {
3100
        if (node.next != INVALID) {
3101
          _first[node.value] = node.next;
3102
        } else {
3103
          _first.erase(node.value);
3104
        }
3105
      }
3106
      if (node.next != INVALID) {
3107
        Parent::operator[](node.next).prev = node.prev;
3108
      }
3109
    }
3110

	
3111
    void lace(const Key& key) {
3112
      typename Parent::Value& node = Parent::operator[](key);
3113
      typename std::map<Value, Key>::iterator it = _first.find(node.value);
3114
      if (it == _first.end()) {
3115
        node.prev = node.next = INVALID;
3116
        _first.insert(std::make_pair(node.value, key));
3117
      } else {
3118
        node.prev = INVALID;
3119
        node.next = it->second;
3120
        if (node.next != INVALID) {
3121
          Parent::operator[](node.next).prev = key;
3122
        }
3123
        it->second = key;
3124
      }
3125
    }
3126

	
3127
  public:
3128

	
3129
    /// \brief Forward iterator for values.
3130
    ///
3131
    /// This iterator is an STL compatible forward
3132
    /// iterator on the values of the map. The values can
3133
    /// be accessed in the <tt>[beginValue, endValue)</tt> range.
3134
    class ValueIt
3135
      : public std::iterator<std::forward_iterator_tag, Value> {
3136
      friend class IterableValueMap;
3137
    private:
3138
      ValueIt(typename std::map<Value, Key>::const_iterator _it)
3139
        : it(_it) {}
3140
    public:
3141

	
3142
      /// Constructor
3143
      ValueIt() {}
3144

	
3145
      /// \e
3146
      ValueIt& operator++() { ++it; return *this; }
3147
      /// \e
3148
      ValueIt operator++(int) {
3149
        ValueIt tmp(*this);
3150
        operator++();
3151
        return tmp;
3152
      }
3153

	
3154
      /// \e
3155
      const Value& operator*() const { return it->first; }
3156
      /// \e
3157
      const Value* operator->() const { return &(it->first); }
3158

	
3159
      /// \e
3160
      bool operator==(ValueIt jt) const { return it == jt.it; }
3161
      /// \e
3162
      bool operator!=(ValueIt jt) const { return it != jt.it; }
3163

	
3164
    private:
3165
      typename std::map<Value, Key>::const_iterator it;
3166
    };
3167

	
3168
    /// \brief Returns an iterator to the first value.
3169
    ///
3170
    /// Returns an STL compatible iterator to the
3171
    /// first value of the map. The values of the
3172
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3173
    /// range.
3174
    ValueIt beginValue() const {
3175
      return ValueIt(_first.begin());
3176
    }
3177

	
3178
    /// \brief Returns an iterator after the last value.
3179
    ///
3180
    /// Returns an STL compatible iterator after the
3181
    /// last value of the map. The values of the
3182
    /// map can be accessed in the <tt>[beginValue, endValue)</tt>
3183
    /// range.
3184
    ValueIt endValue() const {
3185
      return ValueIt(_first.end());
3186
    }
3187

	
3188
    /// \brief Set operation of the map.
3189
    ///
3190
    /// Set operation of the map.
3191
    void set(const Key& key, const Value& value) {
3192
      unlace(key);
3193
      Parent::operator[](key).value = value;
3194
      lace(key);
3195
    }
3196

	
3197
    /// \brief Const subscript operator of the map.
3198
    ///
3199
    /// Const subscript operator of the map.
3200
    const Value& operator[](const Key& key) const {
3201
      return Parent::operator[](key).value;
3202
    }
3203

	
3204
    /// \brief Iterator for the keys with the same value.
3205
    ///
3206
    /// Iterator for the keys with the same value. It works
3207
    /// like a graph item iterator, it can be converted to
3208
    /// the item type of the map, incremented with \c ++ operator, and
3209
    /// if the iterator leaves the last valid item, it will be equal to
3210
    /// \c INVALID.
3211
    class ItemIt : public Key {
3212
    public:
3213
      typedef Key Parent;
3214

	
3215
      /// \brief Invalid constructor \& conversion.
3216
      ///
3217
      /// This constructor initializes the iterator to be invalid.
3218
      /// \sa Invalid for more details.
3219
      ItemIt(Invalid) : Parent(INVALID), _map(0) {}
3220

	
3221
      /// \brief Creates an iterator with a value.
3222
      ///
3223
      /// Creates an iterator with a value. It iterates on the
3224
      /// keys which have the given value.
3225
      /// \param map The IterableValueMap
3226
      /// \param value The value
3227
      ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) {
3228
        typename std::map<Value, Key>::const_iterator it =
3229
          map._first.find(value);
3230
        if (it == map._first.end()) {
3231
          Parent::operator=(INVALID);
3232
        } else {
3233
          Parent::operator=(it->second);
3234
        }
3235
      }
3236

	
3237
      /// \brief Increment operator.
3238
      ///
3239
      /// Increment Operator.
3240
      ItemIt& operator++() {
3241
        Parent::operator=(_map->IterableValueMap::Parent::
3242
                          operator[](static_cast<Parent&>(*this)).next);
3243
        return *this;
3244
      }
3245

	
3246

	
3247
    private:
3248
      const IterableValueMap* _map;
3249
    };
3250

	
3251
  protected:
3252

	
3253
    virtual void add(const Key& key) {
3254
      Parent::add(key);
3255
      lace(key);
3256
    }
3257

	
3258
    virtual void add(const std::vector<Key>& keys) {
3259
      Parent::add(keys);
3260
      for (int i = 0; i < int(keys.size()); ++i) {
3261
        lace(keys[i]);
3262
      }
3263
    }
3264

	
3265
    virtual void erase(const Key& key) {
3266
      unlace(key);
3267
      Parent::erase(key);
3268
    }
3269

	
3270
    virtual void erase(const std::vector<Key>& keys) {
3271
      for (int i = 0; i < int(keys.size()); ++i) {
3272
        unlace(keys[i]);
3273
      }
3274
      Parent::erase(keys);
3275
    }
3276

	
3277
    virtual void build() {
3278
      Parent::build();
3279
      for (typename Parent::ItemIt it(*this); it != INVALID; ++it) {
3280
        lace(it);
3281
      }
3282
    }
3283

	
3284
    virtual void clear() {
3285
      _first.clear();
3286
      Parent::clear();
3287
    }
3288

	
3289
  private:
3290
    std::map<Value, Key> _first;
3291
  };
3292

	
2333 3293
  /// \brief Map of the source nodes of arcs in a digraph.
... ...
@@ -2342,5 +3302,5 @@
2342 3302

	
2343
    ///\e
3303
    /// The key type (the \c Arc type of the digraph).
2344 3304
    typedef typename GR::Arc Key;
2345
    ///\e
3305
    /// The value type (the \c Node type of the digraph).
2346 3306
    typedef typename GR::Node Value;
... ...
@@ -2383,5 +3343,5 @@
2383 3343

	
2384
    ///\e
3344
    /// The key type (the \c Arc type of the digraph).
2385 3345
    typedef typename GR::Arc Key;
2386
    ///\e
3346
    /// The value type (the \c Node type of the digraph).
2387 3347
    typedef typename GR::Node Value;
... ...
@@ -2425,4 +3385,6 @@
2425 3385

	
3386
    /// The key type (the \c Edge type of the digraph).
3387
    typedef typename GR::Edge Key;
3388
    /// The value type (the \c Arc type of the digraph).
2426 3389
    typedef typename GR::Arc Value;
2427
    typedef typename GR::Edge Key;
2428 3390

	
... ...
@@ -2465,4 +3427,6 @@
2465 3427

	
3428
    /// The key type (the \c Edge type of the digraph).
3429
    typedef typename GR::Edge Key;
3430
    /// The value type (the \c Arc type of the digraph).
2466 3431
    typedef typename GR::Arc Value;
2467
    typedef typename GR::Edge Key;
2468 3432

	
... ...
@@ -2501,6 +3465,6 @@
2501 3465
  ///
2502
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3466
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2503 3467
  /// may provide alternative ways to modify the digraph.
2504 3468
  /// The correct behavior of InDegMap is not guarantied if these additional
2505
  /// features are used. For example the functions
3469
  /// features are used. For example, the functions
2506 3470
  /// \ref ListDigraph::changeSource() "changeSource()",
... ...
@@ -2517,3 +3481,3 @@
2517 3481
  public:
2518
    
3482

	
2519 3483
    /// The graph type of InDegMap
... ...
@@ -2631,6 +3595,6 @@
2631 3595
  ///
2632
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure 
3596
  /// \warning Besides \c addNode() and \c addArc(), a digraph structure
2633 3597
  /// may provide alternative ways to modify the digraph.
2634 3598
  /// The correct behavior of OutDegMap is not guarantied if these additional
2635
  /// features are used. For example the functions
3599
  /// features are used. For example, the functions
2636 3600
  /// \ref ListDigraph::changeSource() "changeSource()",
... ...
@@ -2802,2 +3766,289 @@
2802 3766

	
3767

	
3768
  /// \brief Copy the values of a graph map to another map.
3769
  ///
3770
  /// This function copies the values of a graph map to another graph map.
3771
  /// \c To::Key must be equal or convertible to \c From::Key and
3772
  /// \c From::Value must be equal or convertible to \c To::Value.
3773
  ///
3774
  /// For example, an edge map of \c int value type can be copied to
3775
  /// an arc map of \c double value type in an undirected graph, but
3776
  /// an arc map cannot be copied to an edge map.
3777
  /// Note that even a \ref ConstMap can be copied to a standard graph map,
3778
  /// but \ref mapFill() can also be used for this purpose.
3779
  ///
3780
  /// \param gr The graph for which the maps are defined.
3781
  /// \param from The map from which the values have to be copied.
3782
  /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
3783
  /// \param to The map to which the values have to be copied.
3784
  /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
3785
  template <typename GR, typename From, typename To>
3786
  void mapCopy(const GR& gr, const From& from, To& to) {
3787
    typedef typename To::Key Item;
3788
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3789

	
3790
    for (ItemIt it(gr); it != INVALID; ++it) {
3791
      to.set(it, from[it]);
3792
    }
3793
  }
3794

	
3795
  /// \brief Compare two graph maps.
3796
  ///
3797
  /// This function compares the values of two graph maps. It returns
3798
  /// \c true if the maps assign the same value for all items in the graph.
3799
  /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal
3800
  /// and their \c Value types must be comparable using \c %operator==().
3801
  ///
3802
  /// \param gr The graph for which the maps are defined.
3803
  /// \param map1 The first map.
3804
  /// \param map2 The second map.
3805
  template <typename GR, typename Map1, typename Map2>
3806
  bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) {
3807
    typedef typename Map2::Key Item;
3808
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3809

	
3810
    for (ItemIt it(gr); it != INVALID; ++it) {
3811
      if (!(map1[it] == map2[it])) return false;
3812
    }
3813
    return true;
3814
  }
3815

	
3816
  /// \brief Return an item having minimum value of a graph map.
3817
  ///
3818
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3819
  /// minimum value of the given graph map.
3820
  /// If the item set is empty, it returns \c INVALID.
3821
  ///
3822
  /// \param gr The graph for which the map is defined.
3823
  /// \param map The graph map.
3824
  template <typename GR, typename Map>
3825
  typename Map::Key mapMin(const GR& gr, const Map& map) {
3826
    return mapMin(gr, map, std::less<typename Map::Value>());
3827
  }
3828

	
3829
  /// \brief Return an item having minimum value of a graph map.
3830
  ///
3831
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3832
  /// minimum value of the given graph map.
3833
  /// If the item set is empty, it returns \c INVALID.
3834
  ///
3835
  /// \param gr The graph for which the map is defined.
3836
  /// \param map The graph map.
3837
  /// \param comp Comparison function object.
3838
  template <typename GR, typename Map, typename Comp>
3839
  typename Map::Key mapMin(const GR& gr, const Map& map, const Comp& comp) {
3840
    typedef typename Map::Key Item;
3841
    typedef typename Map::Value Value;
3842
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3843

	
3844
    ItemIt min_item(gr);
3845
    if (min_item == INVALID) return INVALID;
3846
    Value min = map[min_item];
3847
    for (ItemIt it(gr); it != INVALID; ++it) {
3848
      if (comp(map[it], min)) {
3849
        min = map[it];
3850
        min_item = it;
3851
      }
3852
    }
3853
    return min_item;
3854
  }
3855

	
3856
  /// \brief Return an item having maximum value of a graph map.
3857
  ///
3858
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3859
  /// maximum value of the given graph map.
3860
  /// If the item set is empty, it returns \c INVALID.
3861
  ///
3862
  /// \param gr The graph for which the map is defined.
3863
  /// \param map The graph map.
3864
  template <typename GR, typename Map>
3865
  typename Map::Key mapMax(const GR& gr, const Map& map) {
3866
    return mapMax(gr, map, std::less<typename Map::Value>());
3867
  }
3868

	
3869
  /// \brief Return an item having maximum value of a graph map.
3870
  ///
3871
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3872
  /// maximum value of the given graph map.
3873
  /// If the item set is empty, it returns \c INVALID.
3874
  ///
3875
  /// \param gr The graph for which the map is defined.
3876
  /// \param map The graph map.
3877
  /// \param comp Comparison function object.
3878
  template <typename GR, typename Map, typename Comp>
3879
  typename Map::Key mapMax(const GR& gr, const Map& map, const Comp& comp) {
3880
    typedef typename Map::Key Item;
3881
    typedef typename Map::Value Value;
3882
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3883

	
3884
    ItemIt max_item(gr);
3885
    if (max_item == INVALID) return INVALID;
3886
    Value max = map[max_item];
3887
    for (ItemIt it(gr); it != INVALID; ++it) {
3888
      if (comp(max, map[it])) {
3889
        max = map[it];
3890
        max_item = it;
3891
      }
3892
    }
3893
    return max_item;
3894
  }
3895

	
3896
  /// \brief Return the minimum value of a graph map.
3897
  ///
3898
  /// This function returns the minimum value of the given graph map.
3899
  /// The corresponding item set of the graph must not be empty.
3900
  ///
3901
  /// \param gr The graph for which the map is defined.
3902
  /// \param map The graph map.
3903
  template <typename GR, typename Map>
3904
  typename Map::Value mapMinValue(const GR& gr, const Map& map) {
3905
    return map[mapMin(gr, map, std::less<typename Map::Value>())];
3906
  }
3907

	
3908
  /// \brief Return the minimum value of a graph map.
3909
  ///
3910
  /// This function returns the minimum value of the given graph map.
3911
  /// The corresponding item set of the graph must not be empty.
3912
  ///
3913
  /// \param gr The graph for which the map is defined.
3914
  /// \param map The graph map.
3915
  /// \param comp Comparison function object.
3916
  template <typename GR, typename Map, typename Comp>
3917
  typename Map::Value
3918
  mapMinValue(const GR& gr, const Map& map, const Comp& comp) {
3919
    return map[mapMin(gr, map, comp)];
3920
  }
3921

	
3922
  /// \brief Return the maximum value of a graph map.
3923
  ///
3924
  /// This function returns the maximum value of the given graph map.
3925
  /// The corresponding item set of the graph must not be empty.
3926
  ///
3927
  /// \param gr The graph for which the map is defined.
3928
  /// \param map The graph map.
3929
  template <typename GR, typename Map>
3930
  typename Map::Value mapMaxValue(const GR& gr, const Map& map) {
3931
    return map[mapMax(gr, map, std::less<typename Map::Value>())];
3932
  }
3933

	
3934
  /// \brief Return the maximum value of a graph map.
3935
  ///
3936
  /// This function returns the maximum value of the given graph map.
3937
  /// The corresponding item set of the graph must not be empty.
3938
  ///
3939
  /// \param gr The graph for which the map is defined.
3940
  /// \param map The graph map.
3941
  /// \param comp Comparison function object.
3942
  template <typename GR, typename Map, typename Comp>
3943
  typename Map::Value
3944
  mapMaxValue(const GR& gr, const Map& map, const Comp& comp) {
3945
    return map[mapMax(gr, map, comp)];
3946
  }
3947

	
3948
  /// \brief Return an item having a specified value in a graph map.
3949
  ///
3950
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3951
  /// the specified assigned value in the given graph map.
3952
  /// If no such item exists, it returns \c INVALID.
3953
  ///
3954
  /// \param gr The graph for which the map is defined.
3955
  /// \param map The graph map.
3956
  /// \param val The value that have to be found.
3957
  template <typename GR, typename Map>
3958
  typename Map::Key
3959
  mapFind(const GR& gr, const Map& map, const typename Map::Value& val) {
3960
    typedef typename Map::Key Item;
3961
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3962

	
3963
    for (ItemIt it(gr); it != INVALID; ++it) {
3964
      if (map[it] == val) return it;
3965
    }
3966
    return INVALID;
3967
  }
3968

	
3969
  /// \brief Return an item having value for which a certain predicate is
3970
  /// true in a graph map.
3971
  ///
3972
  /// This function returns an item (\c Node, \c Arc or \c Edge) having
3973
  /// such assigned value for which the specified predicate is true
3974
  /// in the given graph map.
3975
  /// If no such item exists, it returns \c INVALID.
3976
  ///
3977
  /// \param gr The graph for which the map is defined.
3978
  /// \param map The graph map.
3979
  /// \param pred The predicate function object.
3980
  template <typename GR, typename Map, typename Pred>
3981
  typename Map::Key
3982
  mapFindIf(const GR& gr, const Map& map, const Pred& pred) {
3983
    typedef typename Map::Key Item;
3984
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
3985

	
3986
    for (ItemIt it(gr); it != INVALID; ++it) {
3987
      if (pred(map[it])) return it;
3988
    }
3989
    return INVALID;
3990
  }
3991

	
3992
  /// \brief Return the number of items having a specified value in a
3993
  /// graph map.
3994
  ///
3995
  /// This function returns the number of items (\c Node, \c Arc or \c Edge)
3996
  /// having the specified assigned value in the given graph map.
3997
  ///
3998
  /// \param gr The graph for which the map is defined.
3999
  /// \param map The graph map.
4000
  /// \param val The value that have to be counted.
4001
  template <typename GR, typename Map>
4002
  int mapCount(const GR& gr, const Map& map, const typename Map::Value& val) {
4003
    typedef typename Map::Key Item;
4004
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4005

	
4006
    int cnt = 0;
4007
    for (ItemIt it(gr); it != INVALID; ++it) {
4008
      if (map[it] == val) ++cnt;
4009
    }
4010
    return cnt;
4011
  }
4012

	
4013
  /// \brief Return the number of items having values for which a certain
4014
  /// predicate is true in a graph map.
4015
  ///
4016
  /// This function returns the number of items (\c Node, \c Arc or \c Edge)
4017
  /// having such assigned values for which the specified predicate is true
4018
  /// in the given graph map.
4019
  ///
4020
  /// \param gr The graph for which the map is defined.
4021
  /// \param map The graph map.
4022
  /// \param pred The predicate function object.
4023
  template <typename GR, typename Map, typename Pred>
4024
  int mapCountIf(const GR& gr, const Map& map, const Pred& pred) {
4025
    typedef typename Map::Key Item;
4026
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4027

	
4028
    int cnt = 0;
4029
    for (ItemIt it(gr); it != INVALID; ++it) {
4030
      if (pred(map[it])) ++cnt;
4031
    }
4032
    return cnt;
4033
  }
4034

	
4035
  /// \brief Fill a graph map with a certain value.
4036
  ///
4037
  /// This function sets the specified value for all items (\c Node,
4038
  /// \c Arc or \c Edge) in the given graph map.
4039
  ///
4040
  /// \param gr The graph for which the map is defined.
4041
  /// \param map The graph map. It must conform to the
4042
  /// \ref concepts::WriteMap "WriteMap" concept.
4043
  /// \param val The value.
4044
  template <typename GR, typename Map>
4045
  void mapFill(const GR& gr, Map& map, const typename Map::Value& val) {
4046
    typedef typename Map::Key Item;
4047
    typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt;
4048

	
4049
    for (ItemIt it(gr); it != INVALID; ++it) {
4050
      map.set(it, val);
4051
    }
4052
  }
4053

	
2803 4054
  /// @}
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -18,4 +18,4 @@
18 18

	
19
#ifndef LEMON_MAX_MATCHING_H
20
#define LEMON_MAX_MATCHING_H
19
#ifndef LEMON_MATCHING_H
20
#define LEMON_MATCHING_H
21 21

	
... ...
@@ -30,2 +30,3 @@
30 30
#include <lemon/maps.h>
31
#include <lemon/fractional_matching.h>
31 32

	
... ...
@@ -43,3 +44,3 @@
43 44
  /// for finding a maximum cardinality matching in a general undirected graph.
44
  /// It can be started from an arbitrary initial matching 
45
  /// It can be started from an arbitrary initial matching
45 46
  /// (the default is the empty one).
... ...
@@ -71,3 +72,3 @@
71 72
    ///
72
    ///These constants are used for indicating the Gallai-Edmonds 
73
    ///These constants are used for indicating the Gallai-Edmonds
73 74
    ///decomposition of a graph. The nodes with status \c EVEN (or \c D)
... ...
@@ -75,3 +76,3 @@
75 76
    ///status \c ODD (or \c A) form the canonical barrier, and the nodes
76
    ///with status \c MATCHED (or \c C) induce a subgraph having a 
77
    ///with status \c MATCHED (or \c C) induce a subgraph having a
77 78
    ///perfect matching.
... ...
@@ -514,3 +515,3 @@
514 515

	
515
    /// \brief Start Edmonds' algorithm with a heuristic improvement 
516
    /// \brief Start Edmonds' algorithm with a heuristic improvement
516 517
    /// for dense graphs
... ...
@@ -536,4 +537,4 @@
536 537
    ///
537
    /// This function runs Edmonds' algorithm. An additional heuristic of 
538
    /// postponing shrinks is used for relatively dense graphs 
538
    /// This function runs Edmonds' algorithm. An additional heuristic of
539
    /// postponing shrinks is used for relatively dense graphs
539 540
    /// (for which <tt>m>=2*n</tt> holds).
... ...
@@ -558,3 +559,3 @@
558 559
    ///
559
    /// This function returns the size (cardinality) of the current matching. 
560
    /// This function returns the size (cardinality) of the current matching.
560 561
    /// After run() it returns the size of the maximum matching in the graph.
... ...
@@ -572,3 +573,3 @@
572 573
    ///
573
    /// This function returns \c true if the given edge is in the current 
574
    /// This function returns \c true if the given edge is in the current
574 575
    /// matching.
... ...
@@ -581,3 +582,3 @@
581 582
    /// This function returns the matching arc (or edge) incident to the
582
    /// given node in the current matching or \c INVALID if the node is 
583
    /// given node in the current matching or \c INVALID if the node is
583 584
    /// not covered by the matching.
... ...
@@ -597,3 +598,3 @@
597 598
    ///
598
    /// This function returns the mate of the given node in the current 
599
    /// This function returns the mate of the given node in the current
599 600
    /// matching or \c INVALID if the node is not covered by the matching.
... ...
@@ -607,3 +608,3 @@
607 608
    /// \name Dual Solution
608
    /// Functions to get the dual solution, i.e. the Gallai-Edmonds 
609
    /// Functions to get the dual solution, i.e. the Gallai-Edmonds
609 610
    /// decomposition.
... ...
@@ -650,4 +651,4 @@
650 651
  ///
651
  /// The maximum weighted matching problem is to find a subset of the 
652
  /// edges in an undirected graph with maximum overall weight for which 
652
  /// The maximum weighted matching problem is to find a subset of the
653
  /// edges in an undirected graph with maximum overall weight for which
653 654
  /// each node has at most one incident edge.
... ...
@@ -675,7 +676,7 @@
675 676
  ///
676
  /// The algorithm can be executed with the run() function. 
677
  /// The algorithm can be executed with the run() function.
677 678
  /// After it the matching (the primal solution) and the dual solution
678
  /// can be obtained using the query functions and the 
679
  /// \ref MaxWeightedMatching::BlossomIt "BlossomIt" nested class, 
680
  /// which is able to iterate on the nodes of a blossom. 
679
  /// can be obtained using the query functions and the
680
  /// \ref MaxWeightedMatching::BlossomIt "BlossomIt" nested class,
681
  /// which is able to iterate on the nodes of a blossom.
681 682
  /// If the value type is integer, then the dual solution is multiplied
... ...
@@ -684,3 +685,3 @@
684 685
  /// \tparam GR The undirected graph type the algorithm runs on.
685
  /// \tparam WM The type edge weight map. The default type is 
686
  /// \tparam WM The type edge weight map. The default type is
686 687
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
... ...
@@ -747,3 +748,3 @@
747 748
    enum Status {
748
      EVEN = -1, MATCHED = 0, ODD = 1, UNMATCHED = -2
749
      EVEN = -1, MATCHED = 0, ODD = 1
749 750
    };
... ...
@@ -799,2 +800,6 @@
799 800
    Value _delta_sum;
801
    int _unmatched;
802

	
803
    typedef MaxWeightedFractionalMatching<Graph, WeightMap> FractionalMatching;
804
    FractionalMatching *_fractional;
800 805

	
... ...
@@ -865,5 +870,2 @@
865 870
    void destroyStructures() {
866
      _node_num = countNodes(_graph);
867
      _blossom_num = _node_num * 3 / 2;
868

	
869 871
      if (_matching) {
... ...
@@ -943,6 +945,2 @@
943 945
            }
944
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
945
            if (_delta3->state(e) != _delta3->IN_HEAP) {
946
              _delta3->push(e, rw);
947
            }
948 946
          } else {
... ...
@@ -970,198 +968,2 @@
970 968
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
971
                           (*_blossom_data)[vb].offset){
972
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
973
                                   (*_blossom_data)[vb].offset);
974
                }
975
              }
976
            }
977
          }
978
        }
979
      }
980
      (*_blossom_data)[blossom].offset = 0;
981
    }
982

	
983
    void matchedToOdd(int blossom) {
984
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
985
        _delta2->erase(blossom);
986
      }
987
      (*_blossom_data)[blossom].offset += _delta_sum;
988
      if (!_blossom_set->trivial(blossom)) {
989
        _delta4->push(blossom, (*_blossom_data)[blossom].pot / 2 +
990
                     (*_blossom_data)[blossom].offset);
991
      }
992
    }
993

	
994
    void evenToMatched(int blossom, int tree) {
995
      if (!_blossom_set->trivial(blossom)) {
996
        (*_blossom_data)[blossom].pot += 2 * _delta_sum;
997
      }
998

	
999
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
1000
           n != INVALID; ++n) {
1001
        int ni = (*_node_index)[n];
1002
        (*_node_data)[ni].pot -= _delta_sum;
1003

	
1004
        _delta1->erase(n);
1005

	
1006
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1007
          Node v = _graph.source(e);
1008
          int vb = _blossom_set->find(v);
1009
          int vi = (*_node_index)[v];
1010

	
1011
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1012
            dualScale * _weight[e];
1013

	
1014
          if (vb == blossom) {
1015
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1016
              _delta3->erase(e);
1017
            }
1018
          } else if ((*_blossom_data)[vb].status == EVEN) {
1019

	
1020
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1021
              _delta3->erase(e);
1022
            }
1023

	
1024
            int vt = _tree_set->find(vb);
1025

	
1026
            if (vt != tree) {
1027

	
1028
              Arc r = _graph.oppositeArc(e);
1029

	
1030
              typename std::map<int, Arc>::iterator it =
1031
                (*_node_data)[ni].heap_index.find(vt);
1032

	
1033
              if (it != (*_node_data)[ni].heap_index.end()) {
1034
                if ((*_node_data)[ni].heap[it->second] > rw) {
1035
                  (*_node_data)[ni].heap.replace(it->second, r);
1036
                  (*_node_data)[ni].heap.decrease(r, rw);
1037
                  it->second = r;
1038
                }
1039
              } else {
1040
                (*_node_data)[ni].heap.push(r, rw);
1041
                (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
1042
              }
1043

	
1044
              if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
1045
                _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1046

	
1047
                if (_delta2->state(blossom) != _delta2->IN_HEAP) {
1048
                  _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1049
                               (*_blossom_data)[blossom].offset);
1050
                } else if ((*_delta2)[blossom] >
1051
                           _blossom_set->classPrio(blossom) -
1052
                           (*_blossom_data)[blossom].offset){
1053
                  _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
1054
                                   (*_blossom_data)[blossom].offset);
1055
                }
1056
              }
1057
            }
1058

	
1059
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
1060
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1061
              _delta3->erase(e);
1062
            }
1063
          } else {
1064

	
1065
            typename std::map<int, Arc>::iterator it =
1066
              (*_node_data)[vi].heap_index.find(tree);
1067

	
1068
            if (it != (*_node_data)[vi].heap_index.end()) {
1069
              (*_node_data)[vi].heap.erase(it->second);
1070
              (*_node_data)[vi].heap_index.erase(it);
1071
              if ((*_node_data)[vi].heap.empty()) {
1072
                _blossom_set->increase(v, std::numeric_limits<Value>::max());
1073
              } else if ((*_blossom_set)[v] < (*_node_data)[vi].heap.prio()) {
1074
                _blossom_set->increase(v, (*_node_data)[vi].heap.prio());
1075
              }
1076

	
1077
              if ((*_blossom_data)[vb].status == MATCHED) {
1078
                if (_blossom_set->classPrio(vb) ==
1079
                    std::numeric_limits<Value>::max()) {
1080
                  _delta2->erase(vb);
1081
                } else if ((*_delta2)[vb] < _blossom_set->classPrio(vb) -
1082
                           (*_blossom_data)[vb].offset) {
1083
                  _delta2->increase(vb, _blossom_set->classPrio(vb) -
1084
                                   (*_blossom_data)[vb].offset);
1085
                }
1086
              }
1087
            }
1088
          }
1089
        }
1090
      }
1091
    }
1092

	
1093
    void oddToMatched(int blossom) {
1094
      (*_blossom_data)[blossom].offset -= _delta_sum;
1095

	
1096
      if (_blossom_set->classPrio(blossom) !=
1097
          std::numeric_limits<Value>::max()) {
1098
        _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1099
                       (*_blossom_data)[blossom].offset);
1100
      }
1101

	
1102
      if (!_blossom_set->trivial(blossom)) {
1103
        _delta4->erase(blossom);
1104
      }
1105
    }
1106

	
1107
    void oddToEven(int blossom, int tree) {
1108
      if (!_blossom_set->trivial(blossom)) {
1109
        _delta4->erase(blossom);
1110
        (*_blossom_data)[blossom].pot -=
1111
          2 * (2 * _delta_sum - (*_blossom_data)[blossom].offset);
1112
      }
1113

	
1114
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
1115
           n != INVALID; ++n) {
1116
        int ni = (*_node_index)[n];
1117

	
1118
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
1119

	
1120
        (*_node_data)[ni].heap.clear();
1121
        (*_node_data)[ni].heap_index.clear();
1122
        (*_node_data)[ni].pot +=
1123
          2 * _delta_sum - (*_blossom_data)[blossom].offset;
1124

	
1125
        _delta1->push(n, (*_node_data)[ni].pot);
1126

	
1127
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1128
          Node v = _graph.source(e);
1129
          int vb = _blossom_set->find(v);
1130
          int vi = (*_node_index)[v];
1131

	
1132
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1133
            dualScale * _weight[e];
1134

	
1135
          if ((*_blossom_data)[vb].status == EVEN) {
1136
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
1137
              _delta3->push(e, rw / 2);
1138
            }
1139
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
1140
            if (_delta3->state(e) != _delta3->IN_HEAP) {
1141
              _delta3->push(e, rw);
1142
            }
1143
          } else {
1144

	
1145
            typename std::map<int, Arc>::iterator it =
1146
              (*_node_data)[vi].heap_index.find(tree);
1147

	
1148
            if (it != (*_node_data)[vi].heap_index.end()) {
1149
              if ((*_node_data)[vi].heap[it->second] > rw) {
1150
                (*_node_data)[vi].heap.replace(it->second, e);
1151
                (*_node_data)[vi].heap.decrease(e, rw);
1152
                it->second = e;
1153
              }
1154
            } else {
1155
              (*_node_data)[vi].heap.push(e, rw);
1156
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
1157
            }
1158

	
1159
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
1160
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
1161

	
1162
              if ((*_blossom_data)[vb].status == MATCHED) {
1163
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
1164
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
1165
                               (*_blossom_data)[vb].offset);
1166
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
1167 969
                           (*_blossom_data)[vb].offset) {
... ...
@@ -1178,4 +980,3 @@
1178 980

	
1179

	
1180
    void matchedToUnmatched(int blossom) {
981
    void matchedToOdd(int blossom) {
1181 982
      if (_delta2->state(blossom) == _delta2->IN_HEAP) {
... ...
@@ -1183,2 +984,13 @@
1183 984
      }
985
      (*_blossom_data)[blossom].offset += _delta_sum;
986
      if (!_blossom_set->trivial(blossom)) {
987
        _delta4->push(blossom, (*_blossom_data)[blossom].pot / 2 +
988
                      (*_blossom_data)[blossom].offset);
989
      }
990
    }
991

	
992
    void evenToMatched(int blossom, int tree) {
993
      if (!_blossom_set->trivial(blossom)) {
994
        (*_blossom_data)[blossom].pot += 2 * _delta_sum;
995
      }
1184 996

	
... ...
@@ -1187,10 +999,8 @@
1187 999
        int ni = (*_node_index)[n];
1188

	
1189
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
1190

	
1191
        (*_node_data)[ni].heap.clear();
1192
        (*_node_data)[ni].heap_index.clear();
1193

	
1194
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1195
          Node v = _graph.target(e);
1000
        (*_node_data)[ni].pot -= _delta_sum;
1001

	
1002
        _delta1->erase(n);
1003

	
1004
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
1005
          Node v = _graph.source(e);
1196 1006
          int vb = _blossom_set->find(v);
... ...
@@ -1201,5 +1011,70 @@
1201 1011

	
1202
          if ((*_blossom_data)[vb].status == EVEN) {
1203
            if (_delta3->state(e) != _delta3->IN_HEAP) {
1204
              _delta3->push(e, rw);
1012
          if (vb == blossom) {
1013
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1014
              _delta3->erase(e);
1015
            }
1016
          } else if ((*_blossom_data)[vb].status == EVEN) {
1017

	
1018
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1019
              _delta3->erase(e);
1020
            }
1021

	
1022
            int vt = _tree_set->find(vb);
1023

	
1024
            if (vt != tree) {
1025

	
1026
              Arc r = _graph.oppositeArc(e);
1027

	
1028
              typename std::map<int, Arc>::iterator it =
1029
                (*_node_data)[ni].heap_index.find(vt);
1030

	
1031
              if (it != (*_node_data)[ni].heap_index.end()) {
1032
                if ((*_node_data)[ni].heap[it->second] > rw) {
1033
                  (*_node_data)[ni].heap.replace(it->second, r);
1034
                  (*_node_data)[ni].heap.decrease(r, rw);
1035
                  it->second = r;
1036
                }
1037
              } else {
1038
                (*_node_data)[ni].heap.push(r, rw);
1039
                (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
1040
              }
1041

	
1042
              if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
1043
                _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1044

	
1045
                if (_delta2->state(blossom) != _delta2->IN_HEAP) {
1046
                  _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1047
                               (*_blossom_data)[blossom].offset);
1048
                } else if ((*_delta2)[blossom] >
1049
                           _blossom_set->classPrio(blossom) -
1050
                           (*_blossom_data)[blossom].offset){
1051
                  _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
1052
                                   (*_blossom_data)[blossom].offset);
1053
                }
1054
              }
1055
            }
1056
          } else {
1057

	
1058
            typename std::map<int, Arc>::iterator it =
1059
              (*_node_data)[vi].heap_index.find(tree);
1060

	
1061
            if (it != (*_node_data)[vi].heap_index.end()) {
1062
              (*_node_data)[vi].heap.erase(it->second);
1063
              (*_node_data)[vi].heap_index.erase(it);
1064
              if ((*_node_data)[vi].heap.empty()) {
1065
                _blossom_set->increase(v, std::numeric_limits<Value>::max());
1066
              } else if ((*_blossom_set)[v] < (*_node_data)[vi].heap.prio()) {
1067
                _blossom_set->increase(v, (*_node_data)[vi].heap.prio());
1068
              }
1069

	
1070
              if ((*_blossom_data)[vb].status == MATCHED) {
1071
                if (_blossom_set->classPrio(vb) ==
1072
                    std::numeric_limits<Value>::max()) {
1073
                  _delta2->erase(vb);
1074
                } else if ((*_delta2)[vb] < _blossom_set->classPrio(vb) -
1075
                           (*_blossom_data)[vb].offset) {
1076
                  _delta2->increase(vb, _blossom_set->classPrio(vb) -
1077
                                   (*_blossom_data)[vb].offset);
1078
                }
1079
              }
1205 1080
            }
... ...
@@ -1210,3 +1085,23 @@
1210 1085

	
1211
    void unmatchedToMatched(int blossom) {
1086
    void oddToMatched(int blossom) {
1087
      (*_blossom_data)[blossom].offset -= _delta_sum;
1088

	
1089
      if (_blossom_set->classPrio(blossom) !=
1090
          std::numeric_limits<Value>::max()) {
1091
        _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1092
                      (*_blossom_data)[blossom].offset);
1093
      }
1094

	
1095
      if (!_blossom_set->trivial(blossom)) {
1096
        _delta4->erase(blossom);
1097
      }
1098
    }
1099

	
1100
    void oddToEven(int blossom, int tree) {
1101
      if (!_blossom_set->trivial(blossom)) {
1102
        _delta4->erase(blossom);
1103
        (*_blossom_data)[blossom].pot -=
1104
          2 * (2 * _delta_sum - (*_blossom_data)[blossom].offset);
1105
      }
1106

	
1212 1107
      for (typename BlossomSet::ItemIt n(*_blossom_set, blossom);
... ...
@@ -1215,2 +1110,11 @@
1215 1110

	
1111
        _blossom_set->increase(n, std::numeric_limits<Value>::max());
1112

	
1113
        (*_node_data)[ni].heap.clear();
1114
        (*_node_data)[ni].heap_index.clear();
1115
        (*_node_data)[ni].pot +=
1116
          2 * _delta_sum - (*_blossom_data)[blossom].offset;
1117

	
1118
        _delta1->push(n, (*_node_data)[ni].pot);
1119

	
1216 1120
        for (InArcIt e(_graph, n); e != INVALID; ++e) {
... ...
@@ -1223,47 +1127,36 @@
1223 1127

	
1224
          if (vb == blossom) {
1225
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1226
              _delta3->erase(e);
1128
          if ((*_blossom_data)[vb].status == EVEN) {
1129
            if (_delta3->state(e) != _delta3->IN_HEAP && blossom != vb) {
1130
              _delta3->push(e, rw / 2);
1227 1131
            }
1228
          } else if ((*_blossom_data)[vb].status == EVEN) {
1229

	
1230
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1231
              _delta3->erase(e);
1232
            }
1233

	
1234
            int vt = _tree_set->find(vb);
1235

	
1236
            Arc r = _graph.oppositeArc(e);
1132
          } else {
1237 1133

	
1238 1134
            typename std::map<int, Arc>::iterator it =
1239
              (*_node_data)[ni].heap_index.find(vt);
1240

	
1241
            if (it != (*_node_data)[ni].heap_index.end()) {
1242
              if ((*_node_data)[ni].heap[it->second] > rw) {
1243
                (*_node_data)[ni].heap.replace(it->second, r);
1244
                (*_node_data)[ni].heap.decrease(r, rw);
1245
                it->second = r;
1135
              (*_node_data)[vi].heap_index.find(tree);
1136

	
1137
            if (it != (*_node_data)[vi].heap_index.end()) {
1138
              if ((*_node_data)[vi].heap[it->second] > rw) {
1139
                (*_node_data)[vi].heap.replace(it->second, e);
1140
                (*_node_data)[vi].heap.decrease(e, rw);
1141
                it->second = e;
1246 1142
              }
1247 1143
            } else {
1248
              (*_node_data)[ni].heap.push(r, rw);
1249
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, r));
1144
              (*_node_data)[vi].heap.push(e, rw);
1145
              (*_node_data)[vi].heap_index.insert(std::make_pair(tree, e));
1250 1146
            }
1251 1147

	
1252
            if ((*_blossom_set)[n] > (*_node_data)[ni].heap.prio()) {
1253
              _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1254

	
1255
              if (_delta2->state(blossom) != _delta2->IN_HEAP) {
1256
                _delta2->push(blossom, _blossom_set->classPrio(blossom) -
1257
                             (*_blossom_data)[blossom].offset);
1258
              } else if ((*_delta2)[blossom] > _blossom_set->classPrio(blossom)-
1259
                         (*_blossom_data)[blossom].offset){
1260
                _delta2->decrease(blossom, _blossom_set->classPrio(blossom) -
1261
                                 (*_blossom_data)[blossom].offset);
1148
            if ((*_blossom_set)[v] > (*_node_data)[vi].heap.prio()) {
1149
              _blossom_set->decrease(v, (*_node_data)[vi].heap.prio());
1150

	
1151
              if ((*_blossom_data)[vb].status == MATCHED) {
1152
                if (_delta2->state(vb) != _delta2->IN_HEAP) {
1153
                  _delta2->push(vb, _blossom_set->classPrio(vb) -
1154
                               (*_blossom_data)[vb].offset);
1155
                } else if ((*_delta2)[vb] > _blossom_set->classPrio(vb) -
1156
                           (*_blossom_data)[vb].offset) {
1157
                  _delta2->decrease(vb, _blossom_set->classPrio(vb) -
1158
                                   (*_blossom_data)[vb].offset);
1159
                }
1262 1160
              }
1263 1161
            }
1264

	
1265
          } else if ((*_blossom_data)[vb].status == UNMATCHED) {
1266
            if (_delta3->state(e) == _delta3->IN_HEAP) {
1267
              _delta3->erase(e);
1268
            }
1269 1162
          }
... ...
@@ -1271,2 +1164,3 @@
1271 1164
      }
1165
      (*_blossom_data)[blossom].offset = 0;
1272 1166
    }
... ...
@@ -1315,8 +1209,6 @@
1315 1209

	
1316
      (*_blossom_data)[blossom].status = UNMATCHED;
1317 1210
      (*_blossom_data)[blossom].base = node;
1318
      matchedToUnmatched(blossom);
1211
      (*_blossom_data)[blossom].next = INVALID;
1319 1212
    }
1320 1213

	
1321

	
1322 1214
    void augmentOnEdge(const Edge& edge) {
... ...
@@ -1326,19 +1218,9 @@
1326 1218

	
1327
      if ((*_blossom_data)[left].status == EVEN) {
1328
        int left_tree = _tree_set->find(left);
1329
        alternatePath(left, left_tree);
1330
        destroyTree(left_tree);
1331
      } else {
1332
        (*_blossom_data)[left].status = MATCHED;
1333
        unmatchedToMatched(left);
1334
      }
1335

	
1336
      if ((*_blossom_data)[right].status == EVEN) {
1337
        int right_tree = _tree_set->find(right);
1338
        alternatePath(right, right_tree);
1339
        destroyTree(right_tree);
1340
      } else {
1341
        (*_blossom_data)[right].status = MATCHED;
1342
        unmatchedToMatched(right);
1343
      }
1219
      int left_tree = _tree_set->find(left);
1220
      alternatePath(left, left_tree);
1221
      destroyTree(left_tree);
1222

	
1223
      int right_tree = _tree_set->find(right);
1224
      alternatePath(right, right_tree);
1225
      destroyTree(right_tree);
1344 1226

	
... ...
@@ -1348,2 +1230,17 @@
1348 1230

	
1231
    void augmentOnArc(const Arc& arc) {
1232

	
1233
      int left = _blossom_set->find(_graph.source(arc));
1234
      int right = _blossom_set->find(_graph.target(arc));
1235

	
1236
      (*_blossom_data)[left].status = MATCHED;
1237

	
1238
      int right_tree = _tree_set->find(right);
1239
      alternatePath(right, right_tree);
1240
      destroyTree(right_tree);
1241

	
1242
      (*_blossom_data)[left].next = arc;
1243
      (*_blossom_data)[right].next = _graph.oppositeArc(arc);
1244
    }
1245

	
1349 1246
    void extendOnArc(const Arc& arc) {
... ...
@@ -1550,3 +1447,3 @@
1550 1447
          (*_blossom_data)[sb].next =
1551
                           _graph.oppositeArc((*_blossom_data)[tb].next);
1448
            _graph.oppositeArc((*_blossom_data)[tb].next);
1552 1449

	
... ...
@@ -1650,3 +1547,3 @@
1650 1547
      for (int i = 0; i < int(blossoms.size()); ++i) {
1651
        if ((*_blossom_data)[blossoms[i]].status == MATCHED) {
1548
        if ((*_blossom_data)[blossoms[i]].next != INVALID) {
1652 1549

	
... ...
@@ -1688,3 +1585,6 @@
1688 1585

	
1689
        _delta_sum() {}
1586
        _delta_sum(), _unmatched(0),
1587

	
1588
        _fractional(0)
1589
    {}
1690 1590

	
... ...
@@ -1692,2 +1592,5 @@
1692 1592
      destroyStructures();
1593
      if (_fractional) {
1594
        delete _fractional;
1595
      }
1693 1596
    }
... ...
@@ -1722,3 +1625,5 @@
1722 1625
      }
1723
      
1626

	
1627
      _unmatched = _node_num;
1628

	
1724 1629
      _delta1->clear();
... ...
@@ -1766,2 +1671,151 @@
1766 1671

	
1672
    /// \brief Initialize the algorithm with fractional matching
1673
    ///
1674
    /// This function initializes the algorithm with a fractional
1675
    /// matching. This initialization is also called jumpstart heuristic.
1676
    void fractionalInit() {
1677
      createStructures();
1678

	
1679
      _blossom_node_list.clear();
1680
      _blossom_potential.clear();
1681

	
1682
      if (_fractional == 0) {
1683
        _fractional = new FractionalMatching(_graph, _weight, false);
1684
      }
1685
      _fractional->run();
1686

	
1687
      for (ArcIt e(_graph); e != INVALID; ++e) {
1688
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
1689
      }
1690
      for (NodeIt n(_graph); n != INVALID; ++n) {
1691
        (*_delta1_index)[n] = _delta1->PRE_HEAP;
1692
      }
1693
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1694
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
1695
      }
1696
      for (int i = 0; i < _blossom_num; ++i) {
1697
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
1698
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
1699
      }
1700

	
1701
      _unmatched = 0;
1702

	
1703
      _delta1->clear();
1704
      _delta2->clear();
1705
      _delta3->clear();
1706
      _delta4->clear();
1707
      _blossom_set->clear();
1708
      _tree_set->clear();
1709

	
1710
      int index = 0;
1711
      for (NodeIt n(_graph); n != INVALID; ++n) {
1712
        Value pot = _fractional->nodeValue(n);
1713
        (*_node_index)[n] = index;
1714
        (*_node_data)[index].pot = pot;
1715
        (*_node_data)[index].heap_index.clear();
1716
        (*_node_data)[index].heap.clear();
1717
        int blossom =
1718
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
1719

	
1720
        (*_blossom_data)[blossom].status = MATCHED;
1721
        (*_blossom_data)[blossom].pred = INVALID;
1722
        (*_blossom_data)[blossom].next = _fractional->matching(n);
1723
        if (_fractional->matching(n) == INVALID) {
1724
          (*_blossom_data)[blossom].base = n;
1725
        }
1726
        (*_blossom_data)[blossom].pot = 0;
1727
        (*_blossom_data)[blossom].offset = 0;
1728
        ++index;
1729
      }
1730

	
1731
      typename Graph::template NodeMap<bool> processed(_graph, false);
1732
      for (NodeIt n(_graph); n != INVALID; ++n) {
1733
        if (processed[n]) continue;
1734
        processed[n] = true;
1735
        if (_fractional->matching(n) == INVALID) continue;
1736
        int num = 1;
1737
        Node v = _graph.target(_fractional->matching(n));
1738
        while (n != v) {
1739
          processed[v] = true;
1740
          v = _graph.target(_fractional->matching(v));
1741
          ++num;
1742
        }
1743

	
1744
        if (num % 2 == 1) {
1745
          std::vector<int> subblossoms(num);
1746

	
1747
          subblossoms[--num] = _blossom_set->find(n);
1748
          _delta1->push(n, _fractional->nodeValue(n));
1749
          v = _graph.target(_fractional->matching(n));
1750
          while (n != v) {
1751
            subblossoms[--num] = _blossom_set->find(v);
1752
            _delta1->push(v, _fractional->nodeValue(v));
1753
            v = _graph.target(_fractional->matching(v));
1754
          }
1755

	
1756
          int surface =
1757
            _blossom_set->join(subblossoms.begin(), subblossoms.end());
1758
          (*_blossom_data)[surface].status = EVEN;
1759
          (*_blossom_data)[surface].pred = INVALID;
1760
          (*_blossom_data)[surface].next = INVALID;
1761
          (*_blossom_data)[surface].pot = 0;
1762
          (*_blossom_data)[surface].offset = 0;
1763

	
1764
          _tree_set->insert(surface);
1765
          ++_unmatched;
1766
        }
1767
      }
1768

	
1769
      for (EdgeIt e(_graph); e != INVALID; ++e) {
1770
        int si = (*_node_index)[_graph.u(e)];
1771
        int sb = _blossom_set->find(_graph.u(e));
1772
        int ti = (*_node_index)[_graph.v(e)];
1773
        int tb = _blossom_set->find(_graph.v(e));
1774
        if ((*_blossom_data)[sb].status == EVEN &&
1775
            (*_blossom_data)[tb].status == EVEN && sb != tb) {
1776
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
1777
                            dualScale * _weight[e]) / 2);
1778
        }
1779
      }
1780

	
1781
      for (NodeIt n(_graph); n != INVALID; ++n) {
1782
        int nb = _blossom_set->find(n);
1783
        if ((*_blossom_data)[nb].status != MATCHED) continue;
1784
        int ni = (*_node_index)[n];
1785

	
1786
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
1787
          Node v = _graph.target(e);
1788
          int vb = _blossom_set->find(v);
1789
          int vi = (*_node_index)[v];
1790

	
1791
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
1792
            dualScale * _weight[e];
1793

	
1794
          if ((*_blossom_data)[vb].status == EVEN) {
1795

	
1796
            int vt = _tree_set->find(vb);
1797

	
1798
            typename std::map<int, Arc>::iterator it =
1799
              (*_node_data)[ni].heap_index.find(vt);
1800

	
1801
            if (it != (*_node_data)[ni].heap_index.end()) {
1802
              if ((*_node_data)[ni].heap[it->second] > rw) {
1803
                (*_node_data)[ni].heap.replace(it->second, e);
1804
                (*_node_data)[ni].heap.decrease(e, rw);
1805
                it->second = e;
1806
              }
1807
            } else {
1808
              (*_node_data)[ni].heap.push(e, rw);
1809
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, e));
1810
            }
1811
          }
1812
        }
1813

	
1814
        if (!(*_node_data)[ni].heap.empty()) {
1815
          _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
1816
          _delta2->push(nb, _blossom_set->classPrio(nb));
1817
        }
1818
      }
1819
    }
1820

	
1767 1821
    /// \brief Start the algorithm
... ...
@@ -1770,3 +1824,4 @@
1770 1824
    ///
1771
    /// \pre \ref init() must be called before using this function.
1825
    /// \pre \ref init() or \ref fractionalInit() must be called
1826
    /// before using this function.
1772 1827
    void start() {
... ...
@@ -1776,4 +1831,3 @@
1776 1831

	
1777
      int unmatched = _node_num;
1778
      while (unmatched > 0) {
1832
      while (_unmatched > 0) {
1779 1833
        Value d1 = !_delta1->empty() ?
... ...
@@ -1790,8 +1844,7 @@
1790 1844

	
1791
        _delta_sum = d1; OpType ot = D1;
1845
        _delta_sum = d3; OpType ot = D3;
1846
        if (d1 < _delta_sum) { _delta_sum = d1; ot = D1; }
1792 1847
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
1793
        if (d3 < _delta_sum) { _delta_sum = d3; ot = D3; }
1794 1848
        if (d4 < _delta_sum) { _delta_sum = d4; ot = D4; }
1795 1849

	
1796

	
1797 1850
        switch (ot) {
... ...
@@ -1801,3 +1854,3 @@
1801 1854
            unmatchNode(n);
1802
            --unmatched;
1855
            --_unmatched;
1803 1856
          }
... ...
@@ -1808,4 +1861,9 @@
1808 1861
            Node n = _blossom_set->classTop(blossom);
1809
            Arc e = (*_node_data)[(*_node_index)[n]].heap.top();
1810
            extendOnArc(e);
1862
            Arc a = (*_node_data)[(*_node_index)[n]].heap.top();
1863
            if ((*_blossom_data)[blossom].next == INVALID) {
1864
              augmentOnArc(a);
1865
              --_unmatched;
1866
            } else {
1867
              extendOnArc(a);
1868
            }
1811 1869
          }
... ...
@@ -1822,16 +1880,4 @@
1822 1880
            } else {
1823
              int left_tree;
1824
              if ((*_blossom_data)[left_blossom].status == EVEN) {
1825
                left_tree = _tree_set->find(left_blossom);
1826
              } else {
1827
                left_tree = -1;
1828
                ++unmatched;
1829
              }
1830
              int right_tree;
1831
              if ((*_blossom_data)[right_blossom].status == EVEN) {
1832
                right_tree = _tree_set->find(right_blossom);
1833
              } else {
1834
                right_tree = -1;
1835
                ++unmatched;
1836
              }
1881
              int left_tree = _tree_set->find(left_blossom);
1882
              int right_tree = _tree_set->find(right_blossom);
1837 1883

	
... ...
@@ -1841,3 +1887,3 @@
1841 1887
                augmentOnEdge(e);
1842
                unmatched -= 2;
1888
                _unmatched -= 2;
1843 1889
              }
... ...
@@ -1859,3 +1905,3 @@
1859 1905
    /// \code
1860
    ///   mwm.init();
1906
    ///   mwm.fractionalInit();
1861 1907
    ///   mwm.start();
... ...
@@ -1863,3 +1909,3 @@
1863 1909
    void run() {
1864
      init();
1910
      fractionalInit();
1865 1911
      start();
... ...
@@ -1870,3 +1916,3 @@
1870 1916
    /// \name Primal Solution
1871
    /// Functions to get the primal solution, i.e. the maximum weighted 
1917
    /// Functions to get the primal solution, i.e. the maximum weighted
1872 1918
    /// matching.\n
... ...
@@ -1889,3 +1935,3 @@
1889 1935
      }
1890
      return sum /= 2;
1936
      return sum / 2;
1891 1937
    }
... ...
@@ -1909,3 +1955,3 @@
1909 1955
    ///
1910
    /// This function returns \c true if the given edge is in the found 
1956
    /// This function returns \c true if the given edge is in the found
1911 1957
    /// matching.
... ...
@@ -1920,3 +1966,3 @@
1920 1966
    /// This function returns the matching arc (or edge) incident to the
1921
    /// given node in the found matching or \c INVALID if the node is 
1967
    /// given node in the found matching or \c INVALID if the node is
1922 1968
    /// not covered by the matching.
... ...
@@ -1938,3 +1984,3 @@
1938 1984
    ///
1939
    /// This function returns the mate of the given node in the found 
1985
    /// This function returns the mate of the given node in the found
1940 1986
    /// matching or \c INVALID if the node is not covered by the matching.
... ...
@@ -1958,4 +2004,4 @@
1958 2004
    ///
1959
    /// This function returns the value of the dual solution. 
1960
    /// It should be equal to the primal value scaled by \ref dualScale 
2005
    /// This function returns the value of the dual solution.
2006
    /// It should be equal to the primal value scaled by \ref dualScale
1961 2007
    /// "dual scale".
... ...
@@ -2014,5 +2060,5 @@
2014 2060
    ///
2015
    /// This class provides an iterator for obtaining the nodes of the 
2061
    /// This class provides an iterator for obtaining the nodes of the
2016 2062
    /// given blossom. It lists a subset of the nodes.
2017
    /// Before using this iterator, you must allocate a 
2063
    /// Before using this iterator, you must allocate a
2018 2064
    /// MaxWeightedMatching class and execute it.
... ...
@@ -2025,4 +2071,4 @@
2025 2071
      ///
2026
      /// \pre Either \ref MaxWeightedMatching::run() "algorithm.run()" or 
2027
      /// \ref MaxWeightedMatching::start() "algorithm.start()" must be 
2072
      /// \pre Either \ref MaxWeightedMatching::run() "algorithm.run()" or
2073
      /// \ref MaxWeightedMatching::start() "algorithm.start()" must be
2028 2074
      /// called before initializing this iterator.
... ...
@@ -2079,4 +2125,4 @@
2079 2125
  ///
2080
  /// The maximum weighted perfect matching problem is to find a subset of 
2081
  /// the edges in an undirected graph with maximum overall weight for which 
2126
  /// The maximum weighted perfect matching problem is to find a subset of
2127
  /// the edges in an undirected graph with maximum overall weight for which
2082 2128
  /// each node has exactly one incident edge.
... ...
@@ -2103,7 +2149,7 @@
2103 2149
  ///
2104
  /// The algorithm can be executed with the run() function. 
2150
  /// The algorithm can be executed with the run() function.
2105 2151
  /// After it the matching (the primal solution) and the dual solution
2106
  /// can be obtained using the query functions and the 
2107
  /// \ref MaxWeightedPerfectMatching::BlossomIt "BlossomIt" nested class, 
2108
  /// which is able to iterate on the nodes of a blossom. 
2152
  /// can be obtained using the query functions and the
2153
  /// \ref MaxWeightedPerfectMatching::BlossomIt "BlossomIt" nested class,
2154
  /// which is able to iterate on the nodes of a blossom.
2109 2155
  /// If the value type is integer, then the dual solution is multiplied
... ...
@@ -2112,3 +2158,3 @@
2112 2158
  /// \tparam GR The undirected graph type the algorithm runs on.
2113
  /// \tparam WM The type edge weight map. The default type is 
2159
  /// \tparam WM The type edge weight map. The default type is
2114 2160
  /// \ref concepts::Graph::EdgeMap "GR::EdgeMap<int>".
... ...
@@ -2223,2 +2269,7 @@
2223 2269
    Value _delta_sum;
2270
    int _unmatched;
2271

	
2272
    typedef MaxWeightedPerfectFractionalMatching<Graph, WeightMap>
2273
    FractionalMatching;
2274
    FractionalMatching *_fractional;
2224 2275

	
... ...
@@ -2284,5 +2335,2 @@
2284 2335
    void destroyStructures() {
2285
      _node_num = countNodes(_graph);
2286
      _blossom_num = _node_num * 3 / 2;
2287

	
2288 2336
      if (_matching) {
... ...
@@ -2959,3 +3007,6 @@
2959 3007

	
2960
        _delta_sum() {}
3008
        _delta_sum(), _unmatched(0),
3009

	
3010
        _fractional(0)
3011
    {}
2961 3012

	
... ...
@@ -2963,2 +3014,5 @@
2963 3014
      destroyStructures();
3015
      if (_fractional) {
3016
        delete _fractional;
3017
      }
2964 3018
    }
... ...
@@ -2991,2 +3045,4 @@
2991 3045

	
3046
      _unmatched = _node_num;
3047

	
2992 3048
      _delta2->clear();
... ...
@@ -3032,2 +3088,145 @@
3032 3088

	
3089
    /// \brief Initialize the algorithm with fractional matching
3090
    ///
3091
    /// This function initializes the algorithm with a fractional
3092
    /// matching. This initialization is also called jumpstart heuristic.
3093
    void fractionalInit() {
3094
      createStructures();
3095

	
3096
      _blossom_node_list.clear();
3097
      _blossom_potential.clear();
3098

	
3099
      if (_fractional == 0) {
3100
        _fractional = new FractionalMatching(_graph, _weight, false);
3101
      }
3102
      if (!_fractional->run()) {
3103
        _unmatched = -1;
3104
        return;
3105
      }
3106

	
3107
      for (ArcIt e(_graph); e != INVALID; ++e) {
3108
        (*_node_heap_index)[e] = BinHeap<Value, IntArcMap>::PRE_HEAP;
3109
      }
3110
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3111
        (*_delta3_index)[e] = _delta3->PRE_HEAP;
3112
      }
3113
      for (int i = 0; i < _blossom_num; ++i) {
3114
        (*_delta2_index)[i] = _delta2->PRE_HEAP;
3115
        (*_delta4_index)[i] = _delta4->PRE_HEAP;
3116
      }
3117

	
3118
      _unmatched = 0;
3119

	
3120
      _delta2->clear();
3121
      _delta3->clear();
3122
      _delta4->clear();
3123
      _blossom_set->clear();
3124
      _tree_set->clear();
3125

	
3126
      int index = 0;
3127
      for (NodeIt n(_graph); n != INVALID; ++n) {
3128
        Value pot = _fractional->nodeValue(n);
3129
        (*_node_index)[n] = index;
3130
        (*_node_data)[index].pot = pot;
3131
        (*_node_data)[index].heap_index.clear();
3132
        (*_node_data)[index].heap.clear();
3133
        int blossom =
3134
          _blossom_set->insert(n, std::numeric_limits<Value>::max());
3135

	
3136
        (*_blossom_data)[blossom].status = MATCHED;
3137
        (*_blossom_data)[blossom].pred = INVALID;
3138
        (*_blossom_data)[blossom].next = _fractional->matching(n);
3139
        (*_blossom_data)[blossom].pot = 0;
3140
        (*_blossom_data)[blossom].offset = 0;
3141
        ++index;
3142
      }
3143

	
3144
      typename Graph::template NodeMap<bool> processed(_graph, false);
3145
      for (NodeIt n(_graph); n != INVALID; ++n) {
3146
        if (processed[n]) continue;
3147
        processed[n] = true;
3148
        if (_fractional->matching(n) == INVALID) continue;
3149
        int num = 1;
3150
        Node v = _graph.target(_fractional->matching(n));
3151
        while (n != v) {
3152
          processed[v] = true;
3153
          v = _graph.target(_fractional->matching(v));
3154
          ++num;
3155
        }
3156

	
3157
        if (num % 2 == 1) {
3158
          std::vector<int> subblossoms(num);
3159

	
3160
          subblossoms[--num] = _blossom_set->find(n);
3161
          v = _graph.target(_fractional->matching(n));
3162
          while (n != v) {
3163
            subblossoms[--num] = _blossom_set->find(v);
3164
            v = _graph.target(_fractional->matching(v));
3165
          }
3166

	
3167
          int surface =
3168
            _blossom_set->join(subblossoms.begin(), subblossoms.end());
3169
          (*_blossom_data)[surface].status = EVEN;
3170
          (*_blossom_data)[surface].pred = INVALID;
3171
          (*_blossom_data)[surface].next = INVALID;
3172
          (*_blossom_data)[surface].pot = 0;
3173
          (*_blossom_data)[surface].offset = 0;
3174

	
3175
          _tree_set->insert(surface);
3176
          ++_unmatched;
3177
        }
3178
      }
3179

	
3180
      for (EdgeIt e(_graph); e != INVALID; ++e) {
3181
        int si = (*_node_index)[_graph.u(e)];
3182
        int sb = _blossom_set->find(_graph.u(e));
3183
        int ti = (*_node_index)[_graph.v(e)];
3184
        int tb = _blossom_set->find(_graph.v(e));
3185
        if ((*_blossom_data)[sb].status == EVEN &&
3186
            (*_blossom_data)[tb].status == EVEN && sb != tb) {
3187
          _delta3->push(e, ((*_node_data)[si].pot + (*_node_data)[ti].pot -
3188
                            dualScale * _weight[e]) / 2);
3189
        }
3190
      }
3191

	
3192
      for (NodeIt n(_graph); n != INVALID; ++n) {
3193
        int nb = _blossom_set->find(n);
3194
        if ((*_blossom_data)[nb].status != MATCHED) continue;
3195
        int ni = (*_node_index)[n];
3196

	
3197
        for (OutArcIt e(_graph, n); e != INVALID; ++e) {
3198
          Node v = _graph.target(e);
3199
          int vb = _blossom_set->find(v);
3200
          int vi = (*_node_index)[v];
3201

	
3202
          Value rw = (*_node_data)[ni].pot + (*_node_data)[vi].pot -
3203
            dualScale * _weight[e];
3204

	
3205
          if ((*_blossom_data)[vb].status == EVEN) {
3206

	
3207
            int vt = _tree_set->find(vb);
3208

	
3209
            typename std::map<int, Arc>::iterator it =
3210
              (*_node_data)[ni].heap_index.find(vt);
3211

	
3212
            if (it != (*_node_data)[ni].heap_index.end()) {
3213
              if ((*_node_data)[ni].heap[it->second] > rw) {
3214
                (*_node_data)[ni].heap.replace(it->second, e);
3215
                (*_node_data)[ni].heap.decrease(e, rw);
3216
                it->second = e;
3217
              }
3218
            } else {
3219
              (*_node_data)[ni].heap.push(e, rw);
3220
              (*_node_data)[ni].heap_index.insert(std::make_pair(vt, e));
3221
            }
3222
          }
3223
        }
3224

	
3225
        if (!(*_node_data)[ni].heap.empty()) {
3226
          _blossom_set->decrease(n, (*_node_data)[ni].heap.prio());
3227
          _delta2->push(nb, _blossom_set->classPrio(nb));
3228
        }
3229
      }
3230
    }
3231

	
3033 3232
    /// \brief Start the algorithm
... ...
@@ -3036,3 +3235,4 @@
3036 3235
    ///
3037
    /// \pre \ref init() must be called before using this function.
3236
    /// \pre \ref init() or \ref fractionalInit() must be called before
3237
    /// using this function.
3038 3238
    bool start() {
... ...
@@ -3042,4 +3242,5 @@
3042 3242

	
3043
      int unmatched = _node_num;
3044
      while (unmatched > 0) {
3243
      if (_unmatched == -1) return false;
3244

	
3245
      while (_unmatched > 0) {
3045 3246
        Value d2 = !_delta2->empty() ?
... ...
@@ -3053,4 +3254,4 @@
3053 3254

	
3054
        _delta_sum = d2; OpType ot = D2;
3055
        if (d3 < _delta_sum) { _delta_sum = d3; ot = D3; }
3255
        _delta_sum = d3; OpType ot = D3;
3256
        if (d2 < _delta_sum) { _delta_sum = d2; ot = D2; }
3056 3257
        if (d4 < _delta_sum) { _delta_sum = d4; ot = D4; }
... ...
@@ -3087,3 +3288,3 @@
3087 3288
                augmentOnEdge(e);
3088
                unmatched -= 2;
3289
                _unmatched -= 2;
3089 3290
              }
... ...
@@ -3106,3 +3307,3 @@
3106 3307
    /// \code
3107
    ///   mwpm.init();
3308
    ///   mwpm.fractionalInit();
3108 3309
    ///   mwpm.start();
... ...
@@ -3110,3 +3311,3 @@
3110 3311
    bool run() {
3111
      init();
3312
      fractionalInit();
3112 3313
      return start();
... ...
@@ -3117,3 +3318,3 @@
3117 3318
    /// \name Primal Solution
3118
    /// Functions to get the primal solution, i.e. the maximum weighted 
3319
    /// Functions to get the primal solution, i.e. the maximum weighted
3119 3320
    /// perfect matching.\n
... ...
@@ -3136,3 +3337,3 @@
3136 3337
      }
3137
      return sum /= 2;
3338
      return sum / 2;
3138 3339
    }
... ...
@@ -3141,3 +3342,3 @@
3141 3342
    ///
3142
    /// This function returns \c true if the given edge is in the found 
3343
    /// This function returns \c true if the given edge is in the found
3143 3344
    /// matching.
... ...
@@ -3152,3 +3353,3 @@
3152 3353
    /// This function returns the matching arc (or edge) incident to the
3153
    /// given node in the found matching or \c INVALID if the node is 
3354
    /// given node in the found matching or \c INVALID if the node is
3154 3355
    /// not covered by the matching.
... ...
@@ -3170,3 +3371,3 @@
3170 3371
    ///
3171
    /// This function returns the mate of the given node in the found 
3372
    /// This function returns the mate of the given node in the found
3172 3373
    /// matching or \c INVALID if the node is not covered by the matching.
... ...
@@ -3189,4 +3390,4 @@
3189 3390
    ///
3190
    /// This function returns the value of the dual solution. 
3191
    /// It should be equal to the primal value scaled by \ref dualScale 
3391
    /// This function returns the value of the dual solution.
3392
    /// It should be equal to the primal value scaled by \ref dualScale
3192 3393
    /// "dual scale".
... ...
@@ -3245,5 +3446,5 @@
3245 3446
    ///
3246
    /// This class provides an iterator for obtaining the nodes of the 
3447
    /// This class provides an iterator for obtaining the nodes of the
3247 3448
    /// given blossom. It lists a subset of the nodes.
3248
    /// Before using this iterator, you must allocate a 
3449
    /// Before using this iterator, you must allocate a
3249 3450
    /// MaxWeightedPerfectMatching class and execute it.
... ...
@@ -3256,4 +3457,4 @@
3256 3457
      ///
3257
      /// \pre Either \ref MaxWeightedPerfectMatching::run() "algorithm.run()" 
3258
      /// or \ref MaxWeightedPerfectMatching::start() "algorithm.start()" 
3458
      /// \pre Either \ref MaxWeightedPerfectMatching::run() "algorithm.run()"
3459
      /// or \ref MaxWeightedPerfectMatching::start() "algorithm.start()"
3259 3460
      /// must be called before initializing this iterator.
... ...
@@ -3303,2 +3504,2 @@
3303 3504

	
3304
#endif //LEMON_MAX_MATCHING_H
3505
#endif //LEMON_MATCHING_H
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -58,3 +58,3 @@
58 58
  ///Check whether the parameter is NaN or not
59
  
59

	
60 60
  ///This function checks whether the parameter is NaN or not.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -114,6 +114,7 @@
114 114
  /// concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
115
  /// \param TR Traits class to set various data types used
116
  /// by the algorithm. The default traits class is
117
  /// \ref MinCostArborescenceDefaultTraits
115
  /// \tparam TR The traits class that defines various types used by the
116
  /// algorithm. By default, it is \ref MinCostArborescenceDefaultTraits
118 117
  /// "MinCostArborescenceDefaultTraits<GR, CM>".
118
  /// In most cases, this parameter should not be set directly,
119
  /// consider to use the named template parameters instead.
119 120
#ifndef DOXYGEN
... ...
@@ -124,3 +125,3 @@
124 125
#else
125
  template <typename GR, typename CM, typedef TR>
126
  template <typename GR, typename CM, typename TR>
126 127
#endif
... ...
@@ -129,4 +130,4 @@
129 130

	
130
    /// \brief The \ref MinCostArborescenceDefaultTraits "traits class" 
131
    /// of the algorithm. 
131
    /// \brief The \ref MinCostArborescenceDefaultTraits "traits class"
132
    /// of the algorithm.
132 133
    typedef TR Traits;
... ...
@@ -437,3 +438,3 @@
437 438
    /// \c PredMap type.
438
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept, 
439
    /// It must meet the \ref concepts::WriteMap "WriteMap" concept,
439 440
    /// and its value type must be the \c Arc type of the digraph.
... ...
@@ -490,4 +491,4 @@
490 491
    /// one of the member functions called \c run(...). \n
491
    /// If you need more control on the execution,
492
    /// first you must call \ref init(), then you can add several
492
    /// If you need better control on the execution,
493
    /// you have to call \ref init() first, then you can add several
493 494
    /// source nodes with \ref addSource().
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -42,11 +42,13 @@
42 42
  /// \ref NetworkSimplex implements the primal Network Simplex algorithm
43
  /// for finding a \ref min_cost_flow "minimum cost flow".
44
  /// This algorithm is a specialized version of the linear programming
45
  /// simplex method directly for the minimum cost flow problem.
46
  /// It is one of the most efficient solution methods.
43
  /// for finding a \ref min_cost_flow "minimum cost flow"
44
  /// \ref amo93networkflows, \ref dantzig63linearprog,
45
  /// \ref kellyoneill91netsimplex.
46
  /// This algorithm is a highly efficient specialized version of the
47
  /// linear programming simplex method directly for the minimum cost
48
  /// flow problem.
47 49
  ///
48
  /// In general this class is the fastest implementation available
49
  /// in LEMON for the minimum cost flow problem.
50
  /// Moreover it supports both directions of the supply/demand inequality
51
  /// constraints. For more information see \ref SupplyType.
50
  /// In general, %NetworkSimplex is the fastest implementation available
51
  /// in LEMON for this problem.
52
  /// Moreover, it supports both directions of the supply/demand inequality
53
  /// constraints. For more information, see \ref SupplyType.
52 54
  ///
... ...
@@ -58,8 +60,8 @@
58 60
  /// \tparam GR The digraph type the algorithm runs on.
59
  /// \tparam V The value type used for flow amounts, capacity bounds
60
  /// and supply values in the algorithm. By default it is \c int.
61
  /// \tparam C The value type used for costs and potentials in the
62
  /// algorithm. By default it is the same as \c V.
61
  /// \tparam V The number type used for flow amounts, capacity bounds
62
  /// and supply values in the algorithm. By default, it is \c int.
63
  /// \tparam C The number type used for costs and potentials in the
64
  /// algorithm. By default, it is the same as \c V.
63 65
  ///
64
  /// \warning Both value types must be signed and all input data must
66
  /// \warning Both number types must be signed and all input data must
65 67
  /// be integer.
... ...
@@ -68,3 +70,3 @@
68 70
  /// implementations, from which the most efficient one is used
69
  /// by default. For more information see \ref PivotRule.
71
  /// by default. For more information, see \ref PivotRule.
70 72
  template <typename GR, typename V = int, typename C = V>
... ...
@@ -97,3 +99,3 @@
97 99
    };
98
    
100

	
99 101
    /// \brief Constants for selecting the type of the supply constraints.
... ...
@@ -115,3 +117,3 @@
115 117
    };
116
    
118

	
117 119
    /// \brief Constants for selecting the pivot rule.
... ...
@@ -124,6 +126,6 @@
124 126
    /// of the algorithm.
125
    /// By default \ref BLOCK_SEARCH "Block Search" is used, which
127
    /// By default, \ref BLOCK_SEARCH "Block Search" is used, which
126 128
    /// proved to be the most efficient and the most robust on various
127
    /// test inputs according to our benchmark tests.
128
    /// However another pivot rule can be selected using the \ref run()
129
    /// test inputs.
130
    /// However, another pivot rule can be selected using the \ref run()
129 131
    /// function with the proper parameter.
... ...
@@ -131,3 +133,3 @@
131 133

	
132
      /// The First Eligible pivot rule.
134
      /// The \e First \e Eligible pivot rule.
133 135
      /// The next eligible arc is selected in a wraparound fashion
... ...
@@ -136,3 +138,3 @@
136 138

	
137
      /// The Best Eligible pivot rule.
139
      /// The \e Best \e Eligible pivot rule.
138 140
      /// The best eligible arc is selected in every iteration.
... ...
@@ -140,3 +142,3 @@
140 142

	
141
      /// The Block Search pivot rule.
143
      /// The \e Block \e Search pivot rule.
142 144
      /// A specified number of arcs are examined in every iteration
... ...
@@ -146,3 +148,3 @@
146 148

	
147
      /// The Candidate List pivot rule.
149
      /// The \e Candidate \e List pivot rule.
148 150
      /// In a major iteration a candidate list is built from eligible arcs
... ...
@@ -152,3 +154,3 @@
152 154

	
153
      /// The Altering Candidate List pivot rule.
155
      /// The \e Altering \e Candidate \e List pivot rule.
154 156
      /// It is a modified version of the Candidate List method.
... ...
@@ -158,3 +160,3 @@
158 160
    };
159
    
161

	
160 162
  private:
... ...
@@ -163,11 +165,10 @@
163 165

	
164
    typedef std::vector<Arc> ArcVector;
165
    typedef std::vector<Node> NodeVector;
166 166
    typedef std::vector<int> IntVector;
167
    typedef std::vector<bool> BoolVector;
168 167
    typedef std::vector<Value> ValueVector;
169 168
    typedef std::vector<Cost> CostVector;
169
    typedef std::vector<char> BoolVector;
170
    // Note: vector<char> is used instead of vector<bool> for efficiency reasons
170 171

	
171 172
    // State constants for arcs
172
    enum ArcStateEnum {
173
    enum ArcState {
173 174
      STATE_UPPER = -1,
... ...
@@ -177,2 +178,6 @@
177 178

	
179
    typedef std::vector<signed char> StateVector;
180
    // Note: vector<signed char> is used instead of vector<ArcState> for
181
    // efficiency reasons
182

	
178 183
  private:
... ...
@@ -196,2 +201,3 @@
196 201
    IntVector _target;
202
    bool _arc_mixing;
197 203

	
... ...
@@ -215,3 +221,3 @@
215 221
    BoolVector _forward;
216
    IntVector _state;
222
    StateVector _state;
217 223
    int _root;
... ...
@@ -224,4 +230,6 @@
224 230

	
231
    const Value MAX;
232

	
225 233
  public:
226
  
234

	
227 235
    /// \brief Constant for infinite upper bounds (capacities).
... ...
@@ -244,3 +252,3 @@
244 252
      const CostVector &_cost;
245
      const IntVector  &_state;
253
      const StateVector &_state;
246 254
      const CostVector &_pi;
... ...
@@ -265,3 +273,3 @@
265 273
        Cost c;
266
        for (int e = _next_arc; e < _search_arc_num; ++e) {
274
        for (int e = _next_arc; e != _search_arc_num; ++e) {
267 275
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
... ...
@@ -273,3 +281,3 @@
273 281
        }
274
        for (int e = 0; e < _next_arc; ++e) {
282
        for (int e = 0; e != _next_arc; ++e) {
275 283
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
... ...
@@ -296,3 +304,3 @@
296 304
      const CostVector &_cost;
297
      const IntVector  &_state;
305
      const StateVector &_state;
298 306
      const CostVector &_pi;
... ...
@@ -313,3 +321,3 @@
313 321
        Cost c, min = 0;
314
        for (int e = 0; e < _search_arc_num; ++e) {
322
        for (int e = 0; e != _search_arc_num; ++e) {
315 323
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
... ...
@@ -335,3 +343,3 @@
335 343
      const CostVector &_cost;
336
      const IntVector  &_state;
344
      const StateVector &_state;
337 345
      const CostVector &_pi;
... ...
@@ -354,3 +362,3 @@
354 362
        // The main parameters of the pivot rule
355
        const double BLOCK_SIZE_FACTOR = 0.5;
363
        const double BLOCK_SIZE_FACTOR = 1.0;
356 364
        const int MIN_BLOCK_SIZE = 10;
... ...
@@ -366,4 +374,4 @@
366 374
        int cnt = _block_size;
367
        int e, min_arc = _next_arc;
368
        for (e = _next_arc; e < _search_arc_num; ++e) {
375
        int e;
376
        for (e = _next_arc; e != _search_arc_num; ++e) {
369 377
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
... ...
@@ -371,6 +379,6 @@
371 379
            min = c;
372
            min_arc = e;
380
            _in_arc = e;
373 381
          }
374 382
          if (--cnt == 0) {
375
            if (min < 0) break;
383
            if (min < 0) goto search_end;
376 384
            cnt = _block_size;
... ...
@@ -378,13 +386,11 @@
378 386
        }
379
        if (min == 0 || cnt > 0) {
380
          for (e = 0; e < _next_arc; ++e) {
381
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
382
            if (c < min) {
383
              min = c;
384
              min_arc = e;
385
            }
386
            if (--cnt == 0) {
387
              if (min < 0) break;
388
              cnt = _block_size;
389
            }
387
        for (e = 0; e != _next_arc; ++e) {
388
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
389
          if (c < min) {
390
            min = c;
391
            _in_arc = e;
392
          }
393
          if (--cnt == 0) {
394
            if (min < 0) goto search_end;
395
            cnt = _block_size;
390 396
          }
... ...
@@ -392,3 +398,4 @@
392 398
        if (min >= 0) return false;
393
        _in_arc = min_arc;
399

	
400
      search_end:
394 401
        _next_arc = e;
... ...
@@ -409,3 +416,3 @@
409 416
      const CostVector &_cost;
410
      const IntVector  &_state;
417
      const StateVector &_state;
411 418
      const CostVector &_pi;
... ...
@@ -430,3 +437,3 @@
430 437
        // The main parameters of the pivot rule
431
        const double LIST_LENGTH_FACTOR = 1.0;
438
        const double LIST_LENGTH_FACTOR = 0.25;
432 439
        const int MIN_LIST_LENGTH = 10;
... ...
@@ -447,3 +454,3 @@
447 454
        Cost min, c;
448
        int e, min_arc = _next_arc;
455
        int e;
449 456
        if (_curr_length > 0 && _minor_count < _minor_limit) {
... ...
@@ -458,5 +465,5 @@
458 465
              min = c;
459
              min_arc = e;
466
              _in_arc = e;
460 467
            }
461
            if (c >= 0) {
468
            else if (c >= 0) {
462 469
              _candidates[i--] = _candidates[--_curr_length];
... ...
@@ -464,6 +471,3 @@
464 471
          }
465
          if (min < 0) {
466
            _in_arc = min_arc;
467
            return true;
468
          }
472
          if (min < 0) return true;
469 473
        }
... ...
@@ -473,3 +477,3 @@
473 477
        _curr_length = 0;
474
        for (e = _next_arc; e < _search_arc_num; ++e) {
478
        for (e = _next_arc; e != _search_arc_num; ++e) {
475 479
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
... ...
@@ -479,18 +483,16 @@
479 483
              min = c;
480
              min_arc = e;
484
              _in_arc = e;
481 485
            }
482
            if (_curr_length == _list_length) break;
486
            if (_curr_length == _list_length) goto search_end;
483 487
          }
484 488
        }
485
        if (_curr_length < _list_length) {
486
          for (e = 0; e < _next_arc; ++e) {
487
            c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
488
            if (c < 0) {
489
              _candidates[_curr_length++] = e;
490
              if (c < min) {
491
                min = c;
492
                min_arc = e;
493
              }
494
              if (_curr_length == _list_length) break;
489
        for (e = 0; e != _next_arc; ++e) {
490
          c = _state[e] * (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
491
          if (c < 0) {
492
            _candidates[_curr_length++] = e;
493
            if (c < min) {
494
              min = c;
495
              _in_arc = e;
495 496
            }
497
            if (_curr_length == _list_length) goto search_end;
496 498
          }
... ...
@@ -498,4 +500,5 @@
498 500
        if (_curr_length == 0) return false;
501

	
502
      search_end:
499 503
        _minor_count = 1;
500
        _in_arc = min_arc;
501 504
        _next_arc = e;
... ...
@@ -516,3 +519,3 @@
516 519
      const CostVector &_cost;
517
      const IntVector  &_state;
520
      const StateVector &_state;
518 521
      const CostVector &_pi;
... ...
@@ -551,3 +554,3 @@
551 554
        // The main parameters of the pivot rule
552
        const double BLOCK_SIZE_FACTOR = 1.5;
555
        const double BLOCK_SIZE_FACTOR = 1.0;
553 556
        const int MIN_BLOCK_SIZE = 10;
... ...
@@ -569,3 +572,3 @@
569 572
        int e;
570
        for (int i = 0; i < _curr_length; ++i) {
573
        for (int i = 0; i != _curr_length; ++i) {
571 574
          e = _candidates[i];
... ...
@@ -580,6 +583,5 @@
580 583
        int cnt = _block_size;
581
        int last_arc = 0;
582 584
        int limit = _head_length;
583 585

	
584
        for (int e = _next_arc; e < _search_arc_num; ++e) {
586
        for (e = _next_arc; e != _search_arc_num; ++e) {
585 587
          _cand_cost[e] = _state[e] *
... ...
@@ -588,6 +590,5 @@
588 590
            _candidates[_curr_length++] = e;
589
            last_arc = e;
590 591
          }
591 592
          if (--cnt == 0) {
592
            if (_curr_length > limit) break;
593
            if (_curr_length > limit) goto search_end;
593 594
            limit = 0;
... ...
@@ -596,15 +597,12 @@
596 597
        }
597
        if (_curr_length <= limit) {
598
          for (int e = 0; e < _next_arc; ++e) {
599
            _cand_cost[e] = _state[e] *
600
              (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
601
            if (_cand_cost[e] < 0) {
602
              _candidates[_curr_length++] = e;
603
              last_arc = e;
604
            }
605
            if (--cnt == 0) {
606
              if (_curr_length > limit) break;
607
              limit = 0;
608
              cnt = _block_size;
609
            }
598
        for (e = 0; e != _next_arc; ++e) {
599
          _cand_cost[e] = _state[e] *
600
            (_cost[e] + _pi[_source[e]] - _pi[_target[e]]);
601
          if (_cand_cost[e] < 0) {
602
            _candidates[_curr_length++] = e;
603
          }
604
          if (--cnt == 0) {
605
            if (_curr_length > limit) goto search_end;
606
            limit = 0;
607
            cnt = _block_size;
610 608
          }
... ...
@@ -612,3 +610,4 @@
612 610
        if (_curr_length == 0) return false;
613
        _next_arc = last_arc + 1;
611

	
612
      search_end:
614 613

	
... ...
@@ -620,2 +619,3 @@
620 619
        _in_arc = _candidates[0];
620
        _next_arc = e;
621 621
        pop_heap( _candidates.begin(), _candidates.begin() + _curr_length,
... ...
@@ -635,9 +635,14 @@
635 635
    /// \param graph The digraph the algorithm runs on.
636
    NetworkSimplex(const GR& graph) :
636
    /// \param arc_mixing Indicate if the arcs have to be stored in a
637
    /// mixed order in the internal data structure.
638
    /// In special cases, it could lead to better overall performance,
639
    /// but it is usually slower. Therefore it is disabled by default.
640
    NetworkSimplex(const GR& graph, bool arc_mixing = false) :
637 641
      _graph(graph), _node_id(graph), _arc_id(graph),
642
      _arc_mixing(arc_mixing),
643
      MAX(std::numeric_limits<Value>::max()),
638 644
      INF(std::numeric_limits<Value>::has_infinity ?
639
          std::numeric_limits<Value>::infinity() :
640
          std::numeric_limits<Value>::max())
645
          std::numeric_limits<Value>::infinity() : MAX)
641 646
    {
642
      // Check the value types
647
      // Check the number types
643 648
      LEMON_ASSERT(std::numeric_limits<Value>::is_signed,
... ...
@@ -646,54 +651,5 @@
646 651
        "The cost type of NetworkSimplex must be signed");
647
        
648
      // Resize vectors
649
      _node_num = countNodes(_graph);
650
      _arc_num = countArcs(_graph);
651
      int all_node_num = _node_num + 1;
652
      int max_arc_num = _arc_num + 2 * _node_num;
653 652

	
654
      _source.resize(max_arc_num);
655
      _target.resize(max_arc_num);
656

	
657
      _lower.resize(_arc_num);
658
      _upper.resize(_arc_num);
659
      _cap.resize(max_arc_num);
660
      _cost.resize(max_arc_num);
661
      _supply.resize(all_node_num);
662
      _flow.resize(max_arc_num);
663
      _pi.resize(all_node_num);
664

	
665
      _parent.resize(all_node_num);
666
      _pred.resize(all_node_num);
667
      _forward.resize(all_node_num);
668
      _thread.resize(all_node_num);
669
      _rev_thread.resize(all_node_num);
670
      _succ_num.resize(all_node_num);
671
      _last_succ.resize(all_node_num);
672
      _state.resize(max_arc_num);
673

	
674
      // Copy the graph (store the arcs in a mixed order)
675
      int i = 0;
676
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
677
        _node_id[n] = i;
678
      }
679
      int k = std::max(int(std::sqrt(double(_arc_num))), 10);
680
      i = 0;
681
      for (ArcIt a(_graph); a != INVALID; ++a) {
682
        _arc_id[a] = i;
683
        _source[i] = _node_id[_graph.source(a)];
684
        _target[i] = _node_id[_graph.target(a)];
685
        if ((i += k) >= _arc_num) i = (i % k) + 1;
686
      }
687
      
688
      // Initialize maps
689
      for (int i = 0; i != _node_num; ++i) {
690
        _supply[i] = 0;
691
      }
692
      for (int i = 0; i != _arc_num; ++i) {
693
        _lower[i] = 0;
694
        _upper[i] = INF;
695
        _cost[i] = 1;
696
      }
697
      _have_lower = false;
698
      _stype = GEQ;
653
      // Reset data structures
654
      reset();
699 655
    }
... ...
@@ -731,3 +687,3 @@
731 687
    /// will be set to \ref INF on all arcs (i.e. the flow value will be
732
    /// unbounded from above on each arc).
688
    /// unbounded from above).
733 689
    ///
... ...
@@ -770,3 +726,2 @@
770 726
    /// calling \ref run(), the supply of each node will be set to zero.
771
    /// (It makes sense only if non-zero lower bounds are given.)
772 727
    ///
... ...
@@ -791,3 +746,2 @@
791 746
    /// calling \ref run(), the supply of each node will be set to zero.
792
    /// (It makes sense only if non-zero lower bounds are given.)
793 747
    ///
... ...
@@ -811,3 +765,3 @@
811 765
    }
812
    
766

	
813 767
    /// \brief Set the type of the supply constraints.
... ...
@@ -818,3 +772,3 @@
818 772
    ///
819
    /// For more information see \ref SupplyType.
773
    /// For more information, see \ref SupplyType.
820 774
    ///
... ...
@@ -837,3 +791,3 @@
837 791
    /// The paramters can be specified using functions \ref lowerMap(),
838
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(), 
792
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
839 793
    /// \ref supplyType().
... ...
@@ -846,11 +800,11 @@
846 800
    ///
847
    /// This function can be called more than once. All the parameters
848
    /// that have been given are kept for the next call, unless
849
    /// \ref reset() is called, thus only the modified parameters
850
    /// have to be set again. See \ref reset() for examples.
851
    /// However the underlying digraph must not be modified after this
852
    /// class have been constructed, since it copies and extends the graph.
801
    /// This function can be called more than once. All the given parameters
802
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
803
    /// is used, thus only the modified parameters have to be set again.
804
    /// If the underlying digraph was also modified after the construction
805
    /// of the class (or the last \ref reset() call), then the \ref reset()
806
    /// function must be called.
853 807
    ///
854 808
    /// \param pivot_rule The pivot rule that will be used during the
855
    /// algorithm. For more information see \ref PivotRule.
809
    /// algorithm. For more information, see \ref PivotRule.
856 810
    ///
... ...
@@ -865,2 +819,3 @@
865 819
    /// \see ProblemType, PivotRule
820
    /// \see resetParams(), reset()
866 821
    ProblemType run(PivotRule pivot_rule = BLOCK_SEARCH) {
... ...
@@ -876,7 +831,8 @@
876 831
    ///
877
    /// It is useful for multiple run() calls. If this function is not
878
    /// used, all the parameters given before are kept for the next
879
    /// \ref run() call.
880
    /// However the underlying digraph must not be modified after this
881
    /// class have been constructed, since it copies and extends the graph.
832
    /// It is useful for multiple \ref run() calls. Basically, all the given
833
    /// parameters are kept for the next \ref run() call, unless
834
    /// \ref resetParams() or \ref reset() is used.
835
    /// If the underlying digraph was also modified after the construction
836
    /// of the class or the last \ref reset() call, then the \ref reset()
837
    /// function must be used, otherwise \ref resetParams() is sufficient.
882 838
    ///
... ...
@@ -890,3 +846,3 @@
890 846
    ///
891
    ///   // Run again with modified cost map (reset() is not called,
847
    ///   // Run again with modified cost map (resetParams() is not called,
892 848
    ///   // so only the cost map have to be set again)
... ...
@@ -895,5 +851,5 @@
895 851
    ///
896
    ///   // Run again from scratch using reset()
852
    ///   // Run again from scratch using resetParams()
897 853
    ///   // (the lower bounds will be set to zero on all arcs)
898
    ///   ns.reset();
854
    ///   ns.resetParams();
899 855
    ///   ns.upperMap(capacity).costMap(cost)
... ...
@@ -903,3 +859,5 @@
903 859
    /// \return <tt>(*this)</tt>
904
    NetworkSimplex& reset() {
860
    ///
861
    /// \see reset(), run()
862
    NetworkSimplex& resetParams() {
905 863
      for (int i = 0; i != _node_num; ++i) {
... ...
@@ -917,2 +875,79 @@
917 875

	
876
    /// \brief Reset the internal data structures and all the parameters
877
    /// that have been given before.
878
    ///
879
    /// This function resets the internal data structures and all the
880
    /// paramaters that have been given before using functions \ref lowerMap(),
881
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
882
    /// \ref supplyType().
883
    ///
884
    /// It is useful for multiple \ref run() calls. Basically, all the given
885
    /// parameters are kept for the next \ref run() call, unless
886
    /// \ref resetParams() or \ref reset() is used.
887
    /// If the underlying digraph was also modified after the construction
888
    /// of the class or the last \ref reset() call, then the \ref reset()
889
    /// function must be used, otherwise \ref resetParams() is sufficient.
890
    ///
891
    /// See \ref resetParams() for examples.
892
    ///
893
    /// \return <tt>(*this)</tt>
894
    ///
895
    /// \see resetParams(), run()
896
    NetworkSimplex& reset() {
897
      // Resize vectors
898
      _node_num = countNodes(_graph);
899
      _arc_num = countArcs(_graph);
900
      int all_node_num = _node_num + 1;
901
      int max_arc_num = _arc_num + 2 * _node_num;
902

	
903
      _source.resize(max_arc_num);
904
      _target.resize(max_arc_num);
905

	
906
      _lower.resize(_arc_num);
907
      _upper.resize(_arc_num);
908
      _cap.resize(max_arc_num);
909
      _cost.resize(max_arc_num);
910
      _supply.resize(all_node_num);
911
      _flow.resize(max_arc_num);
912
      _pi.resize(all_node_num);
913

	
914
      _parent.resize(all_node_num);
915
      _pred.resize(all_node_num);
916
      _forward.resize(all_node_num);
917
      _thread.resize(all_node_num);
918
      _rev_thread.resize(all_node_num);
919
      _succ_num.resize(all_node_num);
920
      _last_succ.resize(all_node_num);
921
      _state.resize(max_arc_num);
922

	
923
      // Copy the graph
924
      int i = 0;
925
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
926
        _node_id[n] = i;
927
      }
928
      if (_arc_mixing) {
929
        // Store the arcs in a mixed order
930
        int k = std::max(int(std::sqrt(double(_arc_num))), 10);
931
        int i = 0, j = 0;
932
        for (ArcIt a(_graph); a != INVALID; ++a) {
933
          _arc_id[a] = i;
934
          _source[i] = _node_id[_graph.source(a)];
935
          _target[i] = _node_id[_graph.target(a)];
936
          if ((i += k) >= _arc_num) i = ++j;
937
        }
938
      } else {
939
        // Store the arcs in the original order
940
        int i = 0;
941
        for (ArcIt a(_graph); a != INVALID; ++a, ++i) {
942
          _arc_id[a] = i;
943
          _source[i] = _node_id[_graph.source(a)];
944
          _target[i] = _node_id[_graph.target(a)];
945
        }
946
      }
947

	
948
      // Reset parameters
949
      resetParams();
950
      return *this;
951
    }
952

	
918 953
    /// @}
... ...
@@ -1026,5 +1061,5 @@
1026 1061
          if (c >= 0) {
1027
            _cap[i] = _upper[i] < INF ? _upper[i] - c : INF;
1062
            _cap[i] = _upper[i] < MAX ? _upper[i] - c : INF;
1028 1063
          } else {
1029
            _cap[i] = _upper[i] < INF + c ? _upper[i] - c : INF;
1064
            _cap[i] = _upper[i] < MAX + c ? _upper[i] - c : INF;
1030 1065
          }
... ...
@@ -1056,3 +1091,3 @@
1056 1091
      }
1057
      
1092

	
1058 1093
      // Set data for the artificial root node
... ...
@@ -1220,3 +1255,3 @@
1220 1255
        d = _forward[u] ?
1221
          _flow[e] : (_cap[e] == INF ? INF : _cap[e] - _flow[e]);
1256
          _flow[e] : (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]);
1222 1257
        if (d < delta) {
... ...
@@ -1230,4 +1265,4 @@
1230 1265
        e = _pred[u];
1231
        d = _forward[u] ? 
1232
          (_cap[e] == INF ? INF : _cap[e] - _flow[e]) : _flow[e];
1266
        d = _forward[u] ?
1267
          (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]) : _flow[e];
1233 1268
        if (d <= delta) {
... ...
@@ -1332,3 +1367,3 @@
1332 1367
      // Update _rev_thread using the new _thread values
1333
      for (int i = 0; i < int(_dirty_revs.size()); ++i) {
1368
      for (int i = 0; i != int(_dirty_revs.size()); ++i) {
1334 1369
        u = _dirty_revs[i];
... ...
@@ -1404,2 +1439,96 @@
1404 1439

	
1440
    // Heuristic initial pivots
1441
    bool initialPivots() {
1442
      Value curr, total = 0;
1443
      std::vector<Node> supply_nodes, demand_nodes;
1444
      for (NodeIt u(_graph); u != INVALID; ++u) {
1445
        curr = _supply[_node_id[u]];
1446
        if (curr > 0) {
1447
          total += curr;
1448
          supply_nodes.push_back(u);
1449
        }
1450
        else if (curr < 0) {
1451
          demand_nodes.push_back(u);
1452
        }
1453
      }
1454
      if (_sum_supply > 0) total -= _sum_supply;
1455
      if (total <= 0) return true;
1456

	
1457
      IntVector arc_vector;
1458
      if (_sum_supply >= 0) {
1459
        if (supply_nodes.size() == 1 && demand_nodes.size() == 1) {
1460
          // Perform a reverse graph search from the sink to the source
1461
          typename GR::template NodeMap<bool> reached(_graph, false);
1462
          Node s = supply_nodes[0], t = demand_nodes[0];
1463
          std::vector<Node> stack;
1464
          reached[t] = true;
1465
          stack.push_back(t);
1466
          while (!stack.empty()) {
1467
            Node u, v = stack.back();
1468
            stack.pop_back();
1469
            if (v == s) break;
1470
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1471
              if (reached[u = _graph.source(a)]) continue;
1472
              int j = _arc_id[a];
1473
              if (_cap[j] >= total) {
1474
                arc_vector.push_back(j);
1475
                reached[u] = true;
1476
                stack.push_back(u);
1477
              }
1478
            }
1479
          }
1480
        } else {
1481
          // Find the min. cost incomming arc for each demand node
1482
          for (int i = 0; i != int(demand_nodes.size()); ++i) {
1483
            Node v = demand_nodes[i];
1484
            Cost c, min_cost = std::numeric_limits<Cost>::max();
1485
            Arc min_arc = INVALID;
1486
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1487
              c = _cost[_arc_id[a]];
1488
              if (c < min_cost) {
1489
                min_cost = c;
1490
                min_arc = a;
1491
              }
1492
            }
1493
            if (min_arc != INVALID) {
1494
              arc_vector.push_back(_arc_id[min_arc]);
1495
            }
1496
          }
1497
        }
1498
      } else {
1499
        // Find the min. cost outgoing arc for each supply node
1500
        for (int i = 0; i != int(supply_nodes.size()); ++i) {
1501
          Node u = supply_nodes[i];
1502
          Cost c, min_cost = std::numeric_limits<Cost>::max();
1503
          Arc min_arc = INVALID;
1504
          for (OutArcIt a(_graph, u); a != INVALID; ++a) {
1505
            c = _cost[_arc_id[a]];
1506
            if (c < min_cost) {
1507
              min_cost = c;
1508
              min_arc = a;
1509
            }
1510
          }
1511
          if (min_arc != INVALID) {
1512
            arc_vector.push_back(_arc_id[min_arc]);
1513
          }
1514
        }
1515
      }
1516

	
1517
      // Perform heuristic initial pivots
1518
      for (int i = 0; i != int(arc_vector.size()); ++i) {
1519
        in_arc = arc_vector[i];
1520
        if (_state[in_arc] * (_cost[in_arc] + _pi[_source[in_arc]] -
1521
            _pi[_target[in_arc]]) >= 0) continue;
1522
        findJoinNode();
1523
        bool change = findLeavingArc();
1524
        if (delta >= MAX) return false;
1525
        changeFlow(change);
1526
        if (change) {
1527
          updateTreeStructure();
1528
          updatePotential();
1529
        }
1530
      }
1531
      return true;
1532
    }
1533

	
1405 1534
    // Execute the algorithm
... ...
@@ -1426,2 +1555,5 @@
1426 1555

	
1556
      // Perform heuristic initial pivots
1557
      if (!initialPivots()) return UNBOUNDED;
1558

	
1427 1559
      // Execute the Network Simplex algorithm
... ...
@@ -1430,3 +1562,3 @@
1430 1562
        bool change = findLeavingArc();
1431
        if (delta >= INF) return UNBOUNDED;
1563
        if (delta >= MAX) return UNBOUNDED;
1432 1564
        changeFlow(change);
... ...
@@ -1437,3 +1569,3 @@
1437 1569
      }
1438
      
1570

	
1439 1571
      // Check feasibility
... ...
@@ -1454,3 +1586,3 @@
1454 1586
      }
1455
      
1587

	
1456 1588
      // Shift potentials to meet the requirements of the GEQ/LEQ type
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -968,3 +968,3 @@
968 968

	
969
    
969

	
970 970
    template <typename From, typename To,
... ...
@@ -974,3 +974,3 @@
974 974
        PathCopySelectorForward<From, To>::copy(from, to);
975
      }      
975
      }
976 976
    };
... ...
@@ -981,3 +981,3 @@
981 981
        PathCopySelectorBackward<From, To>::copy(from, to);
982
      }      
982
      }
983 983
    };
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -54,3 +54,7 @@
54 54
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
55
#ifdef DOXYGEN
56
    typedef GR::ArcMap<Value> FlowMap;
57
#else
55 58
    typedef typename Digraph::template ArcMap<Value> FlowMap;
59
#endif
56 60

	
... ...
@@ -69,5 +73,8 @@
69 73
    ///
70
    /// \sa Elevator
71
    /// \sa LinkedElevator
72
    typedef LinkedElevator<Digraph, typename Digraph::Node> Elevator;
74
    /// \sa Elevator, LinkedElevator
75
#ifdef DOXYGEN
76
    typedef lemon::Elevator<GR, GR::Node> Elevator;
77
#else
78
    typedef lemon::Elevator<Digraph, typename Digraph::Node> Elevator;
79
#endif
73 80

	
... ...
@@ -97,5 +104,6 @@
97 104
  /// \e push-relabel algorithm producing a \ref max_flow
98
  /// "flow of maximum value" in a digraph.
105
  /// "flow of maximum value" in a digraph \ref clrs01algorithms,
106
  /// \ref amo93networkflows, \ref goldberg88newapproach.
99 107
  /// The preflow algorithms are the fastest known maximum
100
  /// flow algorithms. The current implementation use a mixture of the
108
  /// flow algorithms. The current implementation uses a mixture of the
101 109
  /// \e "highest label" and the \e "bound decrease" heuristics.
... ...
@@ -107,2 +115,5 @@
107 115
  ///
116
  /// \warning This implementation cannot handle infinite or very large
117
  /// capacities (e.g. the maximum value of \c CAP::Value).
118
  ///
108 119
  /// \tparam GR The type of the digraph the algorithm runs on.
... ...
@@ -110,2 +121,7 @@
110 121
  /// type is \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
122
  /// \tparam TR The traits class that defines various types used by the
123
  /// algorithm. By default, it is \ref PreflowDefaultTraits
124
  /// "PreflowDefaultTraits<GR, CAP>".
125
  /// In most cases, this parameter should not be set directly,
126
  /// consider to use the named template parameters instead.
111 127
#ifdef DOXYGEN
... ...
@@ -259,3 +275,3 @@
259 275
    /// digraph and the maximum level should be passed to it).
260
    /// However an external elevator object could also be passed to the
276
    /// However, an external elevator object could also be passed to the
261 277
    /// algorithm with the \ref elevator(Elevator&) "elevator()" function
... ...
@@ -373,5 +389,6 @@
373 389

	
374
    /// \brief Sets the tolerance used by algorithm.
390
    /// \brief Sets the tolerance used by the algorithm.
375 391
    ///
376
    /// Sets the tolerance used by algorithm.
392
    /// Sets the tolerance object used by the algorithm.
393
    /// \return <tt>(*this)</tt>
377 394
    Preflow& tolerance(const Tolerance& tolerance) {
... ...
@@ -383,3 +400,4 @@
383 400
    ///
384
    /// Returns a const reference to the tolerance.
401
    /// Returns a const reference to the tolerance object used by
402
    /// the algorithm.
385 403
    const Tolerance& tolerance() const {
... ...
@@ -391,4 +409,4 @@
391 409
    /// \ref run() or \ref runMinCut().\n
392
    /// If you need more control on the initial solution or the execution,
393
    /// first you have to call one of the \ref init() functions, then
410
    /// If you need better control on the initial solution or the execution,
411
    /// you have to call one of the \ref init() functions first, then
394 412
    /// \ref startFirstPhase() and if you need it \ref startSecondPhase().
Ignore white space 6 line context
... ...
@@ -21,5 +21,5 @@
21 21

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

	
... ...
@@ -31,19 +31,14 @@
31 31

	
32
  /// \ingroup auxdata
32
  /// \ingroup heaps
33 33
  ///
34
  /// \brief A Radix Heap implementation.
34
  /// \brief Radix heap data structure.
35 35
  ///
36
  /// This class implements the \e radix \e heap data structure. A \e heap
37
  /// is a data structure for storing items with specified values called \e
38
  /// priorities in such a way that finding the item with minimum priority is
39
  /// efficient. This heap type can store only items with \e int priority.
40
  /// In a heap one can change the priority of an item, add or erase an
41
  /// item, but the priority cannot be decreased under the last removed
42
  /// item's priority.
36
  /// This class implements the \e radix \e heap data structure.
37
  /// It practically conforms to the \ref concepts::Heap "heap concept",
38
  /// but it has some limitations due its special implementation.
39
  /// The type of the priorities must be \c int and the priority of an
40
  /// item cannot be decreased under the priority of the last removed item.
43 41
  ///
44
  /// \param IM A read and writable Item int map, used internally
45
  /// to handle the cross references.
46
  ///
47
  /// \see BinHeap
48
  /// \see Dijkstra
42
  /// \tparam IM A read-writable item map with \c int values, used
43
  /// internally to handle the cross references.
49 44
  template <typename IM>
... ...
@@ -52,5 +47,9 @@
52 47
  public:
53
    typedef typename IM::Key Item;
48

	
49
    /// Type of the item-int map.
50
    typedef IM ItemIntMap;
51
    /// Type of the priorities.
54 52
    typedef int Prio;
55
    typedef IM ItemIntMap;
53
    /// Type of the items stored in the heap.
54
    typedef typename ItemIntMap::Key Item;
56 55

	
... ...
@@ -58,10 +57,9 @@
58 57
    ///
59
    /// This Exception is thrown when a smaller priority
60
    /// is inserted into the \e RadixHeap then the last time erased.
58
    /// This exception is thrown when an item is inserted into a
59
    /// RadixHeap with a priority smaller than the last erased one.
61 60
    /// \see RadixHeap
62

	
63
    class UnderFlowPriorityError : public Exception {
61
    class PriorityUnderflowError : public Exception {
64 62
    public:
65 63
      virtual const char* what() const throw() {
66
        return "lemon::RadixHeap::UnderFlowPriorityError";
64
        return "lemon::RadixHeap::PriorityUnderflowError";
67 65
      }
... ...
@@ -69,14 +67,14 @@
69 67

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

	
99
    std::vector<RadixItem> data;
100
    std::vector<RadixBox> boxes;
97
    std::vector<RadixItem> _data;
98
    std::vector<RadixBox> _boxes;
101 99

	
... ...
@@ -103,19 +101,18 @@
103 101

	
102
  public:
104 103

	
105
  public:
106
    /// \brief The constructor.
104
    /// \brief Constructor.
107 105
    ///
108
    /// The constructor.
109
    ///
110
    /// \param map It 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.
113
    ///
114
    /// \param minimal The initial minimal value of the heap.
115
    /// \param capacity It determines the initial capacity of the heap.
116
    RadixHeap(ItemIntMap &map, int minimal = 0, int capacity = 0)
117
      : _iim(map) {
118
      boxes.push_back(RadixBox(minimal, 1));
119
      boxes.push_back(RadixBox(minimal + 1, 1));
120
      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
106
    /// Constructor.
107
    /// \param map A map that assigns \c int values to the items.
108
    /// It is used internally to handle the cross references.
109
    /// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.
110
    /// \param minimum The initial minimum value of the heap.
111
    /// \param capacity The initial capacity of the heap.
112
    RadixHeap(ItemIntMap &map, int minimum = 0, int capacity = 0)
113
      : _iim(map)
114
    {
115
      _boxes.push_back(RadixBox(minimum, 1));
116
      _boxes.push_back(RadixBox(minimum + 1, 1));
117
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
121 118
        extend();
... ...
@@ -124,22 +121,26 @@
124 121

	
125
    /// The number of items stored in the heap.
122
    /// \brief The number of items stored in the heap.
126 123
    ///
127
    /// \brief Returns the number of items stored in the heap.
128
    int size() const { return data.size(); }
129
    /// \brief Checks if the heap stores no items.
124
    /// This function returns the number of items stored in the heap.
125
    int size() const { return _data.size(); }
126

	
127
    /// \brief Check if the heap is empty.
130 128
    ///
131
    /// Returns \c true if and only if the heap stores no items.
132
    bool empty() const { return data.empty(); }
129
    /// This function returns \c true if the heap is empty.
130
    bool empty() const { return _data.empty(); }
133 131

	
134
    /// \brief Make empty this heap.
132
    /// \brief Make the heap empty.
135 133
    ///
136
    /// Make empty this heap. It does not change the cross reference
137
    /// map.  If you want to reuse a heap what is not surely empty you
138
    /// should first clear the heap and after that you should set the
139
    /// cross reference map for each item to \c PRE_HEAP.
140
    void clear(int minimal = 0, int capacity = 0) {
141
      data.clear(); boxes.clear();
142
      boxes.push_back(RadixBox(minimal, 1));
143
      boxes.push_back(RadixBox(minimal + 1, 1));
144
      while (lower(boxes.size() - 1, capacity + minimal - 1)) {
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.
139
    /// \param minimum The minimum value of the heap.
140
    /// \param capacity The capacity of the heap.
141
    void clear(int minimum = 0, int capacity = 0) {
142
      _data.clear(); _boxes.clear();
143
      _boxes.push_back(RadixBox(minimum, 1));
144
      _boxes.push_back(RadixBox(minimum + 1, 1));
145
      while (lower(_boxes.size() - 1, capacity + minimum - 1)) {
145 146
        extend();
... ...
@@ -151,3 +152,3 @@
151 152
    bool upper(int box, Prio pr) {
152
      return pr < boxes[box].min;
153
      return pr < _boxes[box].min;
153 154
    }
... ...
@@ -155,14 +156,14 @@
155 156
    bool lower(int box, Prio pr) {
156
      return pr >= boxes[box].min + boxes[box].size;
157
      return pr >= _boxes[box].min + _boxes[box].size;
157 158
    }
158 159

	
159
    /// \brief Remove item from the box list.
160
    // Remove item from the box list
160 161
    void remove(int index) {
161
      if (data[index].prev >= 0) {
162
        data[data[index].prev].next = data[index].next;
162
      if (_data[index].prev >= 0) {
163
        _data[_data[index].prev].next = _data[index].next;
163 164
      } else {
164
        boxes[data[index].box].first = data[index].next;
165
        _boxes[_data[index].box].first = _data[index].next;
165 166
      }
166
      if (data[index].next >= 0) {
167
        data[data[index].next].prev = data[index].prev;
167
      if (_data[index].next >= 0) {
168
        _data[_data[index].next].prev = _data[index].prev;
168 169
      }
... ...
@@ -170,28 +171,28 @@
170 171

	
171
    /// \brief Insert item into the box list.
172
    // Insert item into the box list
172 173
    void insert(int box, int index) {
173
      if (boxes[box].first == -1) {
174
        boxes[box].first = index;
175
        data[index].next = data[index].prev = -1;
174
      if (_boxes[box].first == -1) {
175
        _boxes[box].first = index;
176
        _data[index].next = _data[index].prev = -1;
176 177
      } else {
177
        data[index].next = boxes[box].first;
178
        data[boxes[box].first].prev = index;
179
        data[index].prev = -1;
180
        boxes[box].first = index;
178
        _data[index].next = _boxes[box].first;
179
        _data[_boxes[box].first].prev = index;
180
        _data[index].prev = -1;
181
        _boxes[box].first = index;
181 182
      }
182
      data[index].box = box;
183
      _data[index].box = box;
183 184
    }
184 185

	
185
    /// \brief Add a new box to the box list.
186
    // Add a new box to the box list
186 187
    void extend() {
187
      int min = boxes.back().min + boxes.back().size;
188
      int bs = 2 * boxes.back().size;
189
      boxes.push_back(RadixBox(min, bs));
188
      int min = _boxes.back().min + _boxes.back().size;
189
      int bs = 2 * _boxes.back().size;
190
      _boxes.push_back(RadixBox(min, bs));
190 191
    }
191 192

	
192
    /// \brief Move an item up into the proper box.
193
    void bubble_up(int index) {
194
      if (!lower(data[index].box, data[index].prio)) return;
193
    // Move an item up into the proper box.
194
    void bubbleUp(int index) {
195
      if (!lower(_data[index].box, _data[index].prio)) return;
195 196
      remove(index);
196
      int box = findUp(data[index].box, data[index].prio);
197
      int box = findUp(_data[index].box, _data[index].prio);
197 198
      insert(box, index);
... ...
@@ -199,6 +200,6 @@
199 200

	
200
    /// \brief Find up the proper box for the item with the given prio.
201
    // Find up the proper box for the item with the given priority
201 202
    int findUp(int start, int pr) {
202 203
      while (lower(start, pr)) {
203
        if (++start == int(boxes.size())) {
204
        if (++start == int(_boxes.size())) {
204 205
          extend();
... ...
@@ -209,7 +210,7 @@
209 210

	
210
    /// \brief Move an item down into the proper box.
211
    void bubble_down(int index) {
212
      if (!upper(data[index].box, data[index].prio)) return;
211
    // Move an item down into the proper box
212
    void bubbleDown(int index) {
213
      if (!upper(_data[index].box, _data[index].prio)) return;
213 214
      remove(index);
214
      int box = findDown(data[index].box, data[index].prio);
215
      int box = findDown(_data[index].box, _data[index].prio);
215 216
      insert(box, index);
... ...
@@ -217,6 +218,6 @@
217 218

	
218
    /// \brief Find up the proper box for the item with the given prio.
219
    // Find down the proper box for the item with the given priority
219 220
    int findDown(int start, int pr) {
220 221
      while (upper(start, pr)) {
221
        if (--start < 0) throw UnderFlowPriorityError();
222
        if (--start < 0) throw PriorityUnderflowError();
222 223
      }
... ...
@@ -225,6 +226,6 @@
225 226

	
226
    /// \brief Find the first not empty box.
227
    // Find the first non-empty box
227 228
    int findFirst() {
228 229
      int first = 0;
229
      while (boxes[first].first == -1) ++first;
230
      while (_boxes[first].first == -1) ++first;
230 231
      return first;
... ...
@@ -232,7 +233,7 @@
232 233

	
233
    /// \brief Gives back the minimal prio of the box.
234
    // Gives back the minimum priority of the given box
234 235
    int minValue(int box) {
235
      int min = data[boxes[box].first].prio;
236
      for (int k = boxes[box].first; k != -1; k = data[k].next) {
237
        if (data[k].prio < min) min = data[k].prio;
236
      int min = _data[_boxes[box].first].prio;
237
      for (int k = _boxes[box].first; k != -1; k = _data[k].next) {
238
        if (_data[k].prio < min) min = _data[k].prio;
238 239
      }
... ...
@@ -241,4 +242,3 @@
241 242

	
242
    /// \brief Rearrange the items of the heap and makes the
243
    /// first box not empty.
243
    // Rearrange the items of the heap and make the first box non-empty
244 244
    void moveDown() {
... ...
@@ -248,9 +248,9 @@
248 248
      for (int i = 0; i <= box; ++i) {
249
        boxes[i].min = min;
250
        min += boxes[i].size;
249
        _boxes[i].min = min;
250
        min += _boxes[i].size;
251 251
      }
252
      int curr = boxes[box].first, next;
252
      int curr = _boxes[box].first, next;
253 253
      while (curr != -1) {
254
        next = data[curr].next;
255
        bubble_down(curr);
254
        next = _data[curr].next;
255
        bubbleDown(curr);
256 256
        curr = next;
... ...
@@ -259,16 +259,16 @@
259 259

	
260
    void relocate_last(int index) {
261
      if (index != int(data.size()) - 1) {
262
        data[index] = data.back();
263
        if (data[index].prev != -1) {
264
          data[data[index].prev].next = index;
260
    void relocateLast(int index) {
261
      if (index != int(_data.size()) - 1) {
262
        _data[index] = _data.back();
263
        if (_data[index].prev != -1) {
264
          _data[_data[index].prev].next = index;
265 265
        } else {
266
          boxes[data[index].box].first = index;
266
          _boxes[_data[index].box].first = index;
267 267
        }
268
        if (data[index].next != -1) {
269
          data[data[index].next].prev = index;
268
        if (_data[index].next != -1) {
269
          _data[_data[index].next].prev = index;
270 270
        }
271
        _iim[data[index].item] = index;
271
        _iim[_data[index].item] = index;
272 272
      }
273
      data.pop_back();
273
      _data.pop_back();
274 274
    }
... ...
@@ -279,13 +279,16 @@
279 279
    ///
280
    /// Adds \c i to the heap with priority \c p.
280
    /// This function inserts the given item into the heap with the
281
    /// given priority.
281 282
    /// \param i The item to insert.
282 283
    /// \param p The priority of the item.
284
    /// \pre \e i must not be stored in the heap.
285
    /// \warning This method may throw an \c UnderFlowPriorityException.
283 286
    void push(const Item &i, const Prio &p) {
284
      int n = data.size();
287
      int n = _data.size();
285 288
      _iim.set(i, n);
286
      data.push_back(RadixItem(i, p));
287
      while (lower(boxes.size() - 1, p)) {
289
      _data.push_back(RadixItem(i, p));
290
      while (lower(_boxes.size() - 1, p)) {
288 291
        extend();
289 292
      }
290
      int box = findDown(boxes.size() - 1, p);
293
      int box = findDown(_boxes.size() - 1, p);
291 294
      insert(box, n);
... ...
@@ -293,23 +296,23 @@
293 296

	
294
    /// \brief Returns the item with minimum priority.
297
    /// \brief Return the item having minimum priority.
295 298
    ///
296
    /// This method returns the item with minimum priority.
297
    /// \pre The heap must be nonempty.
299
    /// This function returns the item having minimum priority.
300
    /// \pre The heap must be non-empty.
298 301
    Item top() const {
299 302
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
300
      return data[boxes[0].first].item;
303
      return _data[_boxes[0].first].item;
301 304
    }
302 305

	
303
    /// \brief Returns the minimum priority.
306
    /// \brief The minimum priority.
304 307
    ///
305
    /// It returns the minimum priority.
306
    /// \pre The heap must be nonempty.
308
    /// This function returns the minimum priority.
309
    /// \pre The heap must be non-empty.
307 310
    Prio prio() const {
308 311
      const_cast<RadixHeap<ItemIntMap>&>(*this).moveDown();
309
      return data[boxes[0].first].prio;
312
      return _data[_boxes[0].first].prio;
310 313
     }
311 314

	
312
    /// \brief Deletes the item with minimum priority.
315
    /// \brief Remove the item having minimum priority.
313 316
    ///
314
    /// This method deletes the item with minimum priority.
317
    /// This function removes the item having minimum priority.
315 318
    /// \pre The heap must be non-empty.
... ...
@@ -317,13 +320,14 @@
317 320
      moveDown();
318
      int index = boxes[0].first;
319
      _iim[data[index].item] = POST_HEAP;
321
      int index = _boxes[0].first;
322
      _iim[_data[index].item] = POST_HEAP;
320 323
      remove(index);
321
      relocate_last(index);
324
      relocateLast(index);
322 325
    }
323 326

	
324
    /// \brief Deletes \c i from the heap.
327
    /// \brief Remove the given item from the heap.
325 328
    ///
326
    /// This method deletes item \c i from the heap, if \c i was
327
    /// already stored in the heap.
328
    /// \param i The item to erase.
329
    /// This function removes the given item from the heap if it is
330
    /// already stored.
331
    /// \param i The item to delete.
332
    /// \pre \e i must be in the heap.
329 333
    void erase(const Item &i) {
... ...
@@ -332,23 +336,25 @@
332 336
      remove(index);
333
      relocate_last(index);
337
      relocateLast(index);
334 338
   }
335 339

	
336
    /// \brief Returns the priority of \c i.
340
    /// \brief The priority of the given item.
337 341
    ///
338
    /// This function returns the priority of item \c i.
339
    /// \pre \c i must be in the heap.
342
    /// This function returns the priority of the given item.
340 343
    /// \param i The item.
344
    /// \pre \e i must be in the heap.
341 345
    Prio operator[](const Item &i) const {
342 346
      int idx = _iim[i];
343
      return data[idx].prio;
347
      return _data[idx].prio;
344 348
    }
345 349

	
346
    /// \brief \c i gets to the heap with priority \c p independently
347
    /// if \c i was already there.
350
    /// \brief Set the priority of an item or insert it, if it is
351
    /// not stored in the heap.
348 352
    ///
349
    /// This method calls \ref push(\c i, \c p) if \c i is not stored
350
    /// in the heap and sets the priority of \c i to \c p otherwise.
351
    /// It may throw an \e UnderFlowPriorityException.
353
    /// This method sets the priority of the given item if it is
354
    /// already stored in the heap. Otherwise it inserts the given
355
    /// item into the heap with the given priority.
352 356
    /// \param i The item.
353 357
    /// \param p The priority.
358
    /// \pre \e i must be in the heap.
359
    /// \warning This method may throw an \c UnderFlowPriorityException.
354 360
    void set(const Item &i, const Prio &p) {
... ...
@@ -358,8 +364,8 @@
358 364
      }
359
      else if( p >= data[idx].prio ) {
360
        data[idx].prio = p;
361
        bubble_up(idx);
365
      else if( p >= _data[idx].prio ) {
366
        _data[idx].prio = p;
367
        bubbleUp(idx);
362 368
      } else {
363
        data[idx].prio = p;
364
        bubble_down(idx);
369
        _data[idx].prio = p;
370
        bubbleDown(idx);
365 371
      }
... ...
@@ -367,35 +373,34 @@
367 373

	
368

	
369
    /// \brief Decreases the priority of \c i to \c p.
374
    /// \brief Decrease the priority of an item to the given value.
370 375
    ///
371
    /// This method decreases the priority of item \c i to \c p.
372
    /// \pre \c i must be stored in the heap with priority at least \c p, and
373
    /// \c should be greater or equal to the last removed item's priority.
376
    /// This function decreases the priority of an item to the given value.
374 377
    /// \param i The item.
375 378
    /// \param p The priority.
379
    /// \pre \e i must be stored in the heap with priority at least \e p.
380
    /// \warning This method may throw an \c UnderFlowPriorityException.
376 381
    void decrease(const Item &i, const Prio &p) {
377 382
      int idx = _iim[i];
378
      data[idx].prio = p;
379
      bubble_down(idx);
383
      _data[idx].prio = p;
384
      bubbleDown(idx);
380 385
    }
381 386

	
382
    /// \brief Increases the priority of \c i to \c p.
387
    /// \brief Increase the priority of an item to the given value.
383 388
    ///
384
    /// This method sets the priority of item \c i to \c p.
385
    /// \pre \c i must be stored in the heap with priority at most \c p
389
    /// This function increases the priority of an item to the given value.
386 390
    /// \param i The item.
387 391
    /// \param p The priority.
392
    /// \pre \e i must be stored in the heap with priority at most \e p.
388 393
    void increase(const Item &i, const Prio &p) {
389 394
      int idx = _iim[i];
390
      data[idx].prio = p;
391
      bubble_up(idx);
395
      _data[idx].prio = p;
396
      bubbleUp(idx);
392 397
    }
393 398

	
394
    /// \brief Returns if \c item is in, has already been in, or has
395
    /// never been in the heap.
399
    /// \brief Return the state of an item.
396 400
    ///
397
    /// This method returns PRE_HEAP if \c item has never been in the
398
    /// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP
399
    /// otherwise. In the latter case it is possible that \c item will
400
    /// get back to the heap again.
401
    /// This method returns \c PRE_HEAP if the given item has never
402
    /// been in the heap, \c IN_HEAP if it is in the heap at the moment,
403
    /// and \c POST_HEAP otherwise.
404
    /// In the latter case it is possible that the item will get back
405
    /// to the heap again.
401 406
    /// \param i The item.
... ...
@@ -407,7 +412,7 @@
407 412

	
408
    /// \brief Sets the state of the \c item in the heap.
413
    /// \brief Set the state of an item in the heap.
409 414
    ///
410
    /// Sets the state of the \c item in the heap. It can be used to
411
    /// manually clear the heap when it is important to achive the
412
    /// better time complexity.
415
    /// This function sets the state of the given item in the heap.
416
    /// It can be used to manually clear the heap when it is important
417
    /// to achive better time complexity.
413 418
    /// \param i The item.
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -34,6 +34,3 @@
34 34
  class SmartDigraph;
35
  ///Base of SmartDigraph
36 35

	
37
  ///Base of SmartDigraph
38
  ///
39 36
  class SmartDigraphBase {
... ...
@@ -189,9 +186,16 @@
189 186
  ///
190
  ///This is a simple and fast digraph implementation.
191
  ///It is also quite memory efficient, but at the price
192
  ///that <b> it does support only limited (only stack-like)
193
  ///node and arc deletions</b>.
194
  ///It fully conforms to the \ref concepts::Digraph "Digraph concept".
187
  ///\ref SmartDigraph is a simple and fast digraph implementation.
188
  ///It is also quite memory efficient but at the price
189
  ///that it does not support node and arc deletion
190
  ///(except for the Snapshot feature).
195 191
  ///
196
  ///\sa concepts::Digraph.
192
  ///This type fully conforms to the \ref concepts::Digraph "Digraph concept"
193
  ///and it also provides some additional functionalities.
194
  ///Most of its member functions and nested classes are documented
195
  ///only in the concept class.
196
  ///
197
  ///This class provides constant time counting for nodes and arcs.
198
  ///
199
  ///\sa concepts::Digraph
200
  ///\sa SmartGraph
197 201
  class SmartDigraph : public ExtendedSmartDigraphBase {
... ...
@@ -200,13 +204,6 @@
200 204
  private:
201

	
202
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
203

	
204
    ///SmartDigraph is \e not copy constructible. Use DigraphCopy() instead.
205
    ///
205
    /// Digraphs are \e not copy constructible. Use DigraphCopy instead.
206 206
    SmartDigraph(const SmartDigraph &) : ExtendedSmartDigraphBase() {};
207
    ///\brief Assignment of SmartDigraph to another one is \e not allowed.
208
    ///Use DigraphCopy() instead.
209

	
210
    ///Assignment of SmartDigraph to another one is \e not allowed.
211
    ///Use DigraphCopy() instead.
207
    /// \brief Assignment of a digraph to another one is \e not allowed.
208
    /// Use DigraphCopy instead.
212 209
    void operator=(const SmartDigraph &) {}
... ...
@@ -223,4 +220,4 @@
223 220

	
224
    /// Add a new node to the digraph.
225
    /// \return The new node.
221
    ///This function adds a new node to the digraph.
222
    ///\return The new node.
226 223
    Node addNode() { return Parent::addNode(); }
... ...
@@ -229,6 +226,6 @@
229 226

	
230
    ///Add a new arc to the digraph with source node \c s
227
    ///This function adds a new arc to the digraph with source node \c s
231 228
    ///and target node \c t.
232 229
    ///\return The new arc.
233
    Arc addArc(const Node& s, const Node& t) {
230
    Arc addArc(Node s, Node t) {
234 231
      return Parent::addArc(s, t);
... ...
@@ -236,31 +233,9 @@
236 233

	
237
    /// \brief Using this it is possible to avoid the superfluous memory
238
    /// allocation.
239

	
240
    /// Using this it is possible to avoid the superfluous memory
241
    /// allocation: if you know that the digraph you want to build will
242
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
243
    /// then it is worth reserving space for this amount before starting
244
    /// to build the digraph.
245
    /// \sa reserveArc
246
    void reserveNode(int n) { nodes.reserve(n); };
247

	
248
    /// \brief Using this it is possible to avoid the superfluous memory
249
    /// allocation.
250

	
251
    /// Using this it is possible to avoid the superfluous memory
252
    /// allocation: if you know that the digraph you want to build will
253
    /// be very large (e.g. it will contain millions of nodes and/or arcs)
254
    /// then it is worth reserving space for this amount before starting
255
    /// to build the digraph.
256
    /// \sa reserveNode
257
    void reserveArc(int m) { arcs.reserve(m); };
258

	
259 234
    /// \brief Node validity check
260 235
    ///
261
    /// This function gives back true if the given node is valid,
262
    /// ie. it is a real node of the graph.
236
    /// This function gives back \c true if the given node is valid,
237
    /// i.e. it is a real node of the digraph.
263 238
    ///
264 239
    /// \warning A removed node (using Snapshot) could become valid again
265
    /// when new nodes are added to the graph.
240
    /// if new nodes are added to the digraph.
266 241
    bool valid(Node n) const { return Parent::valid(n); }
... ...
@@ -269,29 +244,21 @@
269 244
    ///
270
    /// This function gives back true if the given arc is valid,
271
    /// ie. it is a real arc of the graph.
245
    /// This function gives back \c true if the given arc is valid,
246
    /// i.e. it is a real arc of the digraph.
272 247
    ///
273 248
    /// \warning A removed arc (using Snapshot) could become valid again
274
    /// when new arcs are added to the graph.
249
    /// if new arcs are added to the graph.
275 250
    bool valid(Arc a) const { return Parent::valid(a); }
276 251

	
277
    ///Clear the digraph.
278

	
279
    ///Erase all the nodes and arcs from the digraph.
280
    ///
281
    void clear() {
282
      Parent::clear();
283
    }
284

	
285 252
    ///Split a node.
286 253

	
287
    ///This function splits a node. First a new node is added to the digraph,
288
    ///then the source of each outgoing arc of \c n is moved to this new node.
289
    ///If \c connect is \c true (this is the default value), then a new arc
290
    ///from \c n to the newly created node is also added.
254
    ///This function splits the given node. First, a new node is added
255
    ///to the digraph, then the source of each outgoing arc of node \c n
256
    ///is moved to this new node.
257
    ///If the second parameter \c connect is \c true (this is the default
258
    ///value), then a new arc from node \c n to the newly created node
259
    ///is also added.
291 260
    ///\return The newly created node.
292 261
    ///
293
    ///\note The <tt>Arc</tt>s
294
    ///referencing a moved arc remain
295
    ///valid. However <tt>InArc</tt>'s and <tt>OutArc</tt>'s
296
    ///may be invalidated.
262
    ///\note All iterators remain valid.
263
    ///
297 264
    ///\warning This functionality cannot be used together with the Snapshot
... ...
@@ -310,2 +277,30 @@
310 277

	
278
    ///Clear the digraph.
279

	
280
    ///This function erases all nodes and arcs from the digraph.
281
    ///
282
    void clear() {
283
      Parent::clear();
284
    }
285

	
286
    /// Reserve memory for nodes.
287

	
288
    /// Using this function, it is possible to avoid superfluous memory
289
    /// allocation: if you know that the digraph you want to build will
290
    /// be large (e.g. it will contain millions of nodes and/or arcs),
291
    /// then it is worth reserving space for this amount before starting
292
    /// to build the digraph.
293
    /// \sa reserveArc()
294
    void reserveNode(int n) { nodes.reserve(n); };
295

	
296
    /// Reserve memory for arcs.
297

	
298
    /// Using this function, it is possible to avoid superfluous memory
299
    /// allocation: if you know that the digraph you want to build will
300
    /// be large (e.g. it will contain millions of nodes and/or arcs),
301
    /// then it is worth reserving space for this amount before starting
302
    /// to build the digraph.
303
    /// \sa reserveNode()
304
    void reserveArc(int m) { arcs.reserve(m); };
305

	
311 306
  public:
... ...
@@ -334,16 +329,19 @@
334 329

	
335
    ///Class to make a snapshot of the digraph and to restrore to it later.
330
    ///Class to make a snapshot of the digraph and to restore it later.
336 331

	
337
    ///Class to make a snapshot of the digraph and to restrore to it later.
332
    ///Class to make a snapshot of the digraph and to restore it later.
338 333
    ///
339 334
    ///The newly added nodes and arcs can be removed using the
340
    ///restore() function.
341
    ///\note After you restore a state, you cannot restore
342
    ///a later state, in other word you cannot add again the arcs deleted
343
    ///by restore() using another one Snapshot instance.
335
    ///restore() function. This is the only way for deleting nodes and/or
336
    ///arcs from a SmartDigraph structure.
344 337
    ///
345
    ///\warning If you do not use correctly the snapshot that can cause
346
    ///either broken program, invalid state of the digraph, valid but
347
    ///not the restored digraph or no change. Because the runtime performance
348
    ///the validity of the snapshot is not stored.
338
    ///\note After a state is restored, you cannot restore a later state,
339
    ///i.e. you cannot add the removed nodes and arcs again using
340
    ///another Snapshot instance.
341
    ///
342
    ///\warning Node splitting cannot be restored.
343
    ///\warning The validity of the snapshot is not stored due to
344
    ///performance reasons. If you do not use the snapshot correctly,
345
    ///it can cause broken program, invalid or not restored state of
346
    ///the digraph or no change.
349 347
    class Snapshot
... ...
@@ -359,4 +357,3 @@
359 357
      ///Default constructor.
360
      ///To actually make a snapshot you must call save().
361
      ///
358
      ///You have to call save() to actually make a snapshot.
362 359
      Snapshot() : _graph(0) {}
... ...
@@ -364,5 +361,5 @@
364 361

	
365
      ///This constructor immediately makes a snapshot of the digraph.
366
      ///\param graph The digraph we make a snapshot of.
367
      Snapshot(SmartDigraph &graph) : _graph(&graph) {
362
      ///This constructor immediately makes a snapshot of the given digraph.
363
      ///
364
      Snapshot(SmartDigraph &gr) : _graph(&gr) {
368 365
        node_num=_graph->nodes.size();
... ...
@@ -373,10 +370,7 @@
373 370

	
374
      ///Make a snapshot of the digraph.
375
      ///
376
      ///This function can be called more than once. In case of a repeated
371
      ///This function makes a snapshot of the given digraph.
372
      ///It can be called more than once. In case of a repeated
377 373
      ///call, the previous snapshot gets lost.
378
      ///\param graph The digraph we make the snapshot of.
379
      void save(SmartDigraph &graph)
380
      {
381
        _graph=&graph;
374
      void save(SmartDigraph &gr) {
375
        _graph=&gr;
382 376
        node_num=_graph->nodes.size();
... ...
@@ -387,7 +381,4 @@
387 381

	
388
      ///Undo the changes until a snapshot created by save().
389
      ///
390
      ///\note After you restored a state, you cannot restore
391
      ///a later state, in other word you cannot add again the arcs deleted
392
      ///by restore().
382
      ///This function undos the changes until the last snapshot
383
      ///created by save() or Snapshot(SmartDigraph&).
393 384
      void restore()
... ...
@@ -510,3 +501,3 @@
510 501

	
511
    void next(Node& node) const {
502
    static void next(Node& node) {
512 503
      --node._id;
... ...
@@ -518,3 +509,3 @@
518 509

	
519
    void next(Arc& arc) const {
510
    static void next(Arc& arc) {
520 511
      --arc._id;
... ...
@@ -526,3 +517,3 @@
526 517

	
527
    void next(Edge& arc) const {
518
    static void next(Edge& arc) {
528 519
      --arc._id;
... ...
@@ -623,9 +614,16 @@
623 614
  ///
624
  /// This is a simple and fast graph implementation.
625
  /// It is also quite memory efficient, but at the price
626
  /// that <b> it does support only limited (only stack-like)
627
  /// node and arc deletions</b>.
628
  /// It fully conforms to the \ref concepts::Graph "Graph concept".
615
  /// \ref SmartGraph is a simple and fast graph implementation.
616
  /// It is also quite memory efficient but at the price
617
  /// that it does not support node and edge deletion
618
  /// (except for the Snapshot feature).
629 619
  ///
630
  /// \sa concepts::Graph.
620
  /// This type fully conforms to the \ref concepts::Graph "Graph concept"
621
  /// and it also provides some additional functionalities.
622
  /// Most of its member functions and nested classes are documented
623
  /// only in the concept class.
624
  ///
625
  /// This class provides constant time counting for nodes, edges and arcs.
626
  ///
627
  /// \sa concepts::Graph
628
  /// \sa SmartDigraph
631 629
  class SmartGraph : public ExtendedSmartGraphBase {
... ...
@@ -634,14 +632,6 @@
634 632
  private:
635

	
636
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
637

	
638
    ///SmartGraph is \e not copy constructible. Use GraphCopy() instead.
639
    ///
633
    /// Graphs are \e not copy constructible. Use GraphCopy instead.
640 634
    SmartGraph(const SmartGraph &) : ExtendedSmartGraphBase() {};
641

	
642
    ///\brief Assignment of SmartGraph to another one is \e not allowed.
643
    ///Use GraphCopy() instead.
644

	
645
    ///Assignment of SmartGraph to another one is \e not allowed.
646
    ///Use GraphCopy() instead.
635
    /// \brief Assignment of a graph to another one is \e not allowed.
636
    /// Use GraphCopy instead.
647 637
    void operator=(const SmartGraph &) {}
... ...
@@ -656,5 +646,5 @@
656 646

	
657
    ///Add a new node to the graph.
658

	
659
    /// Add a new node to the graph.
647
    /// \brief Add a new node to the graph.
648
    ///
649
    /// This function adds a new node to the graph.
660 650
    /// \return The new node.
... ...
@@ -662,9 +652,10 @@
662 652

	
663
    ///Add a new edge to the graph.
664

	
665
    ///Add a new edge to the graph with node \c s
666
    ///and \c t.
667
    ///\return The new edge.
668
    Edge addEdge(const Node& s, const Node& t) {
669
      return Parent::addEdge(s, t);
653
    /// \brief Add a new edge to the graph.
654
    ///
655
    /// This function adds a new edge to the graph between nodes
656
    /// \c u and \c v with inherent orientation from node \c u to
657
    /// node \c v.
658
    /// \return The new edge.
659
    Edge addEdge(Node u, Node v) {
660
      return Parent::addEdge(u, v);
670 661
    }
... ...
@@ -673,30 +664,30 @@
673 664
    ///
674
    /// This function gives back true if the given node is valid,
675
    /// ie. it is a real node of the graph.
665
    /// This function gives back \c true if the given node is valid,
666
    /// i.e. it is a real node of the graph.
676 667
    ///
677 668
    /// \warning A removed node (using Snapshot) could become valid again
678
    /// when new nodes are added to the graph.
669
    /// if new nodes are added to the graph.
679 670
    bool valid(Node n) const { return Parent::valid(n); }
680 671

	
672
    /// \brief Edge validity check
673
    ///
674
    /// This function gives back \c true if the given edge is valid,
675
    /// i.e. it is a real edge of the graph.
676
    ///
677
    /// \warning A removed edge (using Snapshot) could become valid again
678
    /// if new edges are added to the graph.
679
    bool valid(Edge e) const { return Parent::valid(e); }
680

	
681 681
    /// \brief Arc validity check
682 682
    ///
683
    /// This function gives back true if the given arc is valid,
684
    /// ie. it is a real arc of the graph.
683
    /// This function gives back \c true if the given arc is valid,
684
    /// i.e. it is a real arc of the graph.
685 685
    ///
686 686
    /// \warning A removed arc (using Snapshot) could become valid again
687
    /// when new edges are added to the graph.
687
    /// if new edges are added to the graph.
688 688
    bool valid(Arc a) const { return Parent::valid(a); }
689 689

	
690
    /// \brief Edge validity check
691
    ///
692
    /// This function gives back true if the given edge is valid,
693
    /// ie. it is a real edge of the graph.
694
    ///
695
    /// \warning A removed edge (using Snapshot) could become valid again
696
    /// when new edges are added to the graph.
697
    bool valid(Edge e) const { return Parent::valid(e); }
698

	
699 690
    ///Clear the graph.
700 691

	
701
    ///Erase all the nodes and edges from the graph.
692
    ///This function erases all nodes and arcs from the graph.
702 693
    ///
... ...
@@ -706,2 +697,22 @@
706 697

	
698
    /// Reserve memory for nodes.
699

	
700
    /// Using this function, it is possible to avoid superfluous memory
701
    /// allocation: if you know that the graph you want to build will
702
    /// be large (e.g. it will contain millions of nodes and/or edges),
703
    /// then it is worth reserving space for this amount before starting
704
    /// to build the graph.
705
    /// \sa reserveEdge()
706
    void reserveNode(int n) { nodes.reserve(n); };
707

	
708
    /// Reserve memory for edges.
709

	
710
    /// Using this function, it is possible to avoid superfluous memory
711
    /// allocation: if you know that the graph you want to build will
712
    /// be large (e.g. it will contain millions of nodes and/or edges),
713
    /// then it is worth reserving space for this amount before starting
714
    /// to build the graph.
715
    /// \sa reserveNode()
716
    void reserveEdge(int m) { arcs.reserve(2 * m); };
717

	
707 718
  public:
... ...
@@ -744,17 +755,18 @@
744 755

	
745
    ///Class to make a snapshot of the digraph and to restrore to it later.
756
    ///Class to make a snapshot of the graph and to restore it later.
746 757

	
747
    ///Class to make a snapshot of the digraph and to restrore to it later.
758
    ///Class to make a snapshot of the graph and to restore it later.
748 759
    ///
749
    ///The newly added nodes and arcs can be removed using the
750
    ///restore() function.
760
    ///The newly added nodes and edges can be removed using the
761
    ///restore() function. This is the only way for deleting nodes and/or
762
    ///edges from a SmartGraph structure.
751 763
    ///
752
    ///\note After you restore a state, you cannot restore
753
    ///a later state, in other word you cannot add again the arcs deleted
754
    ///by restore() using another one Snapshot instance.
764
    ///\note After a state is restored, you cannot restore a later state,
765
    ///i.e. you cannot add the removed nodes and edges again using
766
    ///another Snapshot instance.
755 767
    ///
756
    ///\warning If you do not use correctly the snapshot that can cause
757
    ///either broken program, invalid state of the digraph, valid but
758
    ///not the restored digraph or no change. Because the runtime performance
759
    ///the validity of the snapshot is not stored.
768
    ///\warning The validity of the snapshot is not stored due to
769
    ///performance reasons. If you do not use the snapshot correctly,
770
    ///it can cause broken program, invalid or not restored state of
771
    ///the graph or no change.
760 772
    class Snapshot
... ...
@@ -770,4 +782,3 @@
770 782
      ///Default constructor.
771
      ///To actually make a snapshot you must call save().
772
      ///
783
      ///You have to call save() to actually make a snapshot.
773 784
      Snapshot() : _graph(0) {}
... ...
@@ -775,6 +786,6 @@
775 786

	
776
      ///This constructor immediately makes a snapshot of the digraph.
777
      ///\param graph The digraph we make a snapshot of.
778
      Snapshot(SmartGraph &graph) {
779
        graph.saveSnapshot(*this);
787
      /// This constructor immediately makes a snapshot of the given graph.
788
      ///
789
      Snapshot(SmartGraph &gr) {
790
        gr.saveSnapshot(*this);
780 791
      }
... ...
@@ -783,19 +794,14 @@
783 794

	
784
      ///Make a snapshot of the graph.
785
      ///
786
      ///This function can be called more than once. In case of a repeated
795
      ///This function makes a snapshot of the given graph.
796
      ///It can be called more than once. In case of a repeated
787 797
      ///call, the previous snapshot gets lost.
788
      ///\param graph The digraph we make the snapshot of.
789
      void save(SmartGraph &graph)
798
      void save(SmartGraph &gr)
790 799
      {
791
        graph.saveSnapshot(*this);
800
        gr.saveSnapshot(*this);
792 801
      }
793 802

	
794
      ///Undo the changes until a snapshot.
803
      ///Undo the changes until the last snapshot.
795 804

	
796
      ///Undo the changes until a snapshot created by save().
797
      ///
798
      ///\note After you restored a state, you cannot restore
799
      ///a later state, in other word you cannot add again the arcs deleted
800
      ///by restore().
805
      ///This function undos the changes until the last snapshot
806
      ///created by save() or Snapshot(SmartGraph&).
801 807
      void restore()
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -93,2 +93,15 @@
93 93

	
94
  int SoplexLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) {
95
    soplex::DSVector v;
96
    for (ExprIterator it = b; it != e; ++it) {
97
      v.add(it->first, it->second);
98
    }
99
    soplex::LPRow r(l, v, u);
100
    soplex->addRow(r);
101

	
102
    _row_names.push_back(std::string());
103

	
104
    return soplex->nRows() - 1;
105
  }
106

	
94 107

	
... ...
@@ -276,3 +289,3 @@
276 289
    _clear_temporals();
277
    
290

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

	
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -31,2 +31,3 @@
31 31
#include <lemon/list_graph.h>
32
#include <lemon/dijkstra.h>
32 33
#include <lemon/maps.h>
... ...
@@ -35,2 +36,45 @@
35 36

	
37
  /// \brief Default traits class of Suurballe algorithm.
38
  ///
39
  /// Default traits class of Suurballe algorithm.
40
  /// \tparam GR The digraph type the algorithm runs on.
41
  /// \tparam LEN The type of the length map.
42
  /// The default value is <tt>GR::ArcMap<int></tt>.
43
#ifdef DOXYGEN
44
  template <typename GR, typename LEN>
45
#else
46
  template < typename GR,
47
             typename LEN = typename GR::template ArcMap<int> >
48
#endif
49
  struct SuurballeDefaultTraits
50
  {
51
    /// The type of the digraph.
52
    typedef GR Digraph;
53
    /// The type of the length map.
54
    typedef LEN LengthMap;
55
    /// The type of the lengths.
56
    typedef typename LEN::Value Length;
57
    /// The type of the flow map.
58
    typedef typename GR::template ArcMap<int> FlowMap;
59
    /// The type of the potential map.
60
    typedef typename GR::template NodeMap<Length> PotentialMap;
61

	
62
    /// \brief The path type
63
    ///
64
    /// The type used for storing the found arc-disjoint paths.
65
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
66
    /// and it must have an \c addBack() function.
67
    typedef lemon::Path<Digraph> Path;
68

	
69
    /// The cross reference type used for the heap.
70
    typedef typename GR::template NodeMap<int> HeapCrossRef;
71

	
72
    /// \brief The heap type used for internal Dijkstra computations.
73
    ///
74
    /// The type of the heap used for internal Dijkstra computations.
75
    /// It must conform to the \ref lemon::concepts::Heap "Heap" concept
76
    /// and its priority type must be \c Length.
77
    typedef BinHeap<Length, HeapCrossRef> Heap;
78
  };
79

	
36 80
  /// \addtogroup shortest_path
... ...
@@ -48,3 +92,3 @@
48 92
  /// efficient specialized version of the \ref CapacityScaling
49
  /// "Successive Shortest Path" algorithm directly for this problem.
93
  /// "successive shortest path" algorithm directly for this problem.
50 94
  /// Therefore this class provides query functions for flow values and
... ...
@@ -59,9 +103,10 @@
59 103
  ///
60
  /// \note For finding node-disjoint paths this algorithm can be used
104
  /// \note For finding \e node-disjoint paths, this algorithm can be used
61 105
  /// along with the \ref SplitNodes adaptor.
62 106
#ifdef DOXYGEN
63
  template <typename GR, typename LEN>
107
  template <typename GR, typename LEN, typename TR>
64 108
#else
65 109
  template < typename GR,
66
             typename LEN = typename GR::template ArcMap<int> >
110
             typename LEN = typename GR::template ArcMap<int>,
111
             typename TR = SuurballeDefaultTraits<GR, LEN> >
67 112
#endif
... ...
@@ -76,22 +121,22 @@
76 121

	
77
    /// The type of the digraph the algorithm runs on.
78
    typedef GR Digraph;
122
    /// The type of the digraph.
123
    typedef typename TR::Digraph Digraph;
79 124
    /// The type of the length map.
80
    typedef LEN LengthMap;
125
    typedef typename TR::LengthMap LengthMap;
81 126
    /// The type of the lengths.
82
    typedef typename LengthMap::Value Length;
83
#ifdef DOXYGEN
127
    typedef typename TR::Length Length;
128

	
84 129
    /// The type of the flow map.
85
    typedef GR::ArcMap<int> FlowMap;
130
    typedef typename TR::FlowMap FlowMap;
86 131
    /// The type of the potential map.
87
    typedef GR::NodeMap<Length> PotentialMap;
88
#else
89
    /// The type of the flow map.
90
    typedef typename Digraph::template ArcMap<int> FlowMap;
91
    /// The type of the potential map.
92
    typedef typename Digraph::template NodeMap<Length> PotentialMap;
93
#endif
132
    typedef typename TR::PotentialMap PotentialMap;
133
    /// The type of the path structures.
134
    typedef typename TR::Path Path;
135
    /// The cross reference type used for the heap.
136
    typedef typename TR::HeapCrossRef HeapCrossRef;
137
    /// The heap type used for internal Dijkstra computations.
138
    typedef typename TR::Heap Heap;
94 139

	
95
    /// The type of the path structures.
96
    typedef SimplePath<GR> Path;
140
    /// The \ref SuurballeDefaultTraits "traits class" of the algorithm.
141
    typedef TR Traits;
97 142

	
... ...
@@ -106,4 +151,28 @@
106 151
    {
107
      typedef typename Digraph::template NodeMap<int> HeapCrossRef;
108
      typedef BinHeap<Length, HeapCrossRef> Heap;
152
    private:
153

	
154
      const Digraph &_graph;
155
      const LengthMap &_length;
156
      const FlowMap &_flow;
157
      PotentialMap &_pi;
158
      PredMap &_pred;
159
      Node _s;
160
      Node _t;
161

	
162
      PotentialMap _dist;
163
      std::vector<Node> _proc_nodes;
164

	
165
    public:
166

	
167
      // Constructor
168
      ResidualDijkstra(Suurballe &srb) :
169
        _graph(srb._graph), _length(srb._length),
170
        _flow(*srb._flow), _pi(*srb._potential), _pred(srb._pred),
171
        _s(srb._s), _t(srb._t), _dist(_graph) {}
172

	
173
      // Run the algorithm and return true if a path is found
174
      // from the source node to the target node.
175
      bool run(int cnt) {
176
        return cnt == 0 ? startFirst() : start();
177
      }
109 178

	
... ...
@@ -111,35 +180,5 @@
111 180

	
112
      // The digraph the algorithm runs on
113
      const Digraph &_graph;
114

	
115
      // The main maps
116
      const FlowMap &_flow;
117
      const LengthMap &_length;
118
      PotentialMap &_potential;
119

	
120
      // The distance map
121
      PotentialMap _dist;
122
      // The pred arc map
123
      PredMap &_pred;
124
      // The processed (i.e. permanently labeled) nodes
125
      std::vector<Node> _proc_nodes;
126

	
127
      Node _s;
128
      Node _t;
129

	
130
    public:
131

	
132
      /// Constructor.
133
      ResidualDijkstra( const Digraph &graph,
134
                        const FlowMap &flow,
135
                        const LengthMap &length,
136
                        PotentialMap &potential,
137
                        PredMap &pred,
138
                        Node s, Node t ) :
139
        _graph(graph), _flow(flow), _length(length), _potential(potential),
140
        _dist(graph), _pred(pred), _s(s), _t(t) {}
141

	
142
      /// \brief Run the algorithm. It returns \c true if a path is found
143
      /// from the source node to the target node.
144
      bool run() {
181
      // Execute the algorithm for the first time (the flow and potential
182
      // functions have to be identically zero).
183
      bool startFirst() {
145 184
        HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
... ...
@@ -153,6 +192,51 @@
153 192
          Node u = heap.top(), v;
154
          Length d = heap.prio() + _potential[u], nd;
193
          Length d = heap.prio(), dn;
155 194
          _dist[u] = heap.prio();
195
          _proc_nodes.push_back(u);
156 196
          heap.pop();
197

	
198
          // Traverse outgoing arcs
199
          for (OutArcIt e(_graph, u); e != INVALID; ++e) {
200
            v = _graph.target(e);
201
            switch(heap.state(v)) {
202
              case Heap::PRE_HEAP:
203
                heap.push(v, d + _length[e]);
204
                _pred[v] = e;
205
                break;
206
              case Heap::IN_HEAP:
207
                dn = d + _length[e];
208
                if (dn < heap[v]) {
209
                  heap.decrease(v, dn);
210
                  _pred[v] = e;
211
                }
212
                break;
213
              case Heap::POST_HEAP:
214
                break;
215
            }
216
          }
217
        }
218
        if (heap.empty()) return false;
219

	
220
        // Update potentials of processed nodes
221
        Length t_dist = heap.prio();
222
        for (int i = 0; i < int(_proc_nodes.size()); ++i)
223
          _pi[_proc_nodes[i]] = _dist[_proc_nodes[i]] - t_dist;
224
        return true;
225
      }
226

	
227
      // Execute the algorithm.
228
      bool start() {
229
        HeapCrossRef heap_cross_ref(_graph, Heap::PRE_HEAP);
230
        Heap heap(heap_cross_ref);
231
        heap.push(_s, 0);
232
        _pred[_s] = INVALID;
233
        _proc_nodes.clear();
234

	
235
        // Process nodes
236
        while (!heap.empty() && heap.top() != _t) {
237
          Node u = heap.top(), v;
238
          Length d = heap.prio() + _pi[u], dn;
239
          _dist[u] = heap.prio();
157 240
          _proc_nodes.push_back(u);
241
          heap.pop();
158 242

	
... ...
@@ -163,15 +247,15 @@
163 247
              switch(heap.state(v)) {
164
              case Heap::PRE_HEAP:
165
                heap.push(v, d + _length[e] - _potential[v]);
166
                _pred[v] = e;
167
                break;
168
              case Heap::IN_HEAP:
169
                nd = d + _length[e] - _potential[v];
170
                if (nd < heap[v]) {
171
                  heap.decrease(v, nd);
248
                case Heap::PRE_HEAP:
249
                  heap.push(v, d + _length[e] - _pi[v]);
172 250
                  _pred[v] = e;
173
                }
174
                break;
175
              case Heap::POST_HEAP:
176
                break;
251
                  break;
252
                case Heap::IN_HEAP:
253
                  dn = d + _length[e] - _pi[v];
254
                  if (dn < heap[v]) {
255
                    heap.decrease(v, dn);
256
                    _pred[v] = e;
257
                  }
258
                  break;
259
                case Heap::POST_HEAP:
260
                  break;
177 261
              }
... ...
@@ -185,15 +269,15 @@
185 269
              switch(heap.state(v)) {
186
              case Heap::PRE_HEAP:
187
                heap.push(v, d - _length[e] - _potential[v]);
188
                _pred[v] = e;
189
                break;
190
              case Heap::IN_HEAP:
191
                nd = d - _length[e] - _potential[v];
192
                if (nd < heap[v]) {
193
                  heap.decrease(v, nd);
270
                case Heap::PRE_HEAP:
271
                  heap.push(v, d - _length[e] - _pi[v]);
194 272
                  _pred[v] = e;
195
                }
196
                break;
197
              case Heap::POST_HEAP:
198
                break;
273
                  break;
274
                case Heap::IN_HEAP:
275
                  dn = d - _length[e] - _pi[v];
276
                  if (dn < heap[v]) {
277
                    heap.decrease(v, dn);
278
                    _pred[v] = e;
279
                  }
280
                  break;
281
                case Heap::POST_HEAP:
282
                  break;
199 283
              }
... ...
@@ -207,3 +291,3 @@
207 291
        for (int i = 0; i < int(_proc_nodes.size()); ++i)
208
          _potential[_proc_nodes[i]] += _dist[_proc_nodes[i]] - t_dist;
292
          _pi[_proc_nodes[i]] += _dist[_proc_nodes[i]] - t_dist;
209 293
        return true;
... ...
@@ -213,2 +297,79 @@
213 297

	
298
  public:
299

	
300
    /// \name Named Template Parameters
301
    /// @{
302

	
303
    template <typename T>
304
    struct SetFlowMapTraits : public Traits {
305
      typedef T FlowMap;
306
    };
307

	
308
    /// \brief \ref named-templ-param "Named parameter" for setting
309
    /// \c FlowMap type.
310
    ///
311
    /// \ref named-templ-param "Named parameter" for setting
312
    /// \c FlowMap type.
313
    template <typename T>
314
    struct SetFlowMap
315
      : public Suurballe<GR, LEN, SetFlowMapTraits<T> > {
316
      typedef Suurballe<GR, LEN, SetFlowMapTraits<T> > Create;
317
    };
318

	
319
    template <typename T>
320
    struct SetPotentialMapTraits : public Traits {
321
      typedef T PotentialMap;
322
    };
323

	
324
    /// \brief \ref named-templ-param "Named parameter" for setting
325
    /// \c PotentialMap type.
326
    ///
327
    /// \ref named-templ-param "Named parameter" for setting
328
    /// \c PotentialMap type.
329
    template <typename T>
330
    struct SetPotentialMap
331
      : public Suurballe<GR, LEN, SetPotentialMapTraits<T> > {
332
      typedef Suurballe<GR, LEN, SetPotentialMapTraits<T> > Create;
333
    };
334

	
335
    template <typename T>
336
    struct SetPathTraits : public Traits {
337
      typedef T Path;
338
    };
339

	
340
    /// \brief \ref named-templ-param "Named parameter" for setting
341
    /// \c %Path type.
342
    ///
343
    /// \ref named-templ-param "Named parameter" for setting \c %Path type.
344
    /// It must conform to the \ref lemon::concepts::Path "Path" concept
345
    /// and it must have an \c addBack() function.
346
    template <typename T>
347
    struct SetPath
348
      : public Suurballe<GR, LEN, SetPathTraits<T> > {
349
      typedef Suurballe<GR, LEN, SetPathTraits<T> > Create;
350
    };
351

	
352
    template <typename H, typename CR>
353
    struct SetHeapTraits : public Traits {
354
      typedef H Heap;
355
      typedef CR HeapCrossRef;
356
    };
357

	
358
    /// \brief \ref named-templ-param "Named parameter" for setting
359
    /// \c Heap and \c HeapCrossRef types.
360
    ///
361
    /// \ref named-templ-param "Named parameter" for setting \c Heap
362
    /// and \c HeapCrossRef types with automatic allocation.
363
    /// They will be used for internal Dijkstra computations.
364
    /// The heap type must conform to the \ref lemon::concepts::Heap "Heap"
365
    /// concept and its priority type must be \c Length.
366
    template <typename H,
367
              typename CR = typename Digraph::template NodeMap<int> >
368
    struct SetHeap
369
      : public Suurballe<GR, LEN, SetHeapTraits<H, CR> > {
370
      typedef Suurballe<GR, LEN, SetHeapTraits<H, CR> > Create;
371
    };
372

	
373
    /// @}
374

	
214 375
  private:
... ...
@@ -228,8 +389,8 @@
228 389
    // The source node
229
    Node _source;
390
    Node _s;
230 391
    // The target node
231
    Node _target;
392
    Node _t;
232 393

	
233 394
    // Container to store the found paths
234
    std::vector< SimplePath<Digraph> > paths;
395
    std::vector<Path> _paths;
235 396
    int _path_num;
... ...
@@ -238,5 +399,11 @@
238 399
    PredMap _pred;
239
    // Implementation of the Dijkstra algorithm for finding augmenting
240
    // shortest paths in the residual network
241
    ResidualDijkstra *_dijkstra;
400

	
401
    // Data for full init
402
    PotentialMap *_init_dist;
403
    PredMap *_init_pred;
404
    bool _full_init;
405

	
406
  protected:
407

	
408
    Suurballe() {}
242 409

	
... ...
@@ -253,3 +420,4 @@
253 420
      _graph(graph), _length(length), _flow(0), _local_flow(false),
254
      _potential(0), _local_potential(false), _pred(graph)
421
      _potential(0), _local_potential(false), _pred(graph),
422
      _init_dist(0), _init_pred(0)
255 423
    {}
... ...
@@ -260,3 +428,4 @@
260 428
      if (_local_potential) delete _potential;
261
      delete _dijkstra;
429
      delete _init_dist;
430
      delete _init_pred;
262 431
    }
... ...
@@ -305,6 +474,9 @@
305 474
    /// The simplest way to execute the algorithm is to call the run()
306
    /// function.
307
    /// \n
475
    /// function.\n
476
    /// If you need to execute the algorithm many times using the same
477
    /// source node, then you may call fullInit() once and start()
478
    /// for each target node.\n
308 479
    /// If you only need the flow that is the union of the found
309
    /// arc-disjoint paths, you may call init() and findFlow().
480
    /// arc-disjoint paths, then you may call findFlow() instead of
481
    /// start().
310 482

	
... ...
@@ -328,4 +500,3 @@
328 500
    ///   s.init(s);
329
    ///   s.findFlow(t, k);
330
    ///   s.findPaths();
501
    ///   s.start(t, k);
331 502
    /// \endcode
... ...
@@ -333,4 +504,3 @@
333 504
      init(s);
334
      findFlow(t, k);
335
      findPaths();
505
      start(t, k);
336 506
      return _path_num;
... ...
@@ -340,3 +510,3 @@
340 510
    ///
341
    /// This function initializes the algorithm.
511
    /// This function initializes the algorithm with the given source node.
342 512
    ///
... ...
@@ -344,3 +514,3 @@
344 514
    void init(const Node& s) {
345
      _source = s;
515
      _s = s;
346 516

	
... ...
@@ -355,4 +525,59 @@
355 525
      }
356
      for (ArcIt e(_graph); e != INVALID; ++e) (*_flow)[e] = 0;
357
      for (NodeIt n(_graph); n != INVALID; ++n) (*_potential)[n] = 0;
526
      _full_init = false;
527
    }
528

	
529
    /// \brief Initialize the algorithm and perform Dijkstra.
530
    ///
531
    /// This function initializes the algorithm and performs a full
532
    /// Dijkstra search from the given source node. It makes consecutive
533
    /// executions of \ref start() "start(t, k)" faster, since they
534
    /// have to perform %Dijkstra only k-1 times.
535
    ///
536
    /// This initialization is usually worth using instead of \ref init()
537
    /// if the algorithm is executed many times using the same source node.
538
    ///
539
    /// \param s The source node.
540
    void fullInit(const Node& s) {
541
      // Initialize maps
542
      init(s);
543
      if (!_init_dist) {
544
        _init_dist = new PotentialMap(_graph);
545
      }
546
      if (!_init_pred) {
547
        _init_pred = new PredMap(_graph);
548
      }
549

	
550
      // Run a full Dijkstra
551
      typename Dijkstra<Digraph, LengthMap>
552
        ::template SetStandardHeap<Heap>
553
        ::template SetDistMap<PotentialMap>
554
        ::template SetPredMap<PredMap>
555
        ::Create dijk(_graph, _length);
556
      dijk.distMap(*_init_dist).predMap(*_init_pred);
557
      dijk.run(s);
558

	
559
      _full_init = true;
560
    }
561

	
562
    /// \brief Execute the algorithm.
563
    ///
564
    /// This function executes the algorithm.
565
    ///
566
    /// \param t The target node.
567
    /// \param k The number of paths to be found.
568
    ///
569
    /// \return \c k if there are at least \c k arc-disjoint paths from
570
    /// \c s to \c t in the digraph. Otherwise it returns the number of
571
    /// arc-disjoint paths found.
572
    ///
573
    /// \note Apart from the return value, <tt>s.start(t, k)</tt> is
574
    /// just a shortcut of the following code.
575
    /// \code
576
    ///   s.findFlow(t, k);
577
    ///   s.findPaths();
578
    /// \endcode
579
    int start(const Node& t, int k = 2) {
580
      findFlow(t, k);
581
      findPaths();
582
      return _path_num;
358 583
    }
... ...
@@ -374,12 +599,31 @@
374 599
    int findFlow(const Node& t, int k = 2) {
375
      _target = t;
376
      _dijkstra =
377
        new ResidualDijkstra( _graph, *_flow, _length, *_potential, _pred,
378
                              _source, _target );
600
      _t = t;
601
      ResidualDijkstra dijkstra(*this);
602

	
603
      // Initialization
604
      for (ArcIt e(_graph); e != INVALID; ++e) {
605
        (*_flow)[e] = 0;
606
      }
607
      if (_full_init) {
608
        for (NodeIt n(_graph); n != INVALID; ++n) {
609
          (*_potential)[n] = (*_init_dist)[n];
610
        }
611
        Node u = _t;
612
        Arc e;
613
        while ((e = (*_init_pred)[u]) != INVALID) {
614
          (*_flow)[e] = 1;
615
          u = _graph.source(e);
616
        }
617
        _path_num = 1;
618
      } else {
619
        for (NodeIt n(_graph); n != INVALID; ++n) {
620
          (*_potential)[n] = 0;
621
        }
622
        _path_num = 0;
623
      }
379 624

	
380 625
      // Find shortest paths
381
      _path_num = 0;
382 626
      while (_path_num < k) {
383 627
        // Run Dijkstra
384
        if (!_dijkstra->run()) break;
628
        if (!dijkstra.run(_path_num)) break;
385 629
        ++_path_num;
... ...
@@ -387,3 +631,3 @@
387 631
        // Set the flow along the found shortest path
388
        Node u = _target;
632
        Node u = _t;
389 633
        Arc e;
... ...
@@ -404,4 +648,4 @@
404 648
    ///
405
    /// This function computes the paths from the found minimum cost flow,
406
    /// which is the union of some arc-disjoint paths.
649
    /// This function computes arc-disjoint paths from the found minimum
650
    /// cost flow, which is the union of them.
407 651
    ///
... ...
@@ -413,7 +657,7 @@
413 657

	
414
      paths.clear();
415
      paths.resize(_path_num);
658
      _paths.clear();
659
      _paths.resize(_path_num);
416 660
      for (int i = 0; i < _path_num; ++i) {
417
        Node n = _source;
418
        while (n != _target) {
661
        Node n = _s;
662
        while (n != _t) {
419 663
          OutArcIt e(_graph, n);
... ...
@@ -421,3 +665,3 @@
421 665
          n = _graph.target(e);
422
          paths[i].addBack(e);
666
          _paths[i].addBack(e);
423 667
          res_flow[e] = 0;
... ...
@@ -520,3 +764,3 @@
520 764
    const Path& path(int i) const {
521
      return paths[i];
765
      return _paths[i];
522 766
    }
Ignore white space 6 line context
... ...
@@ -377,3 +377,3 @@
377 377
    ///necessary to really stop the timer.
378
    ///For example the timer
378
    ///For example, the timer
379 379
    ///is running if and only if the return value is \c true
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -45,3 +45,3 @@
45 45
  /// only four methods: join (union), find, insert and size.
46
  /// For more features see the \ref UnionFindEnum class.
46
  /// For more features, see the \ref UnionFindEnum class.
47 47
  ///
Ignore white space 6 line context
1 1
#! /usr/bin/env python
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
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.
2 16

	
Ignore white space 6 line context
1 1
#!/bin/bash
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
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.
2 16

	
Ignore white space 6 line context
1 1
#!/bin/bash
2
#
3
# This file is a part of LEMON, a generic C++ optimization library.
4
#
5
# Copyright (C) 2003-2009
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.
2 16

	
Ignore white space 6 line context
... ...
@@ -15,2 +15,3 @@
15 15
  adaptors_test
16
  bellman_ford_test
16 17
  bfs_test
... ...
@@ -26,2 +27,3 @@
26 27
  euler_test
28
  fractional_matching_test
27 29
  gomory_hu_test
... ...
@@ -38,3 +40,5 @@
38 40
  min_cost_flow_test
41
  min_mean_cycle_test
39 42
  path_test
43
  planarity_test
40 44
  preflow_test
Ignore white space 6 line context
1
if USE_VALGRIND
2
TESTS_ENVIRONMENT=$(top_srcdir)/scripts/valgrind-wrapper.sh
3
endif
4

	
1 5
EXTRA_DIST += \
... ...
@@ -9,2 +13,3 @@
9 13
	test/adaptors_test \
14
	test/bellman_ford_test \
10 15
	test/bfs_test \
... ...
@@ -20,2 +25,3 @@
20 25
	test/euler_test \
26
	test/fractional_matching_test \
21 27
	test/gomory_hu_test \
... ...
@@ -32,3 +38,5 @@
32 38
	test/min_cost_flow_test \
39
	test/min_mean_cycle_test \
33 40
	test/path_test \
41
	test/planarity_test \
34 42
	test/preflow_test \
... ...
@@ -55,2 +63,3 @@
55 63
test_adaptors_test_SOURCES = test/adaptors_test.cc
64
test_bellman_ford_test_SOURCES = test/bellman_ford_test.cc
56 65
test_bfs_test_SOURCES = test/bfs_test.cc
... ...
@@ -66,2 +75,3 @@
66 75
test_euler_test_SOURCES = test/euler_test.cc
76
test_fractional_matching_test_SOURCES = test/fractional_matching_test.cc
67 77
test_gomory_hu_test_SOURCES = test/gomory_hu_test.cc
... ...
@@ -80,3 +90,5 @@
80 90
test_min_cost_flow_test_SOURCES = test/min_cost_flow_test.cc
91
test_min_mean_cycle_test_SOURCES = test/min_mean_cycle_test.cc
81 92
test_path_test_SOURCES = test/path_test.cc
93
test_planarity_test_SOURCES = test/planarity_test.cc
82 94
test_preflow_test_SOURCES = test/preflow_test.cc
Ignore white space 6 line context
... ...
@@ -1373,24 +1373,16 @@
1373 1373
  GridGraph::EdgeMap<bool> dir_map(graph);
1374
  dir_map[graph.right(n1)] = graph.u(graph.right(n1)) == n1;
1375
  dir_map[graph.up(n1)] = graph.u(graph.up(n1)) != n1;
1376
  dir_map[graph.left(n4)] = graph.u(graph.left(n4)) != n4;
1377
  dir_map[graph.down(n4)] = graph.u(graph.down(n4)) != n4;
1374
  dir_map[graph.right(n1)] = graph.u(graph.right(n1)) != n1;
1375
  dir_map[graph.up(n1)] = graph.u(graph.up(n1)) == n1;
1376
  dir_map[graph.left(n4)] = graph.u(graph.left(n4)) == n4;
1377
  dir_map[graph.down(n4)] = graph.u(graph.down(n4)) == n4;
1378 1378

	
1379 1379
  // Apply several adaptors on the grid graph
1380
  typedef SplitNodes< ReverseDigraph< const Orienter<
1381
            const GridGraph, GridGraph::EdgeMap<bool> > > >
1382
    RevSplitGridGraph;
1383
  typedef ReverseDigraph<const RevSplitGridGraph> SplitGridGraph;
1380
  typedef SplitNodes<Orienter< const GridGraph, GridGraph::EdgeMap<bool> > >
1381
    SplitGridGraph;
1384 1382
  typedef Undirector<const SplitGridGraph> USplitGridGraph;
1385
  typedef Undirector<const USplitGridGraph> UUSplitGridGraph;
1386
  checkConcept<concepts::Digraph, RevSplitGridGraph>();
1387 1383
  checkConcept<concepts::Digraph, SplitGridGraph>();
1388 1384
  checkConcept<concepts::Graph, USplitGridGraph>();
1389
  checkConcept<concepts::Graph, UUSplitGridGraph>();
1390 1385

	
1391
  RevSplitGridGraph rev_adaptor =
1392
    splitNodes(reverseDigraph(orienter(graph, dir_map)));
1393
  SplitGridGraph adaptor = reverseDigraph(rev_adaptor);
1386
  SplitGridGraph adaptor = splitNodes(orienter(graph, dir_map));
1394 1387
  USplitGridGraph uadaptor = undirector(adaptor);
1395
  UUSplitGridGraph uuadaptor = undirector(uadaptor);
1396 1388

	
... ...
@@ -1401,19 +1393,19 @@
1401 1393

	
1402
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n1), 1);
1403
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n1), 1);
1404
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n2), 2);
1405
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n2), 1);
1406
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n3), 1);
1407
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n3), 1);
1408
  checkGraphOutArcList(adaptor, rev_adaptor.inNode(n4), 0);
1409
  checkGraphOutArcList(adaptor, rev_adaptor.outNode(n4), 1);
1394
  checkGraphOutArcList(adaptor, adaptor.inNode(n1), 1);
1395
  checkGraphOutArcList(adaptor, adaptor.outNode(n1), 1);
1396
  checkGraphOutArcList(adaptor, adaptor.inNode(n2), 1);
1397
  checkGraphOutArcList(adaptor, adaptor.outNode(n2), 0);
1398
  checkGraphOutArcList(adaptor, adaptor.inNode(n3), 1);
1399
  checkGraphOutArcList(adaptor, adaptor.outNode(n3), 1);
1400
  checkGraphOutArcList(adaptor, adaptor.inNode(n4), 1);
1401
  checkGraphOutArcList(adaptor, adaptor.outNode(n4), 2);
1410 1402

	
1411
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n1), 1);
1412
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n1), 1);
1413
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n2), 1);
1414
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n2), 0);
1415
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n3), 1);
1416
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n3), 1);
1417
  checkGraphInArcList(adaptor, rev_adaptor.inNode(n4), 1);
1418
  checkGraphInArcList(adaptor, rev_adaptor.outNode(n4), 2);
1403
  checkGraphInArcList(adaptor, adaptor.inNode(n1), 1);
1404
  checkGraphInArcList(adaptor, adaptor.outNode(n1), 1);
1405
  checkGraphInArcList(adaptor, adaptor.inNode(n2), 2);
1406
  checkGraphInArcList(adaptor, adaptor.outNode(n2), 1);
1407
  checkGraphInArcList(adaptor, adaptor.inNode(n3), 1);
1408
  checkGraphInArcList(adaptor, adaptor.outNode(n3), 1);
1409
  checkGraphInArcList(adaptor, adaptor.inNode(n4), 0);
1410
  checkGraphInArcList(adaptor, adaptor.outNode(n4), 1);
1419 1411

	
... ...
@@ -1440,25 +1432,10 @@
1440 1432

	
1441
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n1), 2);
1442
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n1), 2);
1443
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n2), 3);
1444
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n2), 1);
1445
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n3), 2);
1446
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n3), 2);
1447
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.inNode(n4), 1);
1448
  checkGraphIncEdgeArcLists(uadaptor, rev_adaptor.outNode(n4), 3);
1449

	
1450
  // Check uuadaptor
1451
  checkGraphNodeList(uuadaptor, 8);
1452
  checkGraphEdgeList(uuadaptor, 16);
1453
  checkGraphArcList(uuadaptor, 32);
1454
  checkGraphConEdgeList(uuadaptor, 16);
1455
  checkGraphConArcList(uuadaptor, 32);
1456

	
1457
  checkNodeIds(uuadaptor);
1458
  checkEdgeIds(uuadaptor);
1459
  checkArcIds(uuadaptor);
1460

	
1461
  checkGraphNodeMap(uuadaptor);
1462
  checkGraphEdgeMap(uuadaptor);
1463
  checkGraphArcMap(uuadaptor);
1433
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n1), 2);
1434
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n1), 2);
1435
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n2), 3);
1436
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n2), 1);
1437
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n3), 2);
1438
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n3), 2);
1439
  checkGraphIncEdgeArcLists(uadaptor, adaptor.inNode(n4), 1);
1440
  checkGraphIncEdgeArcLists(uadaptor, adaptor.outNode(n4), 3);
1464 1441
}
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -85,3 +85,3 @@
85 85
    i = const_bfs_test.queueSize();
86
    
86

	
87 87
    bfs_test.start();
... ...
@@ -106,3 +106,3 @@
106 106
      ::Create bfs_test(G);
107
      
107

	
108 108
    concepts::ReadWriteMap<Node,Arc> pred_map;
... ...
@@ -111,3 +111,3 @@
111 111
    concepts::WriteMap<Node,bool> processed_map;
112
    
112

	
113 113
    bfs_test
... ...
@@ -121,3 +121,3 @@
121 121
    bfs_test.run();
122
    
122

	
123 123
    bfs_test.init();
... ...
@@ -130,3 +130,3 @@
130 130
    i = bfs_test.queueSize();
131
    
131

	
132 132
    bfs_test.start();
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -83,3 +83,3 @@
83 83
  const CirculationType& const_circ_test = circ_test;
84
   
84

	
85 85
  circ_test
... ...
@@ -90,2 +90,7 @@
90 90

	
91
  const CirculationType::Elevator& elev = const_circ_test.elevator();
92
  circ_test.elevator(const_cast<CirculationType::Elevator&>(elev));
93
  CirculationType::Tolerance tol = const_circ_test.tolerance();
94
  circ_test.tolerance(tol);
95

	
91 96
  circ_test.init();
... ...
@@ -99,3 +104,3 @@
99 104
  const_circ_test.barrierMap(bar);
100
  
105

	
101 106
  ignore_unused_variable_warning(fm);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -31,3 +31,3 @@
31 31
  typedef Undirector<Digraph> Graph;
32
  
32

	
33 33
  {
... ...
@@ -36,3 +36,3 @@
36 36
    Graph g(d);
37
    
37

	
38 38
    check(stronglyConnected(d), "The empty digraph is strongly connected");
... ...
@@ -50,3 +50,3 @@
50 50
          "The empty graph has 0 bi-edge-connected component");
51
          
51

	
52 52
    check(dag(d), "The empty digraph is DAG.");
... ...
@@ -84,3 +84,3 @@
84 84
          "This graph has 1 bi-edge-connected component");
85
          
85

	
86 86
    check(dag(d), "This digraph is DAG.");
... ...
@@ -103,3 +103,3 @@
103 103
    Graph g(d);
104
    
104

	
105 105
    Digraph::Node n1 = d.addNode();
... ...
@@ -110,3 +110,3 @@
110 110
    Digraph::Node n6 = d.addNode();
111
    
111

	
112 112
    d.addArc(n1, n3);
... ...
@@ -138,5 +138,5 @@
138 138
    check(!simpleGraph(g), "This graph is not simple.");
139
    
139

	
140 140
    d.addArc(n3, n3);
141
    
141

	
142 142
    check(!loopFree(d), "This digraph is not loop-free.");
... ...
@@ -144,8 +144,8 @@
144 144
    check(!simpleGraph(d), "This digraph is not simple.");
145
    
145

	
146 146
    d.addArc(n3, n2);
147
    
147

	
148 148
    check(!parallelFree(d), "This digraph is not parallel-free.");
149 149
  }
150
  
150

	
151 151
  {
... ...
@@ -154,3 +154,3 @@
154 154
    Graph g(d);
155
    
155

	
156 156
    Digraph::Node n1 = d.addNode();
... ...
@@ -174,3 +174,3 @@
174 174
    d.addArc(n7, n6);
175
   
175

	
176 176
    check(!stronglyConnected(d), "This digraph is not strongly connected");
... ...
@@ -237,3 +237,3 @@
237 237
    Digraph::NodeMap<int> order(d);
238
    
238

	
239 239
    Digraph::Node belt = d.addNode();
... ...
@@ -257,3 +257,3 @@
257 257
    d.addArc(necktie, coat);
258
    
258

	
259 259
    check(dag(d), "This digraph is DAG.");
... ...
@@ -269,3 +269,3 @@
269 269
    ListGraph::NodeMap<bool> map(g);
270
    
270

	
271 271
    ListGraph::Node n1 = g.addNode();
... ...
@@ -285,6 +285,6 @@
285 285
    g.addEdge(n5, n7);
286
   
286

	
287 287
    check(bipartite(g), "This graph is bipartite");
288 288
    check(bipartitePartitions(g, map), "This graph is bipartite");
289
    
289

	
290 290
    check(map[n1] == map[n2] && map[n1] == map[n6] && map[n1] == map[n7],
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -88,3 +88,3 @@
88 88
    i = const_dfs_test.queueSize();
89
    
89

	
90 90
    dfs_test.start();
... ...
@@ -114,3 +114,3 @@
114 114
    concepts::WriteMap<Node,bool> processed_map;
115
    
115

	
116 116
    dfs_test
... ...
@@ -131,3 +131,3 @@
131 131
    i = dfs_test.queueSize();
132
    
132

	
133 133
    dfs_test.start();
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -21,2 +21,3 @@
21 21
#include <lemon/smart_graph.h>
22
#include <lemon/static_graph.h>
22 23
#include <lemon/full_graph.h>
... ...
@@ -37,2 +38,5 @@
37 38

	
39
  G.reserveNode(3);
40
  G.reserveArc(4);
41

	
38 42
  Node
... ...
@@ -285,2 +289,10 @@
285 289
  snapshot.restore();
290
  snapshot.save(G);
291

	
292
  checkGraphNodeList(G, 4);
293
  checkGraphArcList(G, 4);
294

	
295
  G.addArc(G.addNode(), G.addNode());
296

	
297
  snapshot.restore();
286 298

	
... ...
@@ -319,2 +331,6 @@
319 331
  }
332
  { // Checking StaticDigraph
333
    checkConcept<Digraph, StaticDigraph>();
334
    checkConcept<ClearableDigraphComponent<>, StaticDigraph>();
335
  }
320 336
  { // Checking FullDigraph
... ...
@@ -374,2 +390,109 @@
374 390

	
391
void checkStaticDigraph() {
392
  SmartDigraph g;
393
  SmartDigraph::NodeMap<StaticDigraph::Node> nref(g);
394
  SmartDigraph::ArcMap<StaticDigraph::Arc> aref(g);
395

	
396
  StaticDigraph G;
397

	
398
  checkGraphNodeList(G, 0);
399
  checkGraphArcList(G, 0);
400

	
401
  G.build(g, nref, aref);
402

	
403
  checkGraphNodeList(G, 0);
404
  checkGraphArcList(G, 0);
405

	
406
  SmartDigraph::Node
407
    n1 = g.addNode(),
408
    n2 = g.addNode(),
409
    n3 = g.addNode();
410

	
411
  G.build(g, nref, aref);
412

	
413
  checkGraphNodeList(G, 3);
414
  checkGraphArcList(G, 0);
415

	
416
  SmartDigraph::Arc a1 = g.addArc(n1, n2);
417

	
418
  G.build(g, nref, aref);
419

	
420
  check(G.source(aref[a1]) == nref[n1] && G.target(aref[a1]) == nref[n2],
421
        "Wrong arc or wrong references");
422
  checkGraphNodeList(G, 3);
423
  checkGraphArcList(G, 1);
424

	
425
  checkGraphOutArcList(G, nref[n1], 1);
426
  checkGraphOutArcList(G, nref[n2], 0);
427
  checkGraphOutArcList(G, nref[n3], 0);
428

	
429
  checkGraphInArcList(G, nref[n1], 0);
430
  checkGraphInArcList(G, nref[n2], 1);
431
  checkGraphInArcList(G, nref[n3], 0);
432

	
433
  checkGraphConArcList(G, 1);
434

	
435
  SmartDigraph::Arc
436
    a2 = g.addArc(n2, n1),
437
    a3 = g.addArc(n2, n3),
438
    a4 = g.addArc(n2, n3);
439

	
440
  digraphCopy(g, G).nodeRef(nref).run();
441

	
442
  checkGraphNodeList(G, 3);
443
  checkGraphArcList(G, 4);
444

	
445
  checkGraphOutArcList(G, nref[n1], 1);
446
  checkGraphOutArcList(G, nref[n2], 3);
447
  checkGraphOutArcList(G, nref[n3], 0);
448

	
449
  checkGraphInArcList(G, nref[n1], 1);
450
  checkGraphInArcList(G, nref[n2], 1);
451
  checkGraphInArcList(G, nref[n3], 2);
452

	
453
  checkGraphConArcList(G, 4);
454

	
455
  std::vector<std::pair<int,int> > arcs;
456
  arcs.push_back(std::make_pair(0,1));
457
  arcs.push_back(std::make_pair(0,2));
458
  arcs.push_back(std::make_pair(1,3));
459
  arcs.push_back(std::make_pair(1,2));
460
  arcs.push_back(std::make_pair(3,0));
461
  arcs.push_back(std::make_pair(3,3));
462
  arcs.push_back(std::make_pair(4,2));
463
  arcs.push_back(std::make_pair(4,3));
464
  arcs.push_back(std::make_pair(4,1));
465

	
466
  G.build(6, arcs.begin(), arcs.end());
467

	
468
  checkGraphNodeList(G, 6);
469
  checkGraphArcList(G, 9);
470

	
471
  checkGraphOutArcList(G, G.node(0), 2);
472
  checkGraphOutArcList(G, G.node(1), 2);
473
  checkGraphOutArcList(G, G.node(2), 0);
474
  checkGraphOutArcList(G, G.node(3), 2);
475
  checkGraphOutArcList(G, G.node(4), 3);
476
  checkGraphOutArcList(G, G.node(5), 0);
477

	
478
  checkGraphInArcList(G, G.node(0), 1);
479
  checkGraphInArcList(G, G.node(1), 2);
480
  checkGraphInArcList(G, G.node(2), 3);
481
  checkGraphInArcList(G, G.node(3), 3);
482
  checkGraphInArcList(G, G.node(4), 0);
483
  checkGraphInArcList(G, G.node(5), 0);
484

	
485
  checkGraphConArcList(G, 9);
486

	
487
  checkNodeIds(G);
488
  checkArcIds(G);
489
  checkGraphNodeMap(G);
490
  checkGraphArcMap(G);
491

	
492
  int n = G.nodeNum();
493
  int m = G.arcNum();
494
  check(G.index(G.node(n-1)) == n-1, "Wrong index.");
495
  check(G.index(G.arc(m-1)) == m-1, "Wrong index.");
496
}
497

	
375 498
void checkFullDigraph(int num) {
... ...
@@ -377,3 +500,8 @@
377 500
  DIGRAPH_TYPEDEFS(Digraph);
501

	
378 502
  Digraph G(num);
503
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
504

	
505
  G.resize(num);
506
  check(G.nodeNum() == num && G.arcNum() == num * num, "Wrong size");
379 507

	
... ...
@@ -421,2 +549,5 @@
421 549
  }
550
  { // Checking StaticDigraph
551
    checkStaticDigraph();
552
  }
422 553
  { // Checking FullDigraph
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -87,3 +87,3 @@
87 87
    i = const_dijkstra_test.queueSize();
88
    
88

	
89 89
    dijkstra_test.start();
... ...
@@ -111,3 +111,3 @@
111 111
      ::SetStandardHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> > >
112
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >, 
112
      ::SetHeap<BinHeap<VType, concepts::ReadWriteMap<Node,int> >,
113 113
                concepts::ReadWriteMap<Node,int> >
... ...
@@ -121,3 +121,3 @@
121 121
    BinHeap<VType, concepts::ReadWriteMap<Node,int> > heap(heap_cross_ref);
122
    
122

	
123 123
    dijkstra_test
... ...
@@ -138,3 +138,3 @@
138 138
    i = dijkstra_test.queueSize();
139
    
139

	
140 140
    dijkstra_test.start();
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -87,3 +87,3 @@
87 87
  typedef Undirector<Digraph> Graph;
88
  
88

	
89 89
  {
... ...
@@ -91,3 +91,3 @@
91 91
    Graph g(d);
92
    
92

	
93 93
    checkDiEulerIt(d);
... ...
@@ -130,3 +130,3 @@
130 130
    Digraph::Node n3 = d.addNode();
131
    
131

	
132 132
    d.addArc(n1, n2);
... ...
@@ -155,3 +155,3 @@
155 155
    Digraph::Node n6 = d.addNode();
156
    
156

	
157 157
    d.addArc(n1, n2);
... ...
@@ -191,3 +191,3 @@
191 191
    Digraph::Node n5 = d.addNode();
192
    
192

	
193 193
    d.addArc(n1, n2);
... ...
@@ -213,3 +213,3 @@
213 213
    Digraph::Node n3 = d.addNode();
214
    
214

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

	
1 19
#include <iostream>
... ...
@@ -35,3 +53,3 @@
35 53
  "target 3\n";
36
  
54

	
37 55
void checkGomoryHuCompile()
... ...
@@ -71,3 +89,3 @@
71 89
int cutValue(const Graph& graph, const BoolNodeMap& cut,
72
	     const IntEdgeMap& capacity) {
90
             const IntEdgeMap& capacity) {
73 91

	
... ...
@@ -109,3 +127,3 @@
109 127
      for(GomoryHu<Graph>::MinCutEdgeIt a(ght, u, v);a!=INVALID;++a)
110
        sum+=capacity[a]; 
128
        sum+=capacity[a];
111 129
      check(sum == ght.minCutValue(u, v), "Problem with MinCutEdgeIt");
... ...
@@ -120,3 +138,3 @@
120 138
  }
121
  
139

	
122 140
  return 0;
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -40,2 +40,5 @@
40 40

	
41
  G.reserveNode(3);
42
  G.reserveEdge(3);
43

	
41 44
  Node
... ...
@@ -258,2 +261,11 @@
258 261
  snapshot.restore();
262
  snapshot.save(G);
263

	
264
  checkGraphNodeList(G, 4);
265
  checkGraphEdgeList(G, 3);
266
  checkGraphArcList(G, 6);
267

	
268
  G.addEdge(G.addNode(), G.addNode());
269

	
270
  snapshot.restore();
259 271

	
... ...
@@ -269,2 +281,9 @@
269 281
  Graph G(num);
282
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
283
        "Wrong size");
284

	
285
  G.resize(num);
286
  check(G.nodeNum() == num && G.edgeNum() == num * (num - 1) / 2,
287
        "Wrong size");
288

	
270 289
  checkGraphNodeList(G, num);
... ...
@@ -413,2 +432,6 @@
413 432

	
433
  G.resize(width, height);
434
  check(G.width() == width, "Wrong column number");
435
  check(G.height() == height, "Wrong row number");
436

	
414 437
  for (int i = 0; i < width; ++i) {
... ...
@@ -488,2 +511,7 @@
488 511
  HypercubeGraph G(dim);
512
  check(G.dimension() == dim, "Wrong dimension");
513

	
514
  G.resize(dim);
515
  check(G.dimension() == dim, "Wrong dimension");
516

	
489 517
  checkGraphNodeList(G, 1 << dim);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -85,3 +85,3 @@
85 85
template <typename Graph, typename CapMap, typename CutMap>
86
typename CapMap::Value 
86
typename CapMap::Value
87 87
  cutValue(const Graph& graph, const CapMap& cap, const CutMap& cut)
... ...
@@ -112,3 +112,3 @@
112 112
    ho.minCutMap(cut);
113
    
113

	
114 114
    check(ho.minCutValue() == 1, "Wrong cut value");
... ...
@@ -128,3 +128,3 @@
128 128
    ho.minCutMap(cut);
129
    
129

	
130 130
    check(ho.minCutValue() == 1, "Wrong cut value");
... ...
@@ -132,6 +132,6 @@
132 132
  }
133
  
133

	
134 134
  typedef Undirector<SmartDigraph> UGraph;
135 135
  UGraph ugraph(graph);
136
  
136

	
137 137
  {
... ...
@@ -140,3 +140,3 @@
140 140
    ho.minCutMap(cut);
141
    
141

	
142 142
    check(ho.minCutValue() == 2, "Wrong cut value");
... ...
@@ -148,3 +148,3 @@
148 148
    ho.minCutMap(cut);
149
    
149

	
150 150
    check(ho.minCutValue() == 5, "Wrong cut value");
... ...
@@ -156,3 +156,3 @@
156 156
    ho.minCutMap(cut);
157
    
157

	
158 158
    check(ho.minCutValue() == 5, "Wrong cut value");
Ignore white space 6 line context
... ...
@@ -27,3 +27,2 @@
27 27
#include <lemon/smart_graph.h>
28

	
29 28
#include <lemon/lgf_reader.h>
... ...
@@ -33,4 +32,8 @@
33 32
#include <lemon/bin_heap.h>
33
#include <lemon/quad_heap.h>
34
#include <lemon/dheap.h>
34 35
#include <lemon/fib_heap.h>
36
#include <lemon/pairing_heap.h>
35 37
#include <lemon/radix_heap.h>
38
#include <lemon/binomial_heap.h>
36 39
#include <lemon/bucket_heap.h>
... ...
@@ -91,3 +94,2 @@
91 94
  RangeMap<int> map(test_len, -1);
92

	
93 95
  Heap heap(map);
... ...
@@ -95,3 +97,2 @@
95 97
  std::vector<int> v(test_len);
96

	
97 98
  for (int i = 0; i < test_len; ++i) {
... ...
@@ -102,3 +103,3 @@
102 103
  for (int i = 0; i < test_len; ++i) {
103
    check(v[i] == heap.prio() ,"Wrong order in heap sort.");
104
    check(v[i] == heap.prio(), "Wrong order in heap sort.");
104 105
    heap.pop();
... ...
@@ -114,3 +115,2 @@
114 115
  std::vector<int> v(test_len);
115

	
116 116
  for (int i = 0; i < test_len; ++i) {
... ...
@@ -125,3 +125,3 @@
125 125
  for (int i = 0; i < test_len; ++i) {
126
    check(v[i] == heap.prio() ,"Wrong order in heap increase test.");
126
    check(v[i] == heap.prio(), "Wrong order in heap increase test.");
127 127
    heap.pop();
... ...
@@ -130,4 +130,2 @@
130 130

	
131

	
132

	
133 131
template <typename Heap>
... ...
@@ -146,3 +144,3 @@
146 144
      check( dijkstra.dist(t) - dijkstra.dist(s) <= length[a],
147
             "Error in a shortest path tree!");
145
             "Error in shortest path tree.");
148 146
    }
... ...
@@ -155,3 +153,3 @@
155 153
      check( dijkstra.dist(n) - dijkstra.dist(s) == length[a],
156
             "Error in a shortest path tree!");
154
             "Error in shortest path tree.");
157 155
    }
... ...
@@ -177,2 +175,3 @@
177 175

	
176
  // BinHeap
178 177
  {
... ...
@@ -188,2 +187,89 @@
188 187

	
188
  // QuadHeap
189
  {
190
    typedef QuadHeap<Prio, ItemIntMap> IntHeap;
191
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
192
    heapSortTest<IntHeap>();
193
    heapIncreaseTest<IntHeap>();
194

	
195
    typedef QuadHeap<Prio, IntNodeMap > NodeHeap;
196
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
197
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
198
  }
199

	
200
  // DHeap
201
  {
202
    typedef DHeap<Prio, ItemIntMap> IntHeap;
203
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
204
    heapSortTest<IntHeap>();
205
    heapIncreaseTest<IntHeap>();
206

	
207
    typedef DHeap<Prio, IntNodeMap > NodeHeap;
208
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
209
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
210
  }
211

	
212
  // FibHeap
213
  {
214
    typedef FibHeap<Prio, ItemIntMap> IntHeap;
215
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
216
    heapSortTest<IntHeap>();
217
    heapIncreaseTest<IntHeap>();
218

	
219
    typedef FibHeap<Prio, IntNodeMap > NodeHeap;
220
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
221
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
222
  }
223

	
224
  // PairingHeap
225
  {
226
    typedef PairingHeap<Prio, ItemIntMap> IntHeap;
227
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
228
    heapSortTest<IntHeap>();
229
    heapIncreaseTest<IntHeap>();
230

	
231
    typedef PairingHeap<Prio, IntNodeMap > NodeHeap;
232
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
233
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
234
  }
235

	
236
  // RadixHeap
237
  {
238
    typedef RadixHeap<ItemIntMap> IntHeap;
239
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
240
    heapSortTest<IntHeap>();
241
    heapIncreaseTest<IntHeap>();
242

	
243
    typedef RadixHeap<IntNodeMap > NodeHeap;
244
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
245
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
246
  }
247

	
248
  // BinomialHeap
249
  {
250
    typedef BinomialHeap<Prio, ItemIntMap> IntHeap;
251
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
252
    heapSortTest<IntHeap>();
253
    heapIncreaseTest<IntHeap>();
254

	
255
    typedef BinomialHeap<Prio, IntNodeMap > NodeHeap;
256
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
257
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
258
  }
259

	
260
  // BucketHeap, SimpleBucketHeap
261
  {
262
    typedef BucketHeap<ItemIntMap> IntHeap;
263
    checkConcept<Heap<Prio, ItemIntMap>, IntHeap>();
264
    heapSortTest<IntHeap>();
265
    heapIncreaseTest<IntHeap>();
266

	
267
    typedef BucketHeap<IntNodeMap > NodeHeap;
268
    checkConcept<Heap<Prio, IntNodeMap >, NodeHeap>();
269
    dijkstraHeapTest<NodeHeap>(digraph, length, source);
270

	
271
    typedef SimpleBucketHeap<ItemIntMap> SimpleIntHeap;
272
    heapSortTest<SimpleIntHeap>();
273
  }
274

	
189 275
  {
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -25,2 +25,6 @@
25 25
#include <lemon/list_graph.h>
26
#include <lemon/smart_graph.h>
27
#include <lemon/adaptors.h>
28
#include <lemon/dfs.h>
29
#include <algorithm>
26 30

	
... ...
@@ -36,5 +40,18 @@
36 40
class C {
37
  int x;
41
  int _x;
38 42
public:
39
  C(int _x) : x(_x) {}
43
  C(int x) : _x(x) {}
44
  int get() const { return _x; }
45
};
46
inline bool operator<(C c1, C c2) { return c1.get() < c2.get(); }
47
inline bool operator==(C c1, C c2) { return c1.get() == c2.get(); }
48

	
49
C createC(int x) { return C(x); }
50

	
51
template <typename T>
52
class Less {
53
  T _t;
54
public:
55
  Less(T t): _t(t) {}
56
  bool operator()(const T& t) const { return t < _t; }
40 57
};
... ...
@@ -55,2 +72,10 @@
55 72

	
73
template <typename T>
74
class Sum {
75
  T& _sum;
76
public:
77
  Sum(T& sum) : _sum(sum) {}
78
  void operator()(const T& t) { _sum += t; }
79
};
80

	
56 81
typedef ReadMap<A, double> DoubleMap;
... ...
@@ -202,3 +227,4 @@
202 227
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
203
    MapToFunctor<ReadMap<A,B> > map = MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
228
    MapToFunctor<ReadMap<A,B> > map =
229
      MapToFunctor<ReadMap<A,B> >(ReadMap<A,B>());
204 230

	
... ...
@@ -331,2 +357,6 @@
331 357
    typedef std::vector<int> vec;
358
    checkConcept<WriteMap<int, bool>, LoggerBoolMap<vec::iterator> >();
359
    checkConcept<WriteMap<int, bool>,
360
                 LoggerBoolMap<std::back_insert_iterator<vec> > >();
361

	
332 362
    vec v1;
... ...
@@ -350,4 +380,154 @@
350 380
      check(v1[i++] == *it, "Something is wrong with LoggerBoolMap");
381

	
382
    typedef ListDigraph Graph;
383
    DIGRAPH_TYPEDEFS(Graph);
384
    Graph gr;
385

	
386
    Node n0 = gr.addNode();
387
    Node n1 = gr.addNode();
388
    Node n2 = gr.addNode();
389
    Node n3 = gr.addNode();
390

	
391
    gr.addArc(n3, n0);
392
    gr.addArc(n3, n2);
393
    gr.addArc(n0, n2);
394
    gr.addArc(n2, n1);
395
    gr.addArc(n0, n1);
396

	
397
    {
398
      std::vector<Node> v;
399
      dfs(gr).processedMap(loggerBoolMap(std::back_inserter(v))).run();
400

	
401
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
402
            "Something is wrong with LoggerBoolMap");
403
    }
404
    {
405
      std::vector<Node> v(countNodes(gr));
406
      dfs(gr).processedMap(loggerBoolMap(v.begin())).run();
407

	
408
      check(v.size()==4 && v[0]==n1 && v[1]==n2 && v[2]==n0 && v[3]==n3,
409
            "Something is wrong with LoggerBoolMap");
410
    }
351 411
  }
352
  
412

	
413
  // IdMap, RangeIdMap
414
  {
415
    typedef ListDigraph Graph;
416
    DIGRAPH_TYPEDEFS(Graph);
417

	
418
    checkConcept<ReadMap<Node, int>, IdMap<Graph, Node> >();
419
    checkConcept<ReadMap<Arc, int>, IdMap<Graph, Arc> >();
420
    checkConcept<ReadMap<Node, int>, RangeIdMap<Graph, Node> >();
421
    checkConcept<ReadMap<Arc, int>, RangeIdMap<Graph, Arc> >();
422

	
423
    Graph gr;
424
    IdMap<Graph, Node> nmap(gr);
425
    IdMap<Graph, Arc> amap(gr);
426
    RangeIdMap<Graph, Node> nrmap(gr);
427
    RangeIdMap<Graph, Arc> armap(gr);
428

	
429
    Node n0 = gr.addNode();
430
    Node n1 = gr.addNode();
431
    Node n2 = gr.addNode();
432

	
433
    Arc a0 = gr.addArc(n0, n1);
434
    Arc a1 = gr.addArc(n0, n2);
435
    Arc a2 = gr.addArc(n2, n1);
436
    Arc a3 = gr.addArc(n2, n0);
437

	
438
    check(nmap[n0] == gr.id(n0) && nmap(gr.id(n0)) == n0, "Wrong IdMap");
439
    check(nmap[n1] == gr.id(n1) && nmap(gr.id(n1)) == n1, "Wrong IdMap");
440
    check(nmap[n2] == gr.id(n2) && nmap(gr.id(n2)) == n2, "Wrong IdMap");
441

	
442
    check(amap[a0] == gr.id(a0) && amap(gr.id(a0)) == a0, "Wrong IdMap");
443
    check(amap[a1] == gr.id(a1) && amap(gr.id(a1)) == a1, "Wrong IdMap");
444
    check(amap[a2] == gr.id(a2) && amap(gr.id(a2)) == a2, "Wrong IdMap");
445
    check(amap[a3] == gr.id(a3) && amap(gr.id(a3)) == a3, "Wrong IdMap");
446

	
447
    check(nmap.inverse()[gr.id(n0)] == n0, "Wrong IdMap::InverseMap");
448
    check(amap.inverse()[gr.id(a0)] == a0, "Wrong IdMap::InverseMap");
449

	
450
    check(nrmap.size() == 3 && armap.size() == 4,
451
          "Wrong RangeIdMap::size()");
452

	
453
    check(nrmap[n0] == 0 && nrmap(0) == n0, "Wrong RangeIdMap");
454
    check(nrmap[n1] == 1 && nrmap(1) == n1, "Wrong RangeIdMap");
455
    check(nrmap[n2] == 2 && nrmap(2) == n2, "Wrong RangeIdMap");
456

	
457
    check(armap[a0] == 0 && armap(0) == a0, "Wrong RangeIdMap");
458
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
459
    check(armap[a2] == 2 && armap(2) == a2, "Wrong RangeIdMap");
460
    check(armap[a3] == 3 && armap(3) == a3, "Wrong RangeIdMap");
461

	
462
    check(nrmap.inverse()[0] == n0, "Wrong RangeIdMap::InverseMap");
463
    check(armap.inverse()[0] == a0, "Wrong RangeIdMap::InverseMap");
464

	
465
    gr.erase(n1);
466

	
467
    if (nrmap[n0] == 1) nrmap.swap(n0, n2);
468
    nrmap.swap(n2, n0);
469
    if (armap[a1] == 1) armap.swap(a1, a3);
470
    armap.swap(a3, a1);
471

	
472
    check(nrmap.size() == 2 && armap.size() == 2,
473
          "Wrong RangeIdMap::size()");
474

	
475
    check(nrmap[n0] == 1 && nrmap(1) == n0, "Wrong RangeIdMap");
476
    check(nrmap[n2] == 0 && nrmap(0) == n2, "Wrong RangeIdMap");
477

	
478
    check(armap[a1] == 1 && armap(1) == a1, "Wrong RangeIdMap");
479
    check(armap[a3] == 0 && armap(0) == a3, "Wrong RangeIdMap");
480

	
481
    check(nrmap.inverse()[0] == n2, "Wrong RangeIdMap::InverseMap");
482
    check(armap.inverse()[0] == a3, "Wrong RangeIdMap::InverseMap");
483
  }
484

	
485
  // SourceMap, TargetMap, ForwardMap, BackwardMap, InDegMap, OutDegMap
486
  {
487
    typedef ListGraph Graph;
488
    GRAPH_TYPEDEFS(Graph);
489

	
490
    checkConcept<ReadMap<Arc, Node>, SourceMap<Graph> >();
491
    checkConcept<ReadMap<Arc, Node>, TargetMap<Graph> >();
492
    checkConcept<ReadMap<Edge, Arc>, ForwardMap<Graph> >();
493
    checkConcept<ReadMap<Edge, Arc>, BackwardMap<Graph> >();
494
    checkConcept<ReadMap<Node, int>, InDegMap<Graph> >();
495
    checkConcept<ReadMap<Node, int>, OutDegMap<Graph> >();
496

	
497
    Graph gr;
498
    Node n0 = gr.addNode();
499
    Node n1 = gr.addNode();
500
    Node n2 = gr.addNode();
501

	
502
    gr.addEdge(n0,n1);
503
    gr.addEdge(n1,n2);
504
    gr.addEdge(n0,n2);
505
    gr.addEdge(n2,n1);
506
    gr.addEdge(n1,n2);
507
    gr.addEdge(n0,n1);
508

	
509
    for (EdgeIt e(gr); e != INVALID; ++e) {
510
      check(forwardMap(gr)[e] == gr.direct(e, true), "Wrong ForwardMap");
511
      check(backwardMap(gr)[e] == gr.direct(e, false), "Wrong BackwardMap");
512
    }
513

	
514
    check(mapCompare(gr,
515
          sourceMap(orienter(gr, constMap<Edge, bool>(true))),
516
          targetMap(orienter(gr, constMap<Edge, bool>(false)))),
517
          "Wrong SourceMap or TargetMap");
518

	
519
    typedef Orienter<Graph, const ConstMap<Edge, bool> > Digraph;
520
    Digraph dgr(gr, constMap<Edge, bool>(true));
521
    OutDegMap<Digraph> odm(dgr);
522
    InDegMap<Digraph> idm(dgr);
523

	
524
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 1, "Wrong OutDegMap");
525
    check(idm[n0] == 0 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
526

	
527
    gr.addEdge(n2, n0);
528

	
529
    check(odm[n0] == 3 && odm[n1] == 2 && odm[n2] == 2, "Wrong OutDegMap");
530
    check(idm[n0] == 1 && idm[n1] == 3 && idm[n2] == 3, "Wrong InDegMap");
531
  }
532

	
353 533
  // CrossRefMap
... ...
@@ -359,3 +539,70 @@
359 539
                 CrossRefMap<Graph, Node, int> >();
360
    
540
    checkConcept<ReadWriteMap<Node, bool>,
541
                 CrossRefMap<Graph, Node, bool> >();
542
    checkConcept<ReadWriteMap<Node, double>,
543
                 CrossRefMap<Graph, Node, double> >();
544

	
545
    Graph gr;
546
    typedef CrossRefMap<Graph, Node, char> CRMap;
547
    CRMap map(gr);
548

	
549
    Node n0 = gr.addNode();
550
    Node n1 = gr.addNode();
551
    Node n2 = gr.addNode();
552

	
553
    map.set(n0, 'A');
554
    map.set(n1, 'B');
555
    map.set(n2, 'C');
556

	
557
    check(map[n0] == 'A' && map('A') == n0 && map.inverse()['A'] == n0,
558
          "Wrong CrossRefMap");
559
    check(map[n1] == 'B' && map('B') == n1 && map.inverse()['B'] == n1,
560
          "Wrong CrossRefMap");
561
    check(map[n2] == 'C' && map('C') == n2 && map.inverse()['C'] == n2,
562
          "Wrong CrossRefMap");
563
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
564
          "Wrong CrossRefMap::count()");
565

	
566
    CRMap::ValueIt it = map.beginValue();
567
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
568
          it == map.endValue(), "Wrong value iterator");
569

	
570
    map.set(n2, 'A');
571

	
572
    check(map[n0] == 'A' && map[n1] == 'B' && map[n2] == 'A',
573
          "Wrong CrossRefMap");
574
    check(map('A') == n0 && map.inverse()['A'] == n0, "Wrong CrossRefMap");
575
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
576
    check(map('C') == INVALID && map.inverse()['C'] == INVALID,
577
          "Wrong CrossRefMap");
578
    check(map.count('A') == 2 && map.count('B') == 1 && map.count('C') == 0,
579
          "Wrong CrossRefMap::count()");
580

	
581
    it = map.beginValue();
582
    check(*it++ == 'A' && *it++ == 'A' && *it++ == 'B' &&
583
          it == map.endValue(), "Wrong value iterator");
584

	
585
    map.set(n0, 'C');
586

	
587
    check(map[n0] == 'C' && map[n1] == 'B' && map[n2] == 'A',
588
          "Wrong CrossRefMap");
589
    check(map('A') == n2 && map.inverse()['A'] == n2, "Wrong CrossRefMap");
590
    check(map('B') == n1 && map.inverse()['B'] == n1, "Wrong CrossRefMap");
591
    check(map('C') == n0 && map.inverse()['C'] == n0, "Wrong CrossRefMap");
592
    check(map.count('A') == 1 && map.count('B') == 1 && map.count('C') == 1,
593
          "Wrong CrossRefMap::count()");
594

	
595
    it = map.beginValue();
596
    check(*it++ == 'A' && *it++ == 'B' && *it++ == 'C' &&
597
          it == map.endValue(), "Wrong value iterator");
598
  }
599

	
600
  // CrossRefMap
601
  {
602
    typedef SmartDigraph Graph;
603
    DIGRAPH_TYPEDEFS(Graph);
604

	
605
    checkConcept<ReadWriteMap<Node, int>,
606
                 CrossRefMap<Graph, Node, int> >();
607

	
361 608
    Graph gr;
... ...
@@ -364,3 +611,3 @@
364 611
    CRMap map(gr);
365
    
612

	
366 613
    Node n0 = gr.addNode();
... ...
@@ -368,3 +615,3 @@
368 615
    Node n2 = gr.addNode();
369
    
616

	
370 617
    map.set(n0, 'A');
... ...
@@ -386,2 +633,370 @@
386 633

	
634
  // Iterable bool map
635
  {
636
    typedef SmartGraph Graph;
637
    typedef SmartGraph::Node Item;
638

	
639
    typedef IterableBoolMap<SmartGraph, SmartGraph::Node> Ibm;
640
    checkConcept<ReferenceMap<Item, bool, bool&, const bool&>, Ibm>();
641

	
642
    const int num = 10;
643
    Graph g;
644
    Ibm map0(g, true);
645
    std::vector<Item> items;
646
    for (int i = 0; i < num; ++i) {
647
      items.push_back(g.addNode());
648
    }
649

	
650
    Ibm map1(g, true);
651
    int n = 0;
652
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
653
      check(map1[static_cast<Item>(it)], "Wrong TrueIt");
654
      ++n;
655
    }
656
    check(n == num, "Wrong number");
657

	
658
    n = 0;
659
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
660
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
661
        ++n;
662
    }
663
    check(n == num, "Wrong number");
664
    check(Ibm::FalseIt(map1) == INVALID, "Wrong FalseIt");
665
    check(Ibm::ItemIt(map1, false) == INVALID, "Wrong ItemIt for false");
666

	
667
    map1[items[5]] = true;
668

	
669
    n = 0;
670
    for (Ibm::ItemIt it(map1, true); it != INVALID; ++it) {
671
        check(map1[static_cast<Item>(it)], "Wrong ItemIt for true");
672
        ++n;
673
    }
674
    check(n == num, "Wrong number");
675

	
676
    map1[items[num / 2]] = false;
677
    check(map1[items[num / 2]] == false, "Wrong map value");
678

	
679
    n = 0;
680
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
681
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
682
        ++n;
683
    }
684
    check(n == num - 1, "Wrong number");
685

	
686
    n = 0;
687
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
688
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
689
        ++n;
690
    }
691
    check(n == 1, "Wrong number");
692

	
693
    map1[items[0]] = false;
694
    check(map1[items[0]] == false, "Wrong map value");
695

	
696
    map1[items[num - 1]] = false;
697
    check(map1[items[num - 1]] == false, "Wrong map value");
698

	
699
    n = 0;
700
    for (Ibm::TrueIt it(map1); it != INVALID; ++it) {
701
        check(map1[static_cast<Item>(it)], "Wrong TrueIt for true");
702
        ++n;
703
    }
704
    check(n == num - 3, "Wrong number");
705
    check(map1.trueNum() == num - 3, "Wrong number");
706

	
707
    n = 0;
708
    for (Ibm::FalseIt it(map1); it != INVALID; ++it) {
709
        check(!map1[static_cast<Item>(it)], "Wrong FalseIt for true");
710
        ++n;
711
    }
712
    check(n == 3, "Wrong number");
713
    check(map1.falseNum() == 3, "Wrong number");
714
  }
715

	
716
  // Iterable int map
717
  {
718
    typedef SmartGraph Graph;
719
    typedef SmartGraph::Node Item;
720
    typedef IterableIntMap<SmartGraph, SmartGraph::Node> Iim;
721

	
722
    checkConcept<ReferenceMap<Item, int, int&, const int&>, Iim>();
723

	
724
    const int num = 10;
725
    Graph g;
726
    Iim map0(g, 0);
727
    std::vector<Item> items;
728
    for (int i = 0; i < num; ++i) {
729
      items.push_back(g.addNode());
730
    }
731

	
732
    Iim map1(g);
733
    check(map1.size() == 0, "Wrong size");
734

	
735
    for (int i = 0; i < num; ++i) {
736
      map1[items[i]] = i;
737
    }
738
    check(map1.size() == num, "Wrong size");
739

	
740
    for (int i = 0; i < num; ++i) {
741
      Iim::ItemIt it(map1, i);
742
      check(static_cast<Item>(it) == items[i], "Wrong value");
743
      ++it;
744
      check(static_cast<Item>(it) == INVALID, "Wrong value");
745
    }
746

	
747
    for (int i = 0; i < num; ++i) {
748
      map1[items[i]] = i % 2;
749
    }
750
    check(map1.size() == 2, "Wrong size");
751

	
752
    int n = 0;
753
    for (Iim::ItemIt it(map1, 0); it != INVALID; ++it) {
754
      check(map1[static_cast<Item>(it)] == 0, "Wrong value");
755
      ++n;
756
    }
757
    check(n == (num + 1) / 2, "Wrong number");
758

	
759
    for (Iim::ItemIt it(map1, 1); it != INVALID; ++it) {
760
      check(map1[static_cast<Item>(it)] == 1, "Wrong value");
761
      ++n;
762
    }
763
    check(n == num, "Wrong number");
764

	
765
  }
766

	
767
  // Iterable value map
768
  {
769
    typedef SmartGraph Graph;
770
    typedef SmartGraph::Node Item;
771
    typedef IterableValueMap<SmartGraph, SmartGraph::Node, double> Ivm;
772

	
773
    checkConcept<ReadWriteMap<Item, double>, Ivm>();
774

	
775
    const int num = 10;
776
    Graph g;
777
    Ivm map0(g, 0.0);
778
    std::vector<Item> items;
779
    for (int i = 0; i < num; ++i) {
780
      items.push_back(g.addNode());
781
    }
782

	
783
    Ivm map1(g, 0.0);
784
    check(distance(map1.beginValue(), map1.endValue()) == 1, "Wrong size");
785
    check(*map1.beginValue() == 0.0, "Wrong value");
786

	
787
    for (int i = 0; i < num; ++i) {
788
      map1.set(items[i], static_cast<double>(i));
789
    }
790
    check(distance(map1.beginValue(), map1.endValue()) == num, "Wrong size");
791

	
792
    for (int i = 0; i < num; ++i) {
793
      Ivm::ItemIt it(map1, static_cast<double>(i));
794
      check(static_cast<Item>(it) == items[i], "Wrong value");
795
      ++it;
796
      check(static_cast<Item>(it) == INVALID, "Wrong value");
797
    }
798

	
799
    for (Ivm::ValueIt vit = map1.beginValue();
800
         vit != map1.endValue(); ++vit) {
801
      check(map1[static_cast<Item>(Ivm::ItemIt(map1, *vit))] == *vit,
802
            "Wrong ValueIt");
803
    }
804

	
805
    for (int i = 0; i < num; ++i) {
806
      map1.set(items[i], static_cast<double>(i % 2));
807
    }
808
    check(distance(map1.beginValue(), map1.endValue()) == 2, "Wrong size");
809

	
810
    int n = 0;
811
    for (Ivm::ItemIt it(map1, 0.0); it != INVALID; ++it) {
812
      check(map1[static_cast<Item>(it)] == 0.0, "Wrong value");
813
      ++n;
814
    }
815
    check(n == (num + 1) / 2, "Wrong number");
816

	
817
    for (Ivm::ItemIt it(map1, 1.0); it != INVALID; ++it) {
818
      check(map1[static_cast<Item>(it)] == 1.0, "Wrong value");
819
      ++n;
820
    }
821
    check(n == num, "Wrong number");
822

	
823
  }
824

	
825
  // Graph map utilities:
826
  // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
827
  // mapFind(), mapFindIf(), mapCount(), mapCountIf()
828
  // mapCopy(), mapCompare(), mapFill()
829
  {
830
    DIGRAPH_TYPEDEFS(SmartDigraph);
831

	
832
    SmartDigraph g;
833
    Node n1 = g.addNode();
834
    Node n2 = g.addNode();
835
    Node n3 = g.addNode();
836

	
837
    SmartDigraph::NodeMap<int> map1(g);
838
    SmartDigraph::ArcMap<char> map2(g);
839
    ConstMap<Node, A> cmap1 = A();
840
    ConstMap<Arc, C> cmap2 = C(0);
841

	
842
    map1[n1] = 10;
843
    map1[n2] = 5;
844
    map1[n3] = 12;
845

	
846
    // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
847
    check(mapMin(g, map1) == n2, "Wrong mapMin()");
848
    check(mapMax(g, map1) == n3, "Wrong mapMax()");
849
    check(mapMin(g, map1, std::greater<int>()) == n3, "Wrong mapMin()");
850
    check(mapMax(g, map1, std::greater<int>()) == n2, "Wrong mapMax()");
851
    check(mapMinValue(g, map1) == 5, "Wrong mapMinValue()");
852
    check(mapMaxValue(g, map1) == 12, "Wrong mapMaxValue()");
853

	
854
    check(mapMin(g, map2) == INVALID, "Wrong mapMin()");
855
    check(mapMax(g, map2) == INVALID, "Wrong mapMax()");
856

	
857
    check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
858
    check(mapMax(g, cmap2) == INVALID, "Wrong mapMax()");
859

	
860
    Arc a1 = g.addArc(n1, n2);
861
    Arc a2 = g.addArc(n1, n3);
862
    Arc a3 = g.addArc(n2, n3);
863
    Arc a4 = g.addArc(n3, n1);
864

	
865
    map2[a1] = 'b';
866
    map2[a2] = 'a';
867
    map2[a3] = 'b';
868
    map2[a4] = 'c';
869

	
870
    // mapMin(), mapMax(), mapMinValue(), mapMaxValue()
871
    check(mapMin(g, map2) == a2, "Wrong mapMin()");
872
    check(mapMax(g, map2) == a4, "Wrong mapMax()");
873
    check(mapMin(g, map2, std::greater<int>()) == a4, "Wrong mapMin()");
874
    check(mapMax(g, map2, std::greater<int>()) == a2, "Wrong mapMax()");
875
    check(mapMinValue(g, map2, std::greater<int>()) == 'c',
876
          "Wrong mapMinValue()");
877
    check(mapMaxValue(g, map2, std::greater<int>()) == 'a',
878
          "Wrong mapMaxValue()");
879

	
880
    check(mapMin(g, cmap1) != INVALID, "Wrong mapMin()");
881
    check(mapMax(g, cmap2) != INVALID, "Wrong mapMax()");
882
    check(mapMaxValue(g, cmap2) == C(0), "Wrong mapMaxValue()");
883

	
884
    check(mapMin(g, composeMap(functorToMap(&createC), map2)) == a2,
885
          "Wrong mapMin()");
886
    check(mapMax(g, composeMap(functorToMap(&createC), map2)) == a4,
887
          "Wrong mapMax()");
888
    check(mapMinValue(g, composeMap(functorToMap(&createC), map2)) == C('a'),
889
          "Wrong mapMinValue()");
890
    check(mapMaxValue(g, composeMap(functorToMap(&createC), map2)) == C('c'),
891
          "Wrong mapMaxValue()");
892

	
893
    // mapFind(), mapFindIf()
894
    check(mapFind(g, map1, 5) == n2, "Wrong mapFind()");
895
    check(mapFind(g, map1, 6) == INVALID, "Wrong mapFind()");
896
    check(mapFind(g, map2, 'a') == a2, "Wrong mapFind()");
897
    check(mapFind(g, map2, 'e') == INVALID, "Wrong mapFind()");
898
    check(mapFind(g, cmap2, C(0)) == ArcIt(g), "Wrong mapFind()");
899
    check(mapFind(g, cmap2, C(1)) == INVALID, "Wrong mapFind()");
900

	
901
    check(mapFindIf(g, map1, Less<int>(7)) == n2,
902
          "Wrong mapFindIf()");
903
    check(mapFindIf(g, map1, Less<int>(5)) == INVALID,
904
          "Wrong mapFindIf()");
905
    check(mapFindIf(g, map2, Less<char>('d')) == ArcIt(g),
906
          "Wrong mapFindIf()");
907
    check(mapFindIf(g, map2, Less<char>('a')) == INVALID,
908
          "Wrong mapFindIf()");
909

	
910
    // mapCount(), mapCountIf()
911
    check(mapCount(g, map1, 5) == 1, "Wrong mapCount()");
912
    check(mapCount(g, map1, 6) == 0, "Wrong mapCount()");
913
    check(mapCount(g, map2, 'a') == 1, "Wrong mapCount()");
914
    check(mapCount(g, map2, 'b') == 2, "Wrong mapCount()");
915
    check(mapCount(g, map2, 'e') == 0, "Wrong mapCount()");
916
    check(mapCount(g, cmap2, C(0)) == 4, "Wrong mapCount()");
917
    check(mapCount(g, cmap2, C(1)) == 0, "Wrong mapCount()");
918

	
919
    check(mapCountIf(g, map1, Less<int>(11)) == 2,
920
          "Wrong mapCountIf()");
921
    check(mapCountIf(g, map1, Less<int>(13)) == 3,
922
          "Wrong mapCountIf()");
923
    check(mapCountIf(g, map1, Less<int>(5)) == 0,
924
          "Wrong mapCountIf()");
925
    check(mapCountIf(g, map2, Less<char>('d')) == 4,
926
          "Wrong mapCountIf()");
927
    check(mapCountIf(g, map2, Less<char>('c')) == 3,
928
          "Wrong mapCountIf()");
929
    check(mapCountIf(g, map2, Less<char>('a')) == 0,
930
          "Wrong mapCountIf()");
931

	
932
    // MapIt, ConstMapIt
933
/*
934
These tests can be used after applying bugfix #330
935
    typedef SmartDigraph::NodeMap<int>::MapIt MapIt;
936
    typedef SmartDigraph::NodeMap<int>::ConstMapIt ConstMapIt;
937
    check(*std::min_element(MapIt(map1), MapIt(INVALID)) == 5,
938
          "Wrong NodeMap<>::MapIt");
939
    check(*std::max_element(ConstMapIt(map1), ConstMapIt(INVALID)) == 12,
940
          "Wrong NodeMap<>::MapIt");
941

	
942
    int sum = 0;
943
    std::for_each(MapIt(map1), MapIt(INVALID), Sum<int>(sum));
944
    check(sum == 27, "Wrong NodeMap<>::MapIt");
945
    std::for_each(ConstMapIt(map1), ConstMapIt(INVALID), Sum<int>(sum));
946
    check(sum == 54, "Wrong NodeMap<>::ConstMapIt");
947
*/
948

	
949
    // mapCopy(), mapCompare(), mapFill()
950
    check(mapCompare(g, map1, map1), "Wrong mapCompare()");
951
    check(mapCompare(g, cmap2, cmap2), "Wrong mapCompare()");
952
    check(mapCompare(g, map1, shiftMap(map1, 0)), "Wrong mapCompare()");
953
    check(mapCompare(g, map2, scaleMap(map2, 1)), "Wrong mapCompare()");
954
    check(!mapCompare(g, map1, shiftMap(map1, 1)), "Wrong mapCompare()");
955

	
956
    SmartDigraph::NodeMap<int> map3(g, 0);
957
    SmartDigraph::ArcMap<char> map4(g, 'a');
958

	
959
    check(!mapCompare(g, map1, map3), "Wrong mapCompare()");
960
    check(!mapCompare(g, map2, map4), "Wrong mapCompare()");
961

	
962
    mapCopy(g, map1, map3);
963
    mapCopy(g, map2, map4);
964

	
965
    check(mapCompare(g, map1, map3), "Wrong mapCompare() or mapCopy()");
966
    check(mapCompare(g, map2, map4), "Wrong mapCompare() or mapCopy()");
967

	
968
    Undirector<SmartDigraph> ug(g);
969
    Undirector<SmartDigraph>::EdgeMap<char> umap1(ug, 'x');
970
    Undirector<SmartDigraph>::ArcMap<double> umap2(ug, 3.14);
971

	
972
    check(!mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
973
    check(!mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
974
    check(!mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
975
    check(!mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
976

	
977
    mapCopy(g, map2, umap1);
978

	
979
    check(mapCompare(g, map2, umap1), "Wrong mapCompare() or mapCopy()");
980
    check(mapCompare(g, umap1, map2), "Wrong mapCompare() or mapCopy()");
981
    check(mapCompare(ug, map2, umap1), "Wrong mapCompare() or mapCopy()");
982
    check(mapCompare(ug, umap1, map2), "Wrong mapCompare() or mapCopy()");
983

	
984
    mapCopy(g, map2, umap1);
985
    mapCopy(g, umap1, map2);
986
    mapCopy(ug, map2, umap1);
987
    mapCopy(ug, umap1, map2);
988

	
989
    check(!mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
990
    mapCopy(ug, umap1, umap2);
991
    check(mapCompare(ug, umap1, umap2), "Wrong mapCompare() or mapCopy()");
992

	
993
    check(!mapCompare(g, map1, constMap<Node>(2)), "Wrong mapCompare()");
994
    mapFill(g, map1, 2);
995
    check(mapCompare(g, constMap<Node>(2), map1), "Wrong mapFill()");
996

	
997
    check(!mapCompare(g, map2, constMap<Arc>('z')), "Wrong mapCompare()");
998
    mapCopy(g, constMap<Arc>('z'), map2);
999
    check(mapCompare(g, constMap<Arc>('z'), map2), "Wrong mapCopy()");
1000
  }
1001

	
387 1002
  return 0;
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -136,3 +136,3 @@
136 136
  mat_test.run();
137
  
137

	
138 138
  const_mat_test.matchingSize();
... ...
@@ -145,3 +145,3 @@
145 145

	
146
  MaxMatching<Graph>::Status stat = 
146
  MaxMatching<Graph>::Status stat =
147 147
    const_mat_test.status(n);
... ...
@@ -172,3 +172,3 @@
172 172
  mat_test.run();
173
  
173

	
174 174
  const_mat_test.matchingWeight();
... ...
@@ -181,3 +181,3 @@
181 181
  const_mat_test.mate(n);
182
  
182

	
183 183
  int k = 0;
... ...
@@ -209,3 +209,3 @@
209 209
  mat_test.run();
210
  
210

	
211 211
  const_mat_test.matchingWeight();
... ...
@@ -217,3 +217,3 @@
217 217
  const_mat_test.mate(n);
218
  
218

	
219 219
  int k = 0;
... ...
@@ -403,18 +403,42 @@
403 403

	
404
    MaxMatching<SmartGraph> mm(graph);
405
    mm.run();
406
    checkMatching(graph, mm);
404
    bool perfect;
405
    {
406
      MaxMatching<SmartGraph> mm(graph);
407
      mm.run();
408
      checkMatching(graph, mm);
409
      perfect = 2 * mm.matchingSize() == countNodes(graph);
410
    }
407 411

	
408
    MaxWeightedMatching<SmartGraph> mwm(graph, weight);
409
    mwm.run();
410
    checkWeightedMatching(graph, weight, mwm);
412
    {
413
      MaxWeightedMatching<SmartGraph> mwm(graph, weight);
414
      mwm.run();
415
      checkWeightedMatching(graph, weight, mwm);
416
    }
411 417

	
412
    MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
413
    bool perfect = mwpm.run();
418
    {
419
      MaxWeightedMatching<SmartGraph> mwm(graph, weight);
420
      mwm.init();
421
      mwm.start();
422
      checkWeightedMatching(graph, weight, mwm);
423
    }
414 424

	
415
    check(perfect == (mm.matchingSize() * 2 == countNodes(graph)),
416
          "Perfect matching found");
425
    {
426
      MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
427
      bool result = mwpm.run();
417 428

	
418
    if (perfect) {
419
      checkWeightedPerfectMatching(graph, weight, mwpm);
429
      check(result == perfect, "Perfect matching found");
430
      if (perfect) {
431
        checkWeightedPerfectMatching(graph, weight, mwpm);
432
      }
433
    }
434

	
435
    {
436
      MaxWeightedPerfectMatching<SmartGraph> mwpm(graph, weight);
437
      mwpm.init();
438
      bool result = mwpm.start();
439

	
440
      check(result == perfect, "Perfect matching found");
441
      if (perfect) {
442
        checkWeightedPerfectMatching(graph, weight, mwpm);
443
      }
420 444
    }
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2008
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -112,3 +112,3 @@
112 112
  i = const_mcarb_test.queueSize();
113
  
113

	
114 114
  c = const_mcarb_test.arborescenceCost();
... ...
@@ -122,3 +122,3 @@
122 122
  b = const_mcarb_test.processed(n);
123
  
123

	
124 124
  i = const_mcarb_test.dualNum();
... ...
@@ -127,3 +127,3 @@
127 127
  c = const_mcarb_test.dualValue(i);
128
  
128

	
129 129
  ignore_unused_variable_warning(am);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -26,4 +26,8 @@
26 26
#include <lemon/network_simplex.h>
27
#include <lemon/capacity_scaling.h>
28
#include <lemon/cost_scaling.h>
29
#include <lemon/cycle_canceling.h>
27 30

	
28 31
#include <lemon/concepts/digraph.h>
32
#include <lemon/concepts/heap.h>
29 33
#include <lemon/concept_check.h>
... ...
@@ -34,2 +38,3 @@
34 38

	
39
// Test networks
35 40
char test_lgf[] =
... ...
@@ -49,3 +54,3 @@
49 54
  "   12   -20  -27    0  -30  -30  -20\n"
50
  "\n"                
55
  "\n"
51 56
  "@arcs\n"
... ...
@@ -78,2 +83,54 @@
78 83

	
84
char test_neg1_lgf[] =
85
  "@nodes\n"
86
  "label   sup\n"
87
  "    1   100\n"
88
  "    2     0\n"
89
  "    3     0\n"
90
  "    4  -100\n"
91
  "    5     0\n"
92
  "    6     0\n"
93
  "    7     0\n"
94
  "@arcs\n"
95
  "      cost   low1   low2\n"
96
  "1 2    100      0      0\n"
97
  "1 3     30      0      0\n"
98
  "2 4     20      0      0\n"
99
  "3 4     80      0      0\n"
100
  "3 2     50      0      0\n"
101
  "5 3     10      0      0\n"
102
  "5 6     80      0   1000\n"
103
  "6 7     30      0  -1000\n"
104
  "7 5   -120      0      0\n";
105

	
106
char test_neg2_lgf[] =
107
  "@nodes\n"
108
  "label   sup\n"
109
  "    1   100\n"
110
  "    2  -300\n"
111
  "@arcs\n"
112
  "      cost\n"
113
  "1 2     -1\n";
114

	
115

	
116
// Test data
117
typedef ListDigraph Digraph;
118
DIGRAPH_TYPEDEFS(ListDigraph);
119

	
120
Digraph gr;
121
Digraph::ArcMap<int> c(gr), l1(gr), l2(gr), l3(gr), u(gr);
122
Digraph::NodeMap<int> s1(gr), s2(gr), s3(gr), s4(gr), s5(gr), s6(gr);
123
ConstMap<Arc, int> cc(1), cu(std::numeric_limits<int>::max());
124
Node v, w;
125

	
126
Digraph neg1_gr;
127
Digraph::ArcMap<int> neg1_c(neg1_gr), neg1_l1(neg1_gr), neg1_l2(neg1_gr);
128
ConstMap<Arc, int> neg1_u1(std::numeric_limits<int>::max()), neg1_u2(5000);
129
Digraph::NodeMap<int> neg1_s(neg1_gr);
130

	
131
Digraph neg2_gr;
132
Digraph::ArcMap<int> neg2_c(neg2_gr);
133
ConstMap<Arc, int> neg2_l(0), neg2_u(1000);
134
Digraph::NodeMap<int> neg2_s(neg2_gr);
135

	
79 136

	
... ...
@@ -85,2 +142,3 @@
85 142

	
143

	
86 144
// Check the interface of an MCF algorithm
... ...
@@ -95,3 +153,3 @@
95 153
      checkConcept<concepts::Digraph, GR>();
96
      
154

	
97 155
      const Constraints& me = *this;
... ...
@@ -101,3 +159,3 @@
101 159

	
102
      b = mcf.reset()
160
      b = mcf.reset().resetParams()
103 161
             .lowerMap(me.lower)
... ...
@@ -124,3 +182,3 @@
124 182
    typedef concepts::WriteMap<Node, Cost> PotMap;
125
  
183

	
126 184
    GR g;
... ...
@@ -178,3 +236,3 @@
178 236
bool checkPotential( const GR& gr, const LM& lower, const UM& upper,
179
                     const CM& cost, const SM& supply, const FM& flow, 
237
                     const CM& cost, const SM& supply, const FM& flow,
180 238
                     const PM& pi, SupplyType type )
... ...
@@ -191,3 +249,3 @@
191 249
  }
192
  
250

	
193 251
  for (NodeIt n(gr); opt && n != INVALID; ++n) {
... ...
@@ -204,3 +262,3 @@
204 262
  }
205
  
263

	
206 264
  return opt;
... ...
@@ -229,3 +287,3 @@
229 287
  }
230
  
288

	
231 289
  for (NodeIt n(gr); n != INVALID; ++n) {
... ...
@@ -238,3 +296,3 @@
238 296
  }
239
  
297

	
240 298
  return dual_cost == total;
... ...
@@ -270,26 +328,95 @@
270 328

	
329
template < typename MCF, typename Param >
330
void runMcfGeqTests( Param param,
331
                     const std::string &test_str = "",
332
                     bool full_neg_cost_support = false )
333
{
334
  MCF mcf1(gr), mcf2(neg1_gr), mcf3(neg2_gr);
335

	
336
  // Basic tests
337
  mcf1.upperMap(u).costMap(c).supplyMap(s1);
338
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s1,
339
           mcf1.OPTIMAL, true,     5240, test_str + "-1");
340
  mcf1.stSupply(v, w, 27);
341
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s2,
342
           mcf1.OPTIMAL, true,     7620, test_str + "-2");
343
  mcf1.lowerMap(l2).supplyMap(s1);
344
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s1,
345
           mcf1.OPTIMAL, true,     5970, test_str + "-3");
346
  mcf1.stSupply(v, w, 27);
347
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s2,
348
           mcf1.OPTIMAL, true,     8010, test_str + "-4");
349
  mcf1.resetParams().supplyMap(s1);
350
  checkMcf(mcf1, mcf1.run(param), gr, l1, cu, cc, s1,
351
           mcf1.OPTIMAL, true,       74, test_str + "-5");
352
  mcf1.lowerMap(l2).stSupply(v, w, 27);
353
  checkMcf(mcf1, mcf1.run(param), gr, l2, cu, cc, s2,
354
           mcf1.OPTIMAL, true,       94, test_str + "-6");
355
  mcf1.reset();
356
  checkMcf(mcf1, mcf1.run(param), gr, l1, cu, cc, s3,
357
           mcf1.OPTIMAL, true,        0, test_str + "-7");
358
  mcf1.lowerMap(l2).upperMap(u);
359
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, cc, s3,
360
           mcf1.INFEASIBLE, false,    0, test_str + "-8");
361
  mcf1.lowerMap(l3).upperMap(u).costMap(c).supplyMap(s4);
362
  checkMcf(mcf1, mcf1.run(param), gr, l3, u, c, s4,
363
           mcf1.OPTIMAL, true,     6360, test_str + "-9");
364

	
365
  // Tests for the GEQ form
366
  mcf1.resetParams().upperMap(u).costMap(c).supplyMap(s5);
367
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s5,
368
           mcf1.OPTIMAL, true,     3530, test_str + "-10", GEQ);
369
  mcf1.lowerMap(l2);
370
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s5,
371
           mcf1.OPTIMAL, true,     4540, test_str + "-11", GEQ);
372
  mcf1.supplyMap(s6);
373
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s6,
374
           mcf1.INFEASIBLE, false,    0, test_str + "-12", GEQ);
375

	
376
  // Tests with negative costs
377
  mcf2.lowerMap(neg1_l1).costMap(neg1_c).supplyMap(neg1_s);
378
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l1, neg1_u1, neg1_c, neg1_s,
379
           mcf2.UNBOUNDED, false,     0, test_str + "-13");
380
  mcf2.upperMap(neg1_u2);
381
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l1, neg1_u2, neg1_c, neg1_s,
382
           mcf2.OPTIMAL, true,   -40000, test_str + "-14");
383
  mcf2.resetParams().lowerMap(neg1_l2).costMap(neg1_c).supplyMap(neg1_s);
384
  checkMcf(mcf2, mcf2.run(param), neg1_gr, neg1_l2, neg1_u1, neg1_c, neg1_s,
385
           mcf2.UNBOUNDED, false,     0, test_str + "-15");
386

	
387
  mcf3.costMap(neg2_c).supplyMap(neg2_s);
388
  if (full_neg_cost_support) {
389
    checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
390
             mcf3.OPTIMAL, true,   -300, test_str + "-16", GEQ);
391
  } else {
392
    checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
393
             mcf3.UNBOUNDED, false,   0, test_str + "-17", GEQ);
394
  }
395
  mcf3.upperMap(neg2_u);
396
  checkMcf(mcf3, mcf3.run(param), neg2_gr, neg2_l, neg2_u, neg2_c, neg2_s,
397
           mcf3.OPTIMAL, true,     -300, test_str + "-18", GEQ);
398
}
399

	
400
template < typename MCF, typename Param >
401
void runMcfLeqTests( Param param,
402
                     const std::string &test_str = "" )
403
{
404
  // Tests for the LEQ form
405
  MCF mcf1(gr);
406
  mcf1.supplyType(mcf1.LEQ);
407
  mcf1.upperMap(u).costMap(c).supplyMap(s6);
408
  checkMcf(mcf1, mcf1.run(param), gr, l1, u, c, s6,
409
           mcf1.OPTIMAL, true,   5080, test_str + "-19", LEQ);
410
  mcf1.lowerMap(l2);
411
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s6,
412
           mcf1.OPTIMAL, true,   5930, test_str + "-20", LEQ);
413
  mcf1.supplyMap(s5);
414
  checkMcf(mcf1, mcf1.run(param), gr, l2, u, c, s5,
415
           mcf1.INFEASIBLE, false,  0, test_str + "-21", LEQ);
416
}
417

	
418

	
271 419
int main()
272 420
{
273
  // Check the interfaces
274
  {
275
    typedef concepts::Digraph GR;
276
    checkConcept< McfClassConcept<GR, int, int>,
277
                  NetworkSimplex<GR> >();
278
    checkConcept< McfClassConcept<GR, double, double>,
279
                  NetworkSimplex<GR, double> >();
280
    checkConcept< McfClassConcept<GR, int, double>,
281
                  NetworkSimplex<GR, int, double> >();
282
  }
283

	
284
  // Run various MCF tests
285
  typedef ListDigraph Digraph;
286
  DIGRAPH_TYPEDEFS(ListDigraph);
287

	
288
  // Read the test digraph
289
  Digraph gr;
290
  Digraph::ArcMap<int> c(gr), l1(gr), l2(gr), l3(gr), u(gr);
291
  Digraph::NodeMap<int> s1(gr), s2(gr), s3(gr), s4(gr), s5(gr), s6(gr);
292
  ConstMap<Arc, int> cc(1), cu(std::numeric_limits<int>::max());
293
  Node v, w;
294

	
421
  // Read the test networks
295 422
  std::istringstream input(test_lgf);
... ...
@@ -310,138 +437,103 @@
310 437
    .run();
311
  
312
  // Build test digraphs with negative costs
313
  Digraph neg_gr;
314
  Node n1 = neg_gr.addNode();
315
  Node n2 = neg_gr.addNode();
316
  Node n3 = neg_gr.addNode();
317
  Node n4 = neg_gr.addNode();
318
  Node n5 = neg_gr.addNode();
319
  Node n6 = neg_gr.addNode();
320
  Node n7 = neg_gr.addNode();
321
  
322
  Arc a1 = neg_gr.addArc(n1, n2);
323
  Arc a2 = neg_gr.addArc(n1, n3);
324
  Arc a3 = neg_gr.addArc(n2, n4);
325
  Arc a4 = neg_gr.addArc(n3, n4);
326
  Arc a5 = neg_gr.addArc(n3, n2);
327
  Arc a6 = neg_gr.addArc(n5, n3);
328
  Arc a7 = neg_gr.addArc(n5, n6);
329
  Arc a8 = neg_gr.addArc(n6, n7);
330
  Arc a9 = neg_gr.addArc(n7, n5);
331
  
332
  Digraph::ArcMap<int> neg_c(neg_gr), neg_l1(neg_gr, 0), neg_l2(neg_gr, 0);
333
  ConstMap<Arc, int> neg_u1(std::numeric_limits<int>::max()), neg_u2(5000);
334
  Digraph::NodeMap<int> neg_s(neg_gr, 0);
335
  
336
  neg_l2[a7] =  1000;
337
  neg_l2[a8] = -1000;
338
  
339
  neg_s[n1] =  100;
340
  neg_s[n4] = -100;
341
  
342
  neg_c[a1] =  100;
343
  neg_c[a2] =   30;
344
  neg_c[a3] =   20;
345
  neg_c[a4] =   80;
346
  neg_c[a5] =   50;
347
  neg_c[a6] =   10;
348
  neg_c[a7] =   80;
349
  neg_c[a8] =   30;
350
  neg_c[a9] = -120;
351 438

	
352
  Digraph negs_gr;
353
  Digraph::NodeMap<int> negs_s(negs_gr);
354
  Digraph::ArcMap<int> negs_c(negs_gr);
355
  ConstMap<Arc, int> negs_l(0), negs_u(1000);
356
  n1 = negs_gr.addNode();
357
  n2 = negs_gr.addNode();
358
  negs_s[n1] = 100;
359
  negs_s[n2] = -300;
360
  negs_c[negs_gr.addArc(n1, n2)] = -1;
439
  std::istringstream neg_inp1(test_neg1_lgf);
440
  DigraphReader<Digraph>(neg1_gr, neg_inp1)
441
    .arcMap("cost", neg1_c)
442
    .arcMap("low1", neg1_l1)
443
    .arcMap("low2", neg1_l2)
444
    .nodeMap("sup", neg1_s)
445
    .run();
361 446

	
447
  std::istringstream neg_inp2(test_neg2_lgf);
448
  DigraphReader<Digraph>(neg2_gr, neg_inp2)
449
    .arcMap("cost", neg2_c)
450
    .nodeMap("sup", neg2_s)
451
    .run();
362 452

	
363
  // A. Test NetworkSimplex with the default pivot rule
453
  // Check the interface of NetworkSimplex
364 454
  {
365
    NetworkSimplex<Digraph> mcf(gr);
366

	
367
    // Check the equality form
368
    mcf.upperMap(u).costMap(c);
369
    checkMcf(mcf, mcf.supplyMap(s1).run(),
370
             gr, l1, u, c, s1, mcf.OPTIMAL, true,   5240, "#A1");
371
    checkMcf(mcf, mcf.stSupply(v, w, 27).run(),
372
             gr, l1, u, c, s2, mcf.OPTIMAL, true,   7620, "#A2");
373
    mcf.lowerMap(l2);
374
    checkMcf(mcf, mcf.supplyMap(s1).run(),
375
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#A3");
376
    checkMcf(mcf, mcf.stSupply(v, w, 27).run(),
377
             gr, l2, u, c, s2, mcf.OPTIMAL, true,   8010, "#A4");
378
    mcf.reset();
379
    checkMcf(mcf, mcf.supplyMap(s1).run(),
380
             gr, l1, cu, cc, s1, mcf.OPTIMAL, true,   74, "#A5");
381
    checkMcf(mcf, mcf.lowerMap(l2).stSupply(v, w, 27).run(),
382
             gr, l2, cu, cc, s2, mcf.OPTIMAL, true,   94, "#A6");
383
    mcf.reset();
384
    checkMcf(mcf, mcf.run(),
385
             gr, l1, cu, cc, s3, mcf.OPTIMAL, true,    0, "#A7");
386
    checkMcf(mcf, mcf.lowerMap(l2).upperMap(u).run(),
387
             gr, l2, u, cc, s3, mcf.INFEASIBLE, false, 0, "#A8");
388
    mcf.reset().lowerMap(l3).upperMap(u).costMap(c).supplyMap(s4);
389
    checkMcf(mcf, mcf.run(),
390
             gr, l3, u, c, s4, mcf.OPTIMAL, true,   6360, "#A9");
391

	
392
    // Check the GEQ form
393
    mcf.reset().upperMap(u).costMap(c).supplyMap(s5);
394
    checkMcf(mcf, mcf.run(),
395
             gr, l1, u, c, s5, mcf.OPTIMAL, true,   3530, "#A10", GEQ);
396
    mcf.supplyType(mcf.GEQ);
397
    checkMcf(mcf, mcf.lowerMap(l2).run(),
398
             gr, l2, u, c, s5, mcf.OPTIMAL, true,   4540, "#A11", GEQ);
399
    mcf.supplyMap(s6);
400
    checkMcf(mcf, mcf.run(),
401
             gr, l2, u, c, s6, mcf.INFEASIBLE, false,  0, "#A12", GEQ);
402

	
403
    // Check the LEQ form
404
    mcf.reset().supplyType(mcf.LEQ);
405
    mcf.upperMap(u).costMap(c).supplyMap(s6);
406
    checkMcf(mcf, mcf.run(),
407
             gr, l1, u, c, s6, mcf.OPTIMAL, true,   5080, "#A13", LEQ);
408
    checkMcf(mcf, mcf.lowerMap(l2).run(),
409
             gr, l2, u, c, s6, mcf.OPTIMAL, true,   5930, "#A14", LEQ);
410
    mcf.supplyMap(s5);
411
    checkMcf(mcf, mcf.run(),
412
             gr, l2, u, c, s5, mcf.INFEASIBLE, false,  0, "#A15", LEQ);
413

	
414
    // Check negative costs
415
    NetworkSimplex<Digraph> neg_mcf(neg_gr);
416
    neg_mcf.lowerMap(neg_l1).costMap(neg_c).supplyMap(neg_s);
417
    checkMcf(neg_mcf, neg_mcf.run(), neg_gr, neg_l1, neg_u1,
418
      neg_c, neg_s, neg_mcf.UNBOUNDED, false,    0, "#A16");
419
    neg_mcf.upperMap(neg_u2);
420
    checkMcf(neg_mcf, neg_mcf.run(), neg_gr, neg_l1, neg_u2,
421
      neg_c, neg_s, neg_mcf.OPTIMAL, true,  -40000, "#A17");
422
    neg_mcf.reset().lowerMap(neg_l2).costMap(neg_c).supplyMap(neg_s);
423
    checkMcf(neg_mcf, neg_mcf.run(), neg_gr, neg_l2, neg_u1,
424
      neg_c, neg_s, neg_mcf.UNBOUNDED, false,    0, "#A18");
425
      
426
    NetworkSimplex<Digraph> negs_mcf(negs_gr);
427
    negs_mcf.costMap(negs_c).supplyMap(negs_s);
428
    checkMcf(negs_mcf, negs_mcf.run(), negs_gr, negs_l, negs_u,
429
      negs_c, negs_s, negs_mcf.OPTIMAL, true, -300, "#A19", GEQ);
455
    typedef concepts::Digraph GR;
456
    checkConcept< McfClassConcept<GR, int, int>,
457
                  NetworkSimplex<GR> >();
458
    checkConcept< McfClassConcept<GR, double, double>,
459
                  NetworkSimplex<GR, double> >();
460
    checkConcept< McfClassConcept<GR, int, double>,
461
                  NetworkSimplex<GR, int, double> >();
430 462
  }
431 463

	
432
  // B. Test NetworkSimplex with each pivot rule
464
  // Check the interface of CapacityScaling
433 465
  {
434
    NetworkSimplex<Digraph> mcf(gr);
435
    mcf.supplyMap(s1).costMap(c).upperMap(u).lowerMap(l2);
466
    typedef concepts::Digraph GR;
467
    checkConcept< McfClassConcept<GR, int, int>,
468
                  CapacityScaling<GR> >();
469
    checkConcept< McfClassConcept<GR, double, double>,
470
                  CapacityScaling<GR, double> >();
471
    checkConcept< McfClassConcept<GR, int, double>,
472
                  CapacityScaling<GR, int, double> >();
473
    typedef CapacityScaling<GR>::
474
      SetHeap<concepts::Heap<int, RangeMap<int> > >::Create CAS;
475
    checkConcept< McfClassConcept<GR, int, int>, CAS >();
476
  }
436 477

	
437
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::FIRST_ELIGIBLE),
438
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B1");
439
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::BEST_ELIGIBLE),
440
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B2");
441
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::BLOCK_SEARCH),
442
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B3");
443
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::CANDIDATE_LIST),
444
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B4");
445
    checkMcf(mcf, mcf.run(NetworkSimplex<Digraph>::ALTERING_LIST),
446
             gr, l2, u, c, s1, mcf.OPTIMAL, true,   5970, "#B5");
478
  // Check the interface of CostScaling
479
  {
480
    typedef concepts::Digraph GR;
481
    checkConcept< McfClassConcept<GR, int, int>,
482
                  CostScaling<GR> >();
483
    checkConcept< McfClassConcept<GR, double, double>,
484
                  CostScaling<GR, double> >();
485
    checkConcept< McfClassConcept<GR, int, double>,
486
                  CostScaling<GR, int, double> >();
487
    typedef CostScaling<GR>::
488
      SetLargeCost<double>::Create COS;
489
    checkConcept< McfClassConcept<GR, int, int>, COS >();
490
  }
491

	
492
  // Check the interface of CycleCanceling
493
  {
494
    typedef concepts::Digraph GR;
495
    checkConcept< McfClassConcept<GR, int, int>,
496
                  CycleCanceling<GR> >();
497
    checkConcept< McfClassConcept<GR, double, double>,
498
                  CycleCanceling<GR, double> >();
499
    checkConcept< McfClassConcept<GR, int, double>,
500
                  CycleCanceling<GR, int, double> >();
501
  }
502

	
503
  // Test NetworkSimplex
504
  {
505
    typedef NetworkSimplex<Digraph> MCF;
506
    runMcfGeqTests<MCF>(MCF::FIRST_ELIGIBLE, "NS-FE", true);
507
    runMcfLeqTests<MCF>(MCF::FIRST_ELIGIBLE, "NS-FE");
508
    runMcfGeqTests<MCF>(MCF::BEST_ELIGIBLE,  "NS-BE", true);
509
    runMcfLeqTests<MCF>(MCF::BEST_ELIGIBLE,  "NS-BE");
510
    runMcfGeqTests<MCF>(MCF::BLOCK_SEARCH,   "NS-BS", true);
511
    runMcfLeqTests<MCF>(MCF::BLOCK_SEARCH,   "NS-BS");
512
    runMcfGeqTests<MCF>(MCF::CANDIDATE_LIST, "NS-CL", true);
513
    runMcfLeqTests<MCF>(MCF::CANDIDATE_LIST, "NS-CL");
514
    runMcfGeqTests<MCF>(MCF::ALTERING_LIST,  "NS-AL", true);
515
    runMcfLeqTests<MCF>(MCF::ALTERING_LIST,  "NS-AL");
516
  }
517

	
518
  // Test CapacityScaling
519
  {
520
    typedef CapacityScaling<Digraph> MCF;
521
    runMcfGeqTests<MCF>(0, "SSP");
522
    runMcfGeqTests<MCF>(2, "CAS");
523
  }
524

	
525
  // Test CostScaling
526
  {
527
    typedef CostScaling<Digraph> MCF;
528
    runMcfGeqTests<MCF>(MCF::PUSH, "COS-PR");
529
    runMcfGeqTests<MCF>(MCF::AUGMENT, "COS-AR");
530
    runMcfGeqTests<MCF>(MCF::PARTIAL_AUGMENT, "COS-PAR");
531
  }
532

	
533
  // Test CycleCanceling
534
  {
535
    typedef CycleCanceling<Digraph> MCF;
536
    runMcfGeqTests<MCF>(MCF::SIMPLE_CYCLE_CANCELING, "SCC");
537
    runMcfGeqTests<MCF>(MCF::MINIMUM_MEAN_CYCLE_CANCELING, "MMCC");
538
    runMcfGeqTests<MCF>(MCF::CANCEL_AND_TIGHTEN, "CAT");
447 539
  }
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -97,2 +97,7 @@
97 97

	
98
  const PreflowType::Elevator& elev = const_preflow_test.elevator();
99
  preflow_test.elevator(const_cast<PreflowType::Elevator&>(elev));
100
  PreflowType::Tolerance tol = const_preflow_test.tolerance();
101
  preflow_test.tolerance(tol);
102

	
98 103
  preflow_test
... ...
@@ -115,3 +120,3 @@
115 120
  const_preflow_test.minCutMap(cut);
116
  
121

	
117 122
  ignore_unused_variable_warning(fm);
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -25,2 +25,3 @@
25 25
#include <lemon/concepts/digraph.h>
26
#include <lemon/concepts/heap.h>
26 27

	
... ...
@@ -82,4 +83,10 @@
82 83
  typedef concepts::ReadMap<Arc, VType> LengthMap;
83
  
84
  typedef Suurballe<Digraph, LengthMap> SuurballeType;
84

	
85
  typedef Suurballe<Digraph, LengthMap> ST;
86
  typedef Suurballe<Digraph, LengthMap>
87
    ::SetFlowMap<ST::FlowMap>
88
    ::SetPotentialMap<ST::PotentialMap>
89
    ::SetPath<SimplePath<Digraph> >
90
    ::SetHeap<concepts::Heap<VType, Digraph::NodeMap<int> > >
91
    ::Create SuurballeType;
85 92

	
... ...
@@ -103,2 +110,5 @@
103 110
  suurb_test.init(n);
111
  suurb_test.fullInit(n);
112
  suurb_test.start(n);
113
  suurb_test.start(n, k);
104 114
  k = suurb_test.findFlow(n);
... ...
@@ -106,3 +116,3 @@
106 116
  suurb_test.findPaths();
107
  
117

	
108 118
  int f;
... ...
@@ -118,3 +128,3 @@
118 128
  Path<Digraph> p = const_suurb_test.path(k);
119
  
129

	
120 130
  ignore_unused_variable_warning(fm);
... ...
@@ -197,5 +207,7 @@
197 207

	
198
  // Find 2 paths
208
  // Check run()
199 209
  {
200 210
    Suurballe<ListDigraph> suurballe(digraph, length);
211

	
212
    // Find 2 paths
201 213
    check(suurballe.run(s, t) == 2, "Wrong number of paths");
... ...
@@ -209,7 +221,4 @@
209 221
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
210
  }
211 222

	
212
  // Find 3 paths
213
  {
214
    Suurballe<ListDigraph> suurballe(digraph, length);
223
    // Find 3 paths
215 224
    check(suurballe.run(s, t, 3) == 3, "Wrong number of paths");
... ...
@@ -223,7 +232,4 @@
223 232
      check(checkPath(digraph, suurballe.path(i), s, t), "Wrong path");
224
  }
225 233

	
226
  // Find 5 paths (only 3 can be found)
227
  {
228
    Suurballe<ListDigraph> suurballe(digraph, length);
234
    // Find 5 paths (only 3 can be found)
229 235
    check(suurballe.run(s, t, 5) == 3, "Wrong number of paths");
... ...
@@ -239,2 +245,20 @@
239 245

	
246
  // Check fullInit() + start()
247
  {
248
    Suurballe<ListDigraph> suurballe(digraph, length);
249
    suurballe.fullInit(s);
250

	
251
    // Find 2 paths
252
    check(suurballe.start(t) == 2, "Wrong number of paths");
253
    check(suurballe.totalLength() == 510, "The flow is not optimal");
254

	
255
    // Find 3 paths
256
    check(suurballe.start(t, 3) == 3, "Wrong number of paths");
257
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
258

	
259
    // Find 5 paths (only 3 can be found)
260
    check(suurballe.start(t, 5) == 3, "Wrong number of paths");
261
    check(suurballe.totalLength() == 1040, "The flow is not optimal");
262
  }
263

	
240 264
  return 0;
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -39,7 +39,11 @@
39 39
///\verbatim file_name.cc:123: error: This is obviously false. \endverbatim
40
#define check(rc, msg) \
41
  if(!(rc)) { \
42
    std::cerr << __FILE__ ":" << __LINE__ << ": error: " << msg << std::endl; \
43
    abort(); \
44
  } else { } \
40
#define check(rc, msg)                                                  \
41
  {                                                                     \
42
    if(!(rc)) {                                                         \
43
      std::cerr << __FILE__ ":" << __LINE__ << ": error: "              \
44
                << msg << std::endl;                                    \
45
      abort();                                                          \
46
    } else { }                                                          \
47
  }                                                                     \
48

	
45 49

	
Ignore white space 6 line context
... ...
@@ -4,3 +4,3 @@
4 4
 *
5
 * Copyright (C) 2003-2009
5
 * Copyright (C) 2003-2010
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
... ...
@@ -90,6 +90,6 @@
90 90
  if(report) std::cerr << "Run Preflow: " << ti << '\n';
91
  if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';  
91
  if(report) std::cerr << "\nMax flow value: " << pre.flowValue() << '\n';
92 92
}
93 93

	
94
template<class Value>
94
template<class Value, class LargeValue>
95 95
void solve_min(ArgParser &ap, std::istream &is, std::ostream &,
... ...
@@ -129,3 +129,4 @@
129 129
    std::cerr << "Feasible flow: " << (res ? "found" : "not found") << '\n';
130
    if (res) std::cerr << "Min flow cost: " << ns.totalCost() << '\n';
130
    if (res) std::cerr << "Min flow cost: "
131
                       << ns.template totalCost<LargeValue>() << '\n';
131 132
  }
... ...
@@ -149,3 +150,3 @@
149 150
  if(report) std::cerr << "\nCardinality of max matching: "
150
                       << mat.matchingSize() << '\n';  
151
                       << mat.matchingSize() << '\n';
151 152
}
... ...
@@ -153,3 +154,3 @@
153 154

	
154
template<class Value>
155
template<class Value, class LargeValue>
155 156
void solve(ArgParser &ap, std::istream &is, std::ostream &os,
... ...
@@ -167,3 +168,3 @@
167 168
    }
168
  
169

	
169 170
  switch(desc.type)
... ...
@@ -171,3 +172,3 @@
171 172
    case DimacsDescriptor::MIN:
172
      solve_min<Value>(ap,is,os,infty,desc);
173
      solve_min<Value, LargeValue>(ap,is,os,infty,desc);
173 174
      break;
... ...
@@ -239,3 +240,3 @@
239 240
  DimacsDescriptor desc = dimacsType(is);
240
  
241

	
241 242
  if(!ap.given("q"))
... ...
@@ -264,12 +265,14 @@
264 265
    }
265
    
266

	
266 267
  if(ap.given("double"))
267
    solve<double>(ap,is,os,desc);
268
    solve<double, double>(ap,is,os,desc);
268 269
  else if(ap.given("ldouble"))
269
    solve<long double>(ap,is,os,desc);
270
    solve<long double, long double>(ap,is,os,desc);
270 271
#ifdef LEMON_HAVE_LONG_LONG
271 272
  else if(ap.given("long"))
272
    solve<long long>(ap,is,os,desc);
273
    solve<long long, long long>(ap,is,os,desc);
274
  else solve<int, long long>(ap,is,os,desc);
275
#else
276
  else solve<int, long>(ap,is,os,desc);
273 277
#endif
274
  else solve<int>(ap,is,os,desc);
275 278

	
Ignore white space 6 line context
... ...
@@ -37,6 +37,6 @@
37 37
        -e "s/\<edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/_ar_c_label_/g"\
38
        -e "s/_edge\>/__ar_c_label_/g"\
39 39
        -e "s/Edges\>/_Ar_c_label_s/g"\
40 40
        -e "s/\<edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/_ar_c_label_s/g"\
41
        -e "s/_edges\>/__ar_c_label_s/g"\
42 42
        -e "s/\([Ee]\)dge\([a-z]\)/_\1d_ge_label_\2/g"\
... ...
@@ -70,2 +70,7 @@
70 70
        -e "s/_DIGR_APH_TY_PEDE_FS_label_/DIGRAPH_TYPEDEFS/g"\
71
        -e "s/\<digraph_adaptor\.h\>/adaptors.h/g"\
72
        -e "s/\<digraph_utils\.h\>/core.h/g"\
73
        -e "s/\<digraph_reader\.h\>/lgf_reader.h/g"\
74
        -e "s/\<digraph_writer\.h\>/lgf_writer.h/g"\
75
        -e "s/\<topology\.h\>/connectivity.h/g"\
71 76
        -e "s/DigraphToEps/GraphToEps/g"\
0 comments (0 inline)