0
                         105
                         25
                     
                 
                    1165
22
8
17
15
1
174
76
20
10
66
42
84
83
110
110
Changeset was too big and was cut off... Show full diff
| 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  | 
| 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  | 
| 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 | 
		}  | 
| 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 = ↦  | 
|
| 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 = ↦  | 
|
| 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 = ↦  | 
|
| 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 | 
| 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 | 
| ... | ... | 
		@@ -13,24 +13,25 @@  | 
| 13 | 13 | 
		config.h.in  | 
| 14 | 14 | 
		configure  | 
| 15 | 15 | 
		Makefile  | 
| 16 | 16 | 
		config.h  | 
| 17 | 17 | 
		config.log  | 
| 18 | 18 | 
		config.status  | 
| 19 | 19 | 
		libtool  | 
| 20 | 20 | 
		stamp-h1  | 
| 21 | 21 | 
		lemon/lemon.pc  | 
| 22 | 22 | 
		lemon/libemon.la  | 
| 23 | 23 | 
		lemon/stamp-h2  | 
| 24 | 24 | 
		doc/Doxyfile  | 
| 25 | 
		doc/references.dox  | 
|
| 25 | 26 | 
		cmake/version.cmake  | 
| 26 | 27 | 
		.dirstamp  | 
| 27 | 28 | 
		.libs/*  | 
| 28 | 29 | 
		.deps/*  | 
| 29 | 30 | 
		demo/*.eps  | 
| 30 | 31 | 
		m4/libtool.m4  | 
| 31 | 32 | 
		m4/ltoptions.m4  | 
| 32 | 33 | 
		m4/ltsugar.m4  | 
| 33 | 34 | 
		m4/ltversion.m4  | 
| 34 | 35 | 
		m4/lt~obsolete.m4  | 
| 35 | 36 | 
		 | 
| 36 | 37 | 
		syntax: regexp  | 
| ... | ... | 
		@@ -105,24 +105,26 @@  | 
| 105 | 105 | 
		SET(CMAKE_BUILD_TYPE "Release")  | 
| 106 | 106 | 
		ENDIF()  | 
| 107 | 107 | 
		 | 
| 108 | 108 | 
		SET( CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING
	 | 
| 109 | 109 | 
		"Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel Maintainer."  | 
| 110 | 110 | 
		FORCE )  | 
| 111 | 111 | 
		 | 
| 112 | 112 | 
		 | 
| 113 | 113 | 
		INCLUDE(CheckTypeSize)  | 
| 114 | 114 | 
		CHECK_TYPE_SIZE("long long" LONG_LONG)
	 | 
| 115 | 115 | 
		SET(LEMON_HAVE_LONG_LONG ${HAVE_LONG_LONG})
	 | 
| 116 | 116 | 
		 | 
| 117 | 
		INCLUDE(FindPythonInterp)  | 
|
| 118 | 
		 | 
|
| 117 | 119 | 
		ENABLE_TESTING()  | 
| 118 | 120 | 
		 | 
| 119 | 121 | 
		IF(${CMAKE_BUILD_TYPE} STREQUAL "Maintainer")
	 | 
| 120 | 122 | 
		  ADD_CUSTOM_TARGET(check ALL COMMAND ${CMAKE_CTEST_COMMAND})
	 | 
| 121 | 123 | 
		ELSE()  | 
| 122 | 124 | 
		  ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND})
	 | 
| 123 | 125 | 
		ENDIF()  | 
| 124 | 126 | 
		 | 
| 125 | 127 | 
		ADD_SUBDIRECTORY(lemon)  | 
| 126 | 128 | 
		IF(${CMAKE_SOURCE_DIR} STREQUAL ${PROJECT_SOURCE_DIR})
	 | 
| 127 | 129 | 
		ADD_SUBDIRECTORY(demo)  | 
| 128 | 130 | 
		ADD_SUBDIRECTORY(tools)  | 
| ... | ... | 
		@@ -164,12 +164,34 @@  | 
| 164 | 164 | 
		only useful when the COIN-OR headers and libraries are not under  | 
| 165 | 165 | 
		the same prefix (which is unlikely).  | 
| 166 | 166 | 
		 | 
| 167 | 167 | 
		--with-coin-libdir=DIR  | 
| 168 | 168 | 
		 | 
| 169 | 169 | 
		The directory where the COIN-OR libraries are located. This is only  | 
| 170 | 170 | 
		useful when the COIN-OR headers and libraries are not under the  | 
| 171 | 171 | 
		same prefix (which is unlikely).  | 
| 172 | 172 | 
		 | 
| 173 | 173 | 
		--without-coin  | 
| 174 | 174 | 
		 | 
| 175 | 175 | 
		Disable COIN-OR support.  | 
| 176 | 
		 | 
|
| 177 | 
		 | 
|
| 178 | 
		Makefile Variables  | 
|
| 179 | 
		==================  | 
|
| 180 | 
		 | 
|
| 181 | 
		Some Makefile variables are reserved by the GNU Coding Standards for  | 
|
| 182 | 
		the use of the "user" - the person building the package. For instance,  | 
|
| 183 | 
		CXX and CXXFLAGS are such variables, and have the same meaning as  | 
|
| 184 | 
		explained in the previous section. These variables can be set on the  | 
|
| 185 | 
		command line when invoking `make' like this:  | 
|
| 186 | 
		`make [VARIABLE=VALUE]...'  | 
|
| 187 | 
		 | 
|
| 188 | 
		WARNINGCXXFLAGS is a non-standard Makefile variable introduced by us  | 
|
| 189 | 
		to hold several compiler flags related to warnings. Its default value  | 
|
| 190 | 
		can be overridden when invoking `make'. For example to disable all  | 
|
| 191 | 
		warning flags use `make WARNINGCXXFLAGS='.  | 
|
| 192 | 
		 | 
|
| 193 | 
		In order to turn off a single flag from the default set of warning  | 
|
| 194 | 
		flags, you can use the CXXFLAGS variable, since this is passed after  | 
|
| 195 | 
		WARNINGCXXFLAGS. For example to turn off `-Wold-style-cast' (which is  | 
|
| 196 | 
		used by default when g++ is detected) you can use  | 
|
| 197 | 
		`make CXXFLAGS="-g -O2 -Wno-old-style-cast"'.  | 
| ... | ... | 
		@@ -35,24 +35,25 @@  | 
| 35 | 35 | 
		noinst_HEADERS =  | 
| 36 | 36 | 
		noinst_PROGRAMS =  | 
| 37 | 37 | 
		bin_PROGRAMS =  | 
| 38 | 38 | 
		check_PROGRAMS =  | 
| 39 | 39 | 
		dist_bin_SCRIPTS =  | 
| 40 | 40 | 
		TESTS =  | 
| 41 | 41 | 
		XFAIL_TESTS =  | 
| 42 | 42 | 
		 | 
| 43 | 43 | 
		include lemon/Makefile.am  | 
| 44 | 44 | 
		include test/Makefile.am  | 
| 45 | 45 | 
		include doc/Makefile.am  | 
| 46 | 46 | 
		include tools/Makefile.am  | 
| 47 | 
		include scripts/Makefile.am  | 
|
| 47 | 48 | 
		 | 
| 48 | 49 | 
		DIST_SUBDIRS = demo  | 
| 49 | 50 | 
		 | 
| 50 | 51 | 
		demo:  | 
| 51 | 52 | 
		$(MAKE) $(AM_MAKEFLAGS) -C demo  | 
| 52 | 53 | 
		 | 
| 53 | 54 | 
		MRPROPERFILES = \  | 
| 54 | 55 | 
		aclocal.m4 \  | 
| 55 | 56 | 
		config.h.in \  | 
| 56 | 57 | 
		config.h.in~ \  | 
| 57 | 58 | 
		configure \  | 
| 58 | 59 | 
		Makefile.in \  | 
| ... | ... | 
		@@ -8,35 +8,43 @@  | 
| 8 | 8 | 
		focus is on graphs and graph algorithms, thus it is especially  | 
| 9 | 9 | 
		suitable for solving design and optimization problems of  | 
| 10 | 10 | 
		telecommunication networks. To achieve wide usability its data  | 
| 11 | 11 | 
		structures and algorithms provide generic interfaces.  | 
| 12 | 12 | 
		 | 
| 13 | 13 | 
		Contents  | 
| 14 | 14 | 
		========  | 
| 15 | 15 | 
		 | 
| 16 | 16 | 
		LICENSE  | 
| 17 | 17 | 
		 | 
| 18 | 18 | 
		Copying, distribution and modification conditions and terms.  | 
| 19 | 19 | 
		 | 
| 20 | 
		NEWS  | 
|
| 21 | 
		 | 
|
| 22 | 
		News and version history.  | 
|
| 23 | 
		 | 
|
| 20 | 24 | 
		INSTALL  | 
| 21 | 25 | 
		 | 
| 22 | 26 | 
		General building and installation instructions.  | 
| 23 | 27 | 
		 | 
| 24 | 28 | 
		lemon/  | 
| 25 | 29 | 
		 | 
| 26 | 30 | 
		Source code of LEMON library.  | 
| 27 | 31 | 
		 | 
| 28 | 32 | 
		doc/  | 
| 29 | 33 | 
		 | 
| 30 | 34 | 
		Documentation of LEMON. The starting page is doc/html/index.html.  | 
| 31 | 35 | 
		 | 
| 32 | 36 | 
		demo/  | 
| 33 | 37 | 
		 | 
| 34 | 38 | 
		Some example programs to make you easier to get familiar with LEMON.  | 
| 35 | 39 | 
		 | 
| 40 | 
		scripts/  | 
|
| 41 | 
		 | 
|
| 42 | 
		Scripts that make it easier to develop LEMON.  | 
|
| 43 | 
		 | 
|
| 36 | 44 | 
		test/  | 
| 37 | 45 | 
		 | 
| 38 | 46 | 
		Programs to check the integrity and correctness of LEMON.  | 
| 39 | 47 | 
		 | 
| 40 | 48 | 
		tools/  | 
| 41 | 49 | 
		 | 
| 42 | 50 | 
		Various utilities related to LEMON.  | 
| ... | ... | 
		@@ -32,24 +32,25 @@  | 
| 32 | 32 | 
		if test x"$long_long_found" = x"yes"; then  | 
| 33 | 33 | 
		AC_DEFINE([LEMON_HAVE_LONG_LONG], [1], [Define to 1 if you have long long.])  | 
| 34 | 34 | 
		fi  | 
| 35 | 35 | 
		 | 
| 36 | 36 | 
		dnl Checks for programs.  | 
| 37 | 37 | 
		AC_PROG_CXX  | 
| 38 | 38 | 
		AC_PROG_CXXCPP  | 
| 39 | 39 | 
		AC_PROG_INSTALL  | 
| 40 | 40 | 
		AC_DISABLE_SHARED  | 
| 41 | 41 | 
		AC_PROG_LIBTOOL  | 
| 42 | 42 | 
		 | 
| 43 | 43 | 
		AC_CHECK_PROG([doxygen_found],[doxygen],[yes],[no])  | 
| 44 | 
		AC_CHECK_PROG([python_found],[python],[yes],[no])  | 
|
| 44 | 45 | 
		AC_CHECK_PROG([gs_found],[gs],[yes],[no])  | 
| 45 | 46 | 
		 | 
| 46 | 47 | 
		dnl Detect Intel compiler.  | 
| 47 | 48 | 
		AC_MSG_CHECKING([whether we are using the Intel C++ compiler])  | 
| 48 | 49 | 
		AC_COMPILE_IFELSE([#ifndef __INTEL_COMPILER  | 
| 49 | 50 | 
		choke me  | 
| 50 | 51 | 
		#endif], [ICC=[yes]], [ICC=[no]])  | 
| 51 | 52 | 
		if test x"$ICC" = x"yes"; then  | 
| 52 | 53 | 
		AC_MSG_RESULT([yes])  | 
| 53 | 54 | 
		else  | 
| 54 | 55 | 
		AC_MSG_RESULT([no])  | 
| 55 | 56 | 
		fi  | 
| ... | ... | 
		@@ -73,24 +74,39 @@  | 
| 73 | 74 | 
		AC_ARG_ENABLE([tools],  | 
| 74 | 75 | 
		AS_HELP_STRING([--enable-tools], [build additional tools @<:@default@:>@])  | 
| 75 | 76 | 
		AS_HELP_STRING([--disable-tools], [do not build additional tools]),  | 
| 76 | 77 | 
		[], [enable_tools=yes])  | 
| 77 | 78 | 
		AC_MSG_CHECKING([whether to build the additional tools])  | 
| 78 | 79 | 
		if test x"$enable_tools" != x"no"; then  | 
| 79 | 80 | 
		AC_MSG_RESULT([yes])  | 
| 80 | 81 | 
		else  | 
| 81 | 82 | 
		AC_MSG_RESULT([no])  | 
| 82 | 83 | 
		fi  | 
| 83 | 84 | 
		AM_CONDITIONAL([WANT_TOOLS], [test x"$enable_tools" != x"no"])  | 
| 84 | 85 | 
		 | 
| 86 | 
		dnl Support for running test cases using valgrind.  | 
|
| 87 | 
		use_valgrind=no  | 
|
| 88 | 
		AC_ARG_ENABLE([valgrind],  | 
|
| 89 | 
		AS_HELP_STRING([--enable-valgrind], [use valgrind when running tests]),  | 
|
| 90 | 
		[use_valgrind=yes])  | 
|
| 91 | 
		 | 
|
| 92 | 
		if [[ "$use_valgrind" = "yes" ]]; then  | 
|
| 93 | 
		AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)  | 
|
| 94 | 
		 | 
|
| 95 | 
		if [[ "$HAVE_VALGRIND" = "no" ]]; then  | 
|
| 96 | 
		AC_MSG_ERROR([Valgrind not found in PATH.])  | 
|
| 97 | 
		fi  | 
|
| 98 | 
		fi  | 
|
| 99 | 
		AM_CONDITIONAL(USE_VALGRIND, [test "$use_valgrind" = "yes"])  | 
|
| 100 | 
		 | 
|
| 85 | 101 | 
		dnl Checks for header files.  | 
| 86 | 102 | 
		AC_CHECK_HEADERS(limits.h sys/time.h sys/times.h unistd.h)  | 
| 87 | 103 | 
		 | 
| 88 | 104 | 
		dnl Checks for typedefs, structures, and compiler characteristics.  | 
| 89 | 105 | 
		AC_C_CONST  | 
| 90 | 106 | 
		AC_C_INLINE  | 
| 91 | 107 | 
		AC_TYPE_SIZE_T  | 
| 92 | 108 | 
		AC_HEADER_TIME  | 
| 93 | 109 | 
		AC_STRUCT_TM  | 
| 94 | 110 | 
		 | 
| 95 | 111 | 
		dnl Checks for library functions.  | 
| 96 | 112 | 
		AC_HEADER_STDC  | 
| ... | ... | 
		@@ -119,22 +135,23 @@  | 
| 119 | 135 | 
		echo C++ compiler.................. : $CXX  | 
| 120 | 136 | 
		echo C++ compiles flags............ : $WARNINGCXXFLAGS $CXXFLAGS  | 
| 121 | 137 | 
		echo  | 
| 122 | 138 | 
		echo Compiler supports long long... : $long_long_found  | 
| 123 | 139 | 
		echo  | 
| 124 | 140 | 
		echo GLPK support.................. : $lx_glpk_found  | 
| 125 | 141 | 
		echo CPLEX support................. : $lx_cplex_found  | 
| 126 | 142 | 
		echo SOPLEX support................ : $lx_soplex_found  | 
| 127 | 143 | 
		echo CLP support................... : $lx_clp_found  | 
| 128 | 144 | 
		echo CBC support................... : $lx_cbc_found  | 
| 129 | 145 | 
		echo  | 
| 130 | 146 | 
		echo Build additional tools........ : $enable_tools  | 
| 147 | 
		echo Use valgrind for tests........ : $use_valgrind  | 
|
| 131 | 148 | 
		echo  | 
| 132 | 149 | 
		echo The packace will be installed in  | 
| 133 | 150 | 
		echo -n ' '  | 
| 134 | 151 | 
		echo $prefix.  | 
| 135 | 152 | 
		echo  | 
| 136 | 153 | 
		echo '*********************************************************************'  | 
| 137 | 154 | 
		 | 
| 138 | 155 | 
		echo  | 
| 139 | 156 | 
		echo Configure complete, now type \'make\' and then \'make install\'.  | 
| 140 | 157 | 
		echo  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -56,27 +56,36 @@  | 
| 56 | 56 | 
		// Bundle -gr* options into a group  | 
| 57 | 57 | 
		  ap.optionGroup("gr", "gra")
	 | 
| 58 | 58 | 
		    .optionGroup("gr", "grb")
	 | 
| 59 | 59 | 
		    .optionGroup("gr", "grc");
	 | 
| 60 | 60 | 
		// Set the group mandatory  | 
| 61 | 61 | 
		  ap.mandatoryGroup("gr");
	 | 
| 62 | 62 | 
		// Set the options of the group exclusive (only one option can be given)  | 
| 63 | 63 | 
		  ap.onlyOneGroup("gr");
	 | 
| 64 | 64 | 
		// Add non-parsed arguments (e.g. input files)  | 
| 65 | 65 | 
		  ap.other("infile", "The input file.")
	 | 
| 66 | 66 | 
		    .other("...");
	 | 
| 67 | 67 | 
		 | 
| 68 | 
		// Throw an exception when problems occurs. The default behavior is to  | 
|
| 69 | 
		// exit(1) on these cases, but this makes Valgrind falsely warn  | 
|
| 70 | 
		// about memory leaks.  | 
|
| 71 | 
		ap.throwOnProblems();  | 
|
| 72 | 
		 | 
|
| 68 | 73 | 
		// Perform the parsing process  | 
| 69 | 74 | 
		// (in case of any error it terminates the program)  | 
| 70 | 
		ap.  | 
|
| 75 | 
		  // The try {} construct is necessary only if the ap.trowOnProblems()
	 | 
|
| 76 | 
		// setting is in use.  | 
|
| 77 | 
		  try {
	 | 
|
| 78 | 
		ap.parse();  | 
|
| 79 | 
		  } catch (ArgParserException &) { return 1; }
	 | 
|
| 71 | 80 | 
		 | 
| 72 | 81 | 
		// Check each option if it has been given and print its value  | 
| 73 | 82 | 
		std::cout << "Parameters of '" << ap.commandName() << "':\n";  | 
| 74 | 83 | 
		 | 
| 75 | 84 | 
		std::cout << " Value of -n: " << i << std::endl;  | 
| 76 | 85 | 
		  if(ap.given("val")) std::cout << "  Value of -val: " << d << std::endl;
	 | 
| 77 | 86 | 
		  if(ap.given("val2")) {
	 | 
| 78 | 87 | 
		d = ap["val2"];  | 
| 79 | 88 | 
		std::cout << " Value of -val2: " << d << std::endl;  | 
| 80 | 89 | 
		}  | 
| 81 | 90 | 
		  if(ap.given("name")) std::cout << "  Value of -name: " << s << std::endl;
	 | 
| 82 | 91 | 
		  if(ap.given("f")) std::cout << "  -f is given\n";
	 | 
| ... | ... | 
		@@ -8,43 +8,46 @@  | 
| 8 | 8 | 
		CONFIGURE_FILE(  | 
| 9 | 9 | 
		  ${PROJECT_SOURCE_DIR}/doc/Doxyfile.in
	 | 
| 10 | 10 | 
		  ${PROJECT_BINARY_DIR}/doc/Doxyfile
	 | 
| 11 | 11 | 
		@ONLY  | 
| 12 | 12 | 
		)  | 
| 13 | 13 | 
		 | 
| 14 | 14 | 
		CONFIGURE_FILE(  | 
| 15 | 15 | 
		  ${PROJECT_SOURCE_DIR}/doc/mainpage.dox.in
	 | 
| 16 | 16 | 
		  ${PROJECT_BINARY_DIR}/doc/mainpage.dox
	 | 
| 17 | 17 | 
		@ONLY  | 
| 18 | 18 | 
		)  | 
| 19 | 19 | 
		 | 
| 20 | 
		IF(DOXYGEN_EXECUTABLE AND GHOSTSCRIPT_EXECUTABLE)  | 
|
| 20 | 
		IF(DOXYGEN_EXECUTABLE AND PYTHONINTERP_FOUND AND GHOSTSCRIPT_EXECUTABLE)  | 
|
| 21 | 21 | 
		  FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/)
	 | 
| 22 | 22 | 
		SET(GHOSTSCRIPT_OPTIONS -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha)  | 
| 23 | 23 | 
		ADD_CUSTOM_TARGET(html  | 
| 24 | 24 | 
		    COMMAND ${CMAKE_COMMAND} -E remove_directory gen-images
	 | 
| 25 | 25 | 
		    COMMAND ${CMAKE_COMMAND} -E make_directory gen-images
	 | 
| 26 | 26 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_matching.eps
	 | 
| 27 | 27 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/bipartite_partitions.png ${CMAKE_CURRENT_SOURCE_DIR}/images/bipartite_partitions.eps
	 | 
| 28 | 28 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/connected_components.eps
	 | 
| 29 | 29 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/edge_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/edge_biconnected_components.eps
	 | 
| 30 | 30 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps
	 | 
| 31 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/matching.png ${CMAKE_CURRENT_SOURCE_DIR}/images/matching.eps
	 | 
|
| 31 | 32 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/node_biconnected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/node_biconnected_components.eps
	 | 
| 32 | 33 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps
	 | 
| 33 | 34 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps
	 | 
| 34 | 35 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps
	 | 
| 35 | 36 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps
	 | 
| 36 | 37 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps
	 | 
| 38 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/planar.png ${CMAKE_CURRENT_SOURCE_DIR}/images/planar.eps
	 | 
|
| 37 | 39 | 
		    COMMAND ${GHOSTSCRIPT_EXECUTABLE} ${GHOSTSCRIPT_OPTIONS} -r18 -sOutputFile=gen-images/strongly_connected_components.png ${CMAKE_CURRENT_SOURCE_DIR}/images/strongly_connected_components.eps
	 | 
| 38 | 40 | 
		    COMMAND ${CMAKE_COMMAND} -E remove_directory html
	 | 
| 41 | 
		    COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/bib2dox.py ${CMAKE_CURRENT_SOURCE_DIR}/references.bib >references.dox
	 | 
|
| 39 | 42 | 
		    COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
	 | 
| 40 | 43 | 
		    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
	 | 
| 41 | 44 | 
		)  | 
| 42 | 45 | 
		 | 
| 43 | 46 | 
		SET_TARGET_PROPERTIES(html PROPERTIES PROJECT_LABEL BUILD_DOC)  | 
| 44 | 47 | 
		 | 
| 45 | 48 | 
		IF(UNIX)  | 
| 46 | 49 | 
		INSTALL(  | 
| 47 | 50 | 
		      DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
	 | 
| 48 | 51 | 
		DESTINATION share/doc/lemon/html  | 
| 49 | 52 | 
		COMPONENT html_documentation  | 
| 50 | 53 | 
		)  | 
| ... | ... | 
		@@ -88,25 +88,26 @@  | 
| 88 | 88 | 
		WARN_FORMAT = "$file:$line: $text"  | 
| 89 | 89 | 
		WARN_LOGFILE = doxygen.log  | 
| 90 | 90 | 
		#---------------------------------------------------------------------------  | 
| 91 | 91 | 
		# configuration options related to the input files  | 
| 92 | 92 | 
		#---------------------------------------------------------------------------  | 
| 93 | 93 | 
		INPUT = "@abs_top_srcdir@/doc" \  | 
| 94 | 94 | 
		"@abs_top_srcdir@/lemon" \  | 
| 95 | 95 | 
		"@abs_top_srcdir@/lemon/bits" \  | 
| 96 | 96 | 
		"@abs_top_srcdir@/lemon/concepts" \  | 
| 97 | 97 | 
		"@abs_top_srcdir@/demo" \  | 
| 98 | 98 | 
		"@abs_top_srcdir@/tools" \  | 
| 99 | 99 | 
		"@abs_top_srcdir@/test/test_tools.h" \  | 
| 100 | 
		"@abs_top_builddir@/doc/mainpage.dox"  | 
|
| 100 | 
		"@abs_top_builddir@/doc/mainpage.dox" \  | 
|
| 101 | 
		"@abs_top_builddir@/doc/references.dox"  | 
|
| 101 | 102 | 
		INPUT_ENCODING = UTF-8  | 
| 102 | 103 | 
		FILE_PATTERNS = *.h \  | 
| 103 | 104 | 
		*.cc \  | 
| 104 | 105 | 
		*.dox  | 
| 105 | 106 | 
		RECURSIVE = NO  | 
| 106 | 107 | 
		EXCLUDE =  | 
| 107 | 108 | 
		EXCLUDE_SYMLINKS = NO  | 
| 108 | 109 | 
		EXCLUDE_PATTERNS =  | 
| 109 | 110 | 
		EXCLUDE_SYMBOLS =  | 
| 110 | 111 | 
		EXAMPLE_PATH = "@abs_top_srcdir@/demo" \  | 
| 111 | 112 | 
		"@abs_top_srcdir@/LICENSE" \  | 
| 112 | 113 | 
		"@abs_top_srcdir@/doc"  | 
| ... | ... | 
		@@ -18,25 +18,27 @@  | 
| 18 | 18 | 
		grid_graph.eps \  | 
| 19 | 19 | 
		nodeshape_0.eps \  | 
| 20 | 20 | 
		nodeshape_1.eps \  | 
| 21 | 21 | 
		nodeshape_2.eps \  | 
| 22 | 22 | 
		nodeshape_3.eps \  | 
| 23 | 23 | 
		nodeshape_4.eps  | 
| 24 | 24 | 
		 | 
| 25 | 25 | 
		DOC_EPS_IMAGES27 = \  | 
| 26 | 26 | 
		bipartite_matching.eps \  | 
| 27 | 27 | 
		bipartite_partitions.eps \  | 
| 28 | 28 | 
		connected_components.eps \  | 
| 29 | 29 | 
		edge_biconnected_components.eps \  | 
| 30 | 
		matching.eps \  | 
|
| 30 | 31 | 
		node_biconnected_components.eps \  | 
| 32 | 
		planar.eps \  | 
|
| 31 | 33 | 
		strongly_connected_components.eps  | 
| 32 | 34 | 
		 | 
| 33 | 35 | 
		DOC_EPS_IMAGES = \  | 
| 34 | 36 | 
		$(DOC_EPS_IMAGES18) \  | 
| 35 | 37 | 
		$(DOC_EPS_IMAGES27)  | 
| 36 | 38 | 
		 | 
| 37 | 39 | 
		DOC_PNG_IMAGES = \  | 
| 38 | 40 | 
		$(DOC_EPS_IMAGES:%.eps=doc/gen-images/%.png)  | 
| 39 | 41 | 
		 | 
| 40 | 42 | 
		EXTRA_DIST += $(DOC_EPS_IMAGES:%=doc/images/%)  | 
| 41 | 43 | 
		 | 
| 42 | 44 | 
		doc/html:  | 
| ... | ... | 
		@@ -57,25 +59,37 @@  | 
| 57 | 59 | 
		 | 
| 58 | 60 | 
		$(DOC_EPS_IMAGES27:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps  | 
| 59 | 61 | 
		-mkdir doc/gen-images  | 
| 60 | 62 | 
			if test ${gs_found} = yes; then \
	 | 
| 61 | 63 | 
		$(GS_COMMAND) -sDEVICE=pngalpha -r27 -sOutputFile=$@ $<; \  | 
| 62 | 64 | 
		else \  | 
| 63 | 65 | 
		echo; \  | 
| 64 | 66 | 
		echo "Ghostscript not found."; \  | 
| 65 | 67 | 
		echo; \  | 
| 66 | 68 | 
		exit 1; \  | 
| 67 | 69 | 
		fi  | 
| 68 | 70 | 
		 | 
| 69 | 
		
  | 
|
| 71 | 
		references.dox: doc/references.bib  | 
|
| 72 | 
			if test ${python_found} = yes; then \
	 | 
|
| 73 | 
		cd doc; \  | 
|
| 74 | 
		python @abs_top_srcdir@/scripts/bib2dox.py @abs_top_builddir@/$< >$@; \  | 
|
| 75 | 
		cd ..; \  | 
|
| 76 | 
		else \  | 
|
| 77 | 
		echo; \  | 
|
| 78 | 
		echo "Python not found."; \  | 
|
| 79 | 
		echo; \  | 
|
| 80 | 
		exit 1; \  | 
|
| 81 | 
		fi  | 
|
| 82 | 
		 | 
|
| 83 | 
		html-local: $(DOC_PNG_IMAGES) references.dox  | 
|
| 70 | 84 | 
			if test ${doxygen_found} = yes; then \
	 | 
| 71 | 85 | 
		cd doc; \  | 
| 72 | 86 | 
		doxygen Doxyfile; \  | 
| 73 | 87 | 
		cd ..; \  | 
| 74 | 88 | 
		else \  | 
| 75 | 89 | 
		echo; \  | 
| 76 | 90 | 
		echo "Doxygen not found."; \  | 
| 77 | 91 | 
		echo; \  | 
| 78 | 92 | 
		exit 1; \  | 
| 79 | 93 | 
		fi  | 
| 80 | 94 | 
		 | 
| 81 | 95 | 
		clean-local:  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -217,210 +217,283 @@  | 
| 217 | 217 | 
		 | 
| 218 | 218 | 
		Dijkstra<Digraph, TimeMap> dijkstra(graph, time);  | 
| 219 | 219 | 
		dijkstra.run(source, target);  | 
| 220 | 220 | 
		\endcode  | 
| 221 | 221 | 
		We have a length map and a maximum speed map on the arcs of a digraph.  | 
| 222 | 222 | 
		The minimum time to pass the arc can be calculated as the division of  | 
| 223 | 223 | 
		the two maps which can be done implicitly with the \c DivMap template  | 
| 224 | 224 | 
		class. We use the implicit minimum time map as the length map of the  | 
| 225 | 225 | 
		\c Dijkstra algorithm.  | 
| 226 | 226 | 
		*/  | 
| 227 | 227 | 
		 | 
| 228 | 228 | 
		/**  | 
| 229 | 
		@defgroup matrices Matrices  | 
|
| 230 | 
		@ingroup datas  | 
|
| 231 | 
		\brief Two dimensional data storages implemented in LEMON.  | 
|
| 232 | 
		 | 
|
| 233 | 
		This group contains two dimensional data storages implemented in LEMON.  | 
|
| 234 | 
		*/  | 
|
| 235 | 
		 | 
|
| 236 | 
		/**  | 
|
| 237 | 229 | 
		@defgroup paths Path Structures  | 
| 238 | 230 | 
		@ingroup datas  | 
| 239 | 231 | 
		\brief %Path structures implemented in LEMON.  | 
| 240 | 232 | 
		 | 
| 241 | 233 | 
		This group contains the path structures implemented in LEMON.  | 
| 242 | 234 | 
		 | 
| 243 | 235 | 
		LEMON provides flexible data structures to work with paths.  | 
| 244 | 236 | 
		All of them have similar interfaces and they can be copied easily with  | 
| 245 | 237 | 
		assignment operators and copy constructors. This makes it easy and  | 
| 246 | 238 | 
		efficient to have e.g. the Dijkstra algorithm to store its result in  | 
| 247 | 239 | 
		any kind of path structure.  | 
| 248 | 240 | 
		 | 
| 249 | 
		\sa  | 
|
| 241 | 
		\sa \ref concepts::Path "Path concept"  | 
|
| 242 | 
		*/  | 
|
| 243 | 
		 | 
|
| 244 | 
		/**  | 
|
| 245 | 
		@defgroup heaps Heap Structures  | 
|
| 246 | 
		@ingroup datas  | 
|
| 247 | 
		\brief %Heap structures implemented in LEMON.  | 
|
| 248 | 
		 | 
|
| 249 | 
		This group contains the heap structures implemented in LEMON.  | 
|
| 250 | 
		 | 
|
| 251 | 
		LEMON provides several heap classes. They are efficient implementations  | 
|
| 252 | 
		of the abstract data type \e priority \e queue. They store items with  | 
|
| 253 | 
		specified values called \e priorities in such a way that finding and  | 
|
| 254 | 
		removing the item with minimum priority are efficient.  | 
|
| 255 | 
		The basic operations are adding and erasing items, changing the priority  | 
|
| 256 | 
		of an item, etc.  | 
|
| 257 | 
		 | 
|
| 258 | 
		Heaps are crucial in several algorithms, such as Dijkstra and Prim.  | 
|
| 259 | 
		The heap implementations have the same interface, thus any of them can be  | 
|
| 260 | 
		used easily in such algorithms.  | 
|
| 261 | 
		 | 
|
| 262 | 
		\sa \ref concepts::Heap "Heap concept"  | 
|
| 263 | 
		*/  | 
|
| 264 | 
		 | 
|
| 265 | 
		/**  | 
|
| 266 | 
		@defgroup matrices Matrices  | 
|
| 267 | 
		@ingroup datas  | 
|
| 268 | 
		\brief Two dimensional data storages implemented in LEMON.  | 
|
| 269 | 
		 | 
|
| 270 | 
		This group contains two dimensional data storages implemented in LEMON.  | 
|
| 250 | 271 | 
		*/  | 
| 251 | 272 | 
		 | 
| 252 | 273 | 
		/**  | 
| 253 | 274 | 
		@defgroup auxdat Auxiliary Data Structures  | 
| 254 | 275 | 
		@ingroup datas  | 
| 255 | 276 | 
		\brief Auxiliary data structures implemented in LEMON.  | 
| 256 | 277 | 
		 | 
| 257 | 278 | 
		This group contains some data structures implemented in LEMON in  | 
| 258 | 279 | 
		order to make it easier to implement combinatorial algorithms.  | 
| 259 | 280 | 
		*/  | 
| 260 | 281 | 
		 | 
| 261 | 282 | 
		/**  | 
| 283 | 
		@defgroup geomdat Geometric Data Structures  | 
|
| 284 | 
		@ingroup auxdat  | 
|
| 285 | 
		\brief Geometric data structures implemented in LEMON.  | 
|
| 286 | 
		 | 
|
| 287 | 
		This group contains geometric data structures implemented in LEMON.  | 
|
| 288 | 
		 | 
|
| 289 | 
		- \ref lemon::dim2::Point "dim2::Point" implements a two dimensional  | 
|
| 290 | 
		vector with the usual operations.  | 
|
| 291 | 
		- \ref lemon::dim2::Box "dim2::Box" can be used to determine the  | 
|
| 292 | 
		rectangular bounding box of a set of \ref lemon::dim2::Point  | 
|
| 293 | 
		"dim2::Point"'s.  | 
|
| 294 | 
		*/  | 
|
| 295 | 
		 | 
|
| 296 | 
		/**  | 
|
| 297 | 
		@defgroup matrices Matrices  | 
|
| 298 | 
		@ingroup auxdat  | 
|
| 299 | 
		\brief Two dimensional data storages implemented in LEMON.  | 
|
| 300 | 
		 | 
|
| 301 | 
		This group contains two dimensional data storages implemented in LEMON.  | 
|
| 302 | 
		*/  | 
|
| 303 | 
		 | 
|
| 304 | 
		/**  | 
|
| 262 | 305 | 
		@defgroup algs Algorithms  | 
| 263 | 306 | 
		\brief This group contains the several algorithms  | 
| 264 | 307 | 
		implemented in LEMON.  | 
| 265 | 308 | 
		 | 
| 266 | 309 | 
		This group contains the several algorithms  | 
| 267 | 310 | 
		implemented in LEMON.  | 
| 268 | 311 | 
		*/  | 
| 269 | 312 | 
		 | 
| 270 | 313 | 
		/**  | 
| 271 | 314 | 
		@defgroup search Graph Search  | 
| 272 | 315 | 
		@ingroup algs  | 
| 273 | 316 | 
		\brief Common graph search algorithms.  | 
| 274 | 317 | 
		 | 
| 275 | 318 | 
		This group contains the common graph search algorithms, namely  | 
| 276 | 
		\e breadth-first \e search (BFS) and \e depth-first \e search (DFS)  | 
|
| 319 | 
		\e breadth-first \e search (BFS) and \e depth-first \e search (DFS)  | 
|
| 320 | 
		\ref clrs01algorithms.  | 
|
| 277 | 321 | 
		*/  | 
| 278 | 322 | 
		 | 
| 279 | 323 | 
		/**  | 
| 280 | 324 | 
		@defgroup shortest_path Shortest Path Algorithms  | 
| 281 | 325 | 
		@ingroup algs  | 
| 282 | 326 | 
		\brief Algorithms for finding shortest paths.  | 
| 283 | 327 | 
		 | 
| 284 | 
		This group contains the algorithms for finding shortest paths in digraphs  | 
|
| 328 | 
		This group contains the algorithms for finding shortest paths in digraphs  | 
|
| 329 | 
		\ref clrs01algorithms.  | 
|
| 285 | 330 | 
		 | 
| 286 | 331 | 
		- \ref Dijkstra algorithm for finding shortest paths from a source node  | 
| 287 | 332 | 
		when all arc lengths are non-negative.  | 
| 288 | 333 | 
		- \ref BellmanFord "Bellman-Ford" algorithm for finding shortest paths  | 
| 289 | 334 | 
		from a source node when arc lenghts can be either positive or negative,  | 
| 290 | 335 | 
		but the digraph should not contain directed cycles with negative total  | 
| 291 | 336 | 
		length.  | 
| 292 | 337 | 
		- \ref FloydWarshall "Floyd-Warshall" and \ref Johnson "Johnson" algorithms  | 
| 293 | 338 | 
		for solving the \e all-pairs \e shortest \e paths \e problem when arc  | 
| 294 | 339 | 
		lenghts can be either positive or negative, but the digraph should  | 
| 295 | 340 | 
		not contain directed cycles with negative total length.  | 
| 296 | 341 | 
		- \ref Suurballe A successive shortest path algorithm for finding  | 
| 297 | 342 | 
		arc-disjoint paths between two nodes having minimum total length.  | 
| 298 | 343 | 
		*/  | 
| 299 | 344 | 
		 | 
| 300 | 345 | 
		/**  | 
| 346 | 
		@defgroup spantree Minimum Spanning Tree Algorithms  | 
|
| 347 | 
		@ingroup algs  | 
|
| 348 | 
		\brief Algorithms for finding minimum cost spanning trees and arborescences.  | 
|
| 349 | 
		 | 
|
| 350 | 
		This group contains the algorithms for finding minimum cost spanning  | 
|
| 351 | 
		trees and arborescences \ref clrs01algorithms.  | 
|
| 352 | 
		*/  | 
|
| 353 | 
		 | 
|
| 354 | 
		/**  | 
|
| 301 | 355 | 
		@defgroup max_flow Maximum Flow Algorithms  | 
| 302 | 356 | 
		@ingroup algs  | 
| 303 | 357 | 
		\brief Algorithms for finding maximum flows.  | 
| 304 | 358 | 
		 | 
| 305 | 359 | 
		This group contains the algorithms for finding maximum flows and  | 
| 306 | 
		feasible circulations.  | 
|
| 360 | 
		feasible circulations \ref clrs01algorithms, \ref amo93networkflows.  | 
|
| 307 | 361 | 
		 | 
| 308 | 362 | 
		The \e maximum \e flow \e problem is to find a flow of maximum value between  | 
| 309 | 363 | 
		a single source and a single target. Formally, there is a \f$G=(V,A)\f$  | 
| 310 | 364 | 
		digraph, a \f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function and
	 | 
| 311 | 365 | 
		\f$s, t \in V\f$ source and target nodes.  | 
| 312 | 366 | 
		A maximum flow is an \f$f: A\rightarrow\mathbf{R}^+_0\f$ solution of the
	 | 
| 313 | 367 | 
		following optimization problem.  | 
| 314 | 368 | 
		 | 
| 315 | 369 | 
		\f[ \max\sum_{sv\in A} f(sv) - \sum_{vs\in A} f(vs) \f]
	 | 
| 316 | 370 | 
		\f[ \sum_{uv\in A} f(uv) = \sum_{vu\in A} f(vu)
	 | 
| 317 | 371 | 
		    \quad \forall u\in V\setminus\{s,t\} \f]
	 | 
| 318 | 372 | 
		\f[ 0 \leq f(uv) \leq cap(uv) \quad \forall uv\in A \f]  | 
| 319 | 373 | 
		 | 
| 320 | 374 | 
		LEMON contains several algorithms for solving maximum flow problems:  | 
| 321 | 
		- \ref EdmondsKarp Edmonds-Karp algorithm.  | 
|
| 322 | 
		- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm.  | 
|
| 323 | 
		- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees.  | 
|
| 324 | 
		- \ref GoldbergTarjan Preflow push-relabel algorithm with dynamic trees.  | 
|
| 375 | 
		- \ref EdmondsKarp Edmonds-Karp algorithm  | 
|
| 376 | 
		\ref edmondskarp72theoretical.  | 
|
| 377 | 
		- \ref Preflow Goldberg-Tarjan's preflow push-relabel algorithm  | 
|
| 378 | 
		\ref goldberg88newapproach.  | 
|
| 379 | 
		- \ref DinitzSleatorTarjan Dinitz's blocking flow algorithm with dynamic trees  | 
|
| 380 | 
		\ref dinic70algorithm, \ref sleator83dynamic.  | 
|
| 381 | 
		- \ref GoldbergTarjan !Preflow push-relabel algorithm with dynamic trees  | 
|
| 382 | 
		\ref goldberg88newapproach, \ref sleator83dynamic.  | 
|
| 325 | 383 | 
		 | 
| 326 | 
		In most cases the \ref Preflow  | 
|
| 384 | 
		In most cases the \ref Preflow algorithm provides the  | 
|
| 327 | 385 | 
		fastest method for computing a maximum flow. All implementations  | 
| 328 | 386 | 
		also provide functions to query the minimum cut, which is the dual  | 
| 329 | 387 | 
		problem of maximum flow.  | 
| 330 | 388 | 
		 | 
| 331 | 
		\ref Circulation is a preflow push-relabel algorithm implemented directly  | 
|
| 389 | 
		\ref Circulation is a preflow push-relabel algorithm implemented directly  | 
|
| 332 | 390 | 
		for finding feasible circulations, which is a somewhat different problem,  | 
| 333 | 391 | 
		but it is strongly related to maximum flow.  | 
| 334 | 392 | 
		For more information, see \ref Circulation.  | 
| 335 | 393 | 
		*/  | 
| 336 | 394 | 
		 | 
| 337 | 395 | 
		/**  | 
| 338 | 396 | 
		@defgroup min_cost_flow_algs Minimum Cost Flow Algorithms  | 
| 339 | 397 | 
		@ingroup algs  | 
| 340 | 398 | 
		 | 
| 341 | 399 | 
		\brief Algorithms for finding minimum cost flows and circulations.  | 
| 342 | 400 | 
		 | 
| 343 | 401 | 
		This group contains the algorithms for finding minimum cost flows and  | 
| 344 | 
		circulations. For more information about this problem and its dual  | 
|
| 345 | 
		solution see \ref min_cost_flow "Minimum Cost Flow Problem".  | 
|
| 402 | 
		circulations \ref amo93networkflows. For more information about this  | 
|
| 403 | 
		problem and its dual solution, see \ref min_cost_flow  | 
|
| 404 | 
		"Minimum Cost Flow Problem".  | 
|
| 346 | 405 | 
		 | 
| 347 | 406 | 
		LEMON contains several algorithms for this problem.  | 
| 348 | 407 | 
		- \ref NetworkSimplex Primal Network Simplex algorithm with various  | 
| 349 | 
		pivot strategies.  | 
|
| 350 | 
		- \ref CostScaling Push-Relabel and Augment-Relabel algorithms based on  | 
|
| 351 | 
		cost scaling.  | 
|
| 352 | 
		- \ref CapacityScaling Successive Shortest %Path algorithm with optional  | 
|
| 353 | 
		capacity scaling.  | 
|
| 354 | 
		- \ref CancelAndTighten The Cancel and Tighten algorithm.  | 
|
| 355 | 
		
  | 
|
| 408 | 
		pivot strategies \ref dantzig63linearprog, \ref kellyoneill91netsimplex.  | 
|
| 409 | 
		- \ref CostScaling Cost Scaling algorithm based on push/augment and  | 
|
| 410 | 
		relabel operations \ref goldberg90approximation, \ref goldberg97efficient,  | 
|
| 411 | 
		\ref bunnagel98efficient.  | 
|
| 412 | 
		- \ref CapacityScaling Capacity Scaling algorithm based on the successive  | 
|
| 413 | 
		shortest path method \ref edmondskarp72theoretical.  | 
|
| 414 | 
		- \ref CycleCanceling Cycle-Canceling algorithms, two of which are  | 
|
| 415 | 
		strongly polynomial \ref klein67primal, \ref goldberg89cyclecanceling.  | 
|
| 356 | 416 | 
		 | 
| 357 | 417 | 
		In general NetworkSimplex is the most efficient implementation,  | 
| 358 | 418 | 
		but in special cases other algorithms could be faster.  | 
| 359 | 419 | 
		For example, if the total supply and/or capacities are rather small,  | 
| 360 | 420 | 
		CapacityScaling is usually the fastest algorithm (without effective scaling).  | 
| 361 | 421 | 
		*/  | 
| 362 | 422 | 
		 | 
| 363 | 423 | 
		/**  | 
| 364 | 424 | 
		@defgroup min_cut Minimum Cut Algorithms  | 
| 365 | 425 | 
		@ingroup algs  | 
| 366 | 426 | 
		 | 
| 367 | 427 | 
		\brief Algorithms for finding minimum cut in graphs.  | 
| 368 | 428 | 
		 | 
| 369 | 429 | 
		This group contains the algorithms for finding minimum cut in graphs.  | 
| 370 | 430 | 
		 | 
| 371 | 431 | 
		The \e minimum \e cut \e problem is to find a non-empty and non-complete  | 
| 372 | 432 | 
		\f$X\f$ subset of the nodes with minimum overall capacity on  | 
| 373 | 433 | 
		outgoing arcs. Formally, there is a \f$G=(V,A)\f$ digraph, a  | 
| 374 | 434 | 
		\f$cap: A\rightarrow\mathbf{R}^+_0\f$ capacity function. The minimum
	 | 
| 375 | 435 | 
		cut is the \f$X\f$ solution of the next optimization problem:  | 
| 376 | 436 | 
		 | 
| 377 | 437 | 
		\f[ \min_{X \subset V, X\not\in \{\emptyset, V\}}
	 | 
| 378 | 
		    \sum_{uv\in A
	 | 
|
| 438 | 
		    \sum_{uv\in A: u\in X, v\not\in X}cap(uv) \f]
	 | 
|
| 379 | 439 | 
		 | 
| 380 | 440 | 
		LEMON contains several algorithms related to minimum cut problems:  | 
| 381 | 441 | 
		 | 
| 382 | 442 | 
		- \ref HaoOrlin "Hao-Orlin algorithm" for calculating minimum cut  | 
| 383 | 443 | 
		in directed graphs.  | 
| 384 | 444 | 
		- \ref NagamochiIbaraki "Nagamochi-Ibaraki algorithm" for  | 
| 385 | 445 | 
		calculating minimum cut in undirected graphs.  | 
| 386 | 446 | 
		- \ref GomoryHu "Gomory-Hu tree computation" for calculating  | 
| 387 | 447 | 
		all-pairs minimum cut in undirected graphs.  | 
| 388 | 448 | 
		 | 
| 389 | 449 | 
		If you want to find minimum cut just between two distinict nodes,  | 
| 390 | 450 | 
		see the \ref max_flow "maximum flow problem".  | 
| 391 | 451 | 
		*/  | 
| 392 | 452 | 
		 | 
| 393 | 453 | 
		/**  | 
| 394 | 
		@defgroup  | 
|
| 454 | 
		@defgroup min_mean_cycle Minimum Mean Cycle Algorithms  | 
|
| 395 | 455 | 
		@ingroup algs  | 
| 396 | 
		\brief Algorithms for  | 
|
| 456 | 
		\brief Algorithms for finding minimum mean cycles.  | 
|
| 397 | 457 | 
		 | 
| 398 | 
		This group contains the algorithms for discovering the graph properties  | 
|
| 399 | 
		like connectivity, bipartiteness, euler property, simplicity etc.  | 
|
| 458 | 
		This group contains the algorithms for finding minimum mean cycles  | 
|
| 459 | 
		\ref clrs01algorithms, \ref amo93networkflows.  | 
|
| 400 | 460 | 
		 | 
| 401 | 
		\image html edge_biconnected_components.png  | 
|
| 402 | 
		\image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth  | 
|
| 403 | 
		
  | 
|
| 461 | 
		The \e minimum \e mean \e cycle \e problem is to find a directed cycle  | 
|
| 462 | 
		of minimum mean length (cost) in a digraph.  | 
|
| 463 | 
		The mean length of a cycle is the average length of its arcs, i.e. the  | 
|
| 464 | 
		ratio between the total length of the cycle and the number of arcs on it.  | 
|
| 404 | 465 | 
		 | 
| 405 | 
		/**  | 
|
| 406 | 
		@defgroup planar Planarity Embedding and Drawing  | 
|
| 407 | 
		@ingroup algs  | 
|
| 408 | 
		\brief Algorithms for planarity checking, embedding and drawing  | 
|
| 466 | 
		This problem has an important connection to \e conservative \e length  | 
|
| 467 | 
		\e functions, too. A length function on the arcs of a digraph is called  | 
|
| 468 | 
		conservative if and only if there is no directed cycle of negative total  | 
|
| 469 | 
		length. For an arbitrary length function, the negative of the minimum  | 
|
| 470 | 
		cycle mean is the smallest \f$\epsilon\f$ value so that increasing the  | 
|
| 471 | 
		arc lengths uniformly by \f$\epsilon\f$ results in a conservative length  | 
|
| 472 | 
		function.  | 
|
| 409 | 473 | 
		 | 
| 410 | 
		This group contains the algorithms for planarity checking,  | 
|
| 411 | 
		embedding and drawing.  | 
|
| 474 | 
		LEMON contains three algorithms for solving the minimum mean cycle problem:  | 
|
| 475 | 
		- \ref Karp "Karp"'s original algorithm \ref amo93networkflows,  | 
|
| 476 | 
		\ref dasdan98minmeancycle.  | 
|
| 477 | 
		- \ref HartmannOrlin "Hartmann-Orlin"'s algorithm, which is an improved  | 
|
| 478 | 
		version of Karp's algorithm \ref dasdan98minmeancycle.  | 
|
| 479 | 
		- \ref Howard "Howard"'s policy iteration algorithm  | 
|
| 480 | 
		\ref dasdan98minmeancycle.  | 
|
| 412 | 481 | 
		 | 
| 413 | 
		\image html planar.png  | 
|
| 414 | 
		\image latex planar.eps "Plane graph" width=\textwidth  | 
|
| 482 | 
		In practice, the Howard algorithm proved to be by far the most efficient  | 
|
| 483 | 
		one, though the best known theoretical bound on its running time is  | 
|
| 484 | 
		exponential.  | 
|
| 485 | 
		Both Karp and HartmannOrlin algorithms run in time O(ne) and use space  | 
|
| 486 | 
		O(n<sup>2</sup>+e), but the latter one is typically faster due to the  | 
|
| 487 | 
		applied early termination scheme.  | 
|
| 415 | 488 | 
		*/  | 
| 416 | 489 | 
		 | 
| 417 | 490 | 
		/**  | 
| 418 | 491 | 
		@defgroup matching Matching Algorithms  | 
| 419 | 492 | 
		@ingroup algs  | 
| 420 | 493 | 
		\brief Algorithms for finding matchings in graphs and bipartite graphs.  | 
| 421 | 494 | 
		 | 
| 422 | 495 | 
		This group contains the algorithms for calculating  | 
| 423 | 496 | 
		matchings in graphs and bipartite graphs. The general matching problem is  | 
| 424 | 497 | 
		finding a subset of the edges for which each node has at most one incident  | 
| 425 | 498 | 
		edge.  | 
| 426 | 499 | 
		 | 
| ... | ... | 
		@@ -440,73 +513,98 @@  | 
| 440 | 513 | 
		Successive shortest path algorithm for calculating maximum weighted  | 
| 441 | 514 | 
		matching and maximum weighted bipartite matching in bipartite graphs.  | 
| 442 | 515 | 
		- \ref MinCostMaxBipartiteMatching  | 
| 443 | 516 | 
		Successive shortest path algorithm for calculating minimum cost maximum  | 
| 444 | 517 | 
		matching in bipartite graphs.  | 
| 445 | 518 | 
		- \ref MaxMatching Edmond's blossom shrinking algorithm for calculating  | 
| 446 | 519 | 
		maximum cardinality matching in general graphs.  | 
| 447 | 520 | 
		- \ref MaxWeightedMatching Edmond's blossom shrinking algorithm for calculating  | 
| 448 | 521 | 
		maximum weighted matching in general graphs.  | 
| 449 | 522 | 
		- \ref MaxWeightedPerfectMatching  | 
| 450 | 523 | 
		Edmond's blossom shrinking algorithm for calculating maximum weighted  | 
| 451 | 524 | 
		perfect matching in general graphs.  | 
| 525 | 
		- \ref MaxFractionalMatching Push-relabel algorithm for calculating  | 
|
| 526 | 
		maximum cardinality fractional matching in general graphs.  | 
|
| 527 | 
		- \ref MaxWeightedFractionalMatching Augmenting path algorithm for calculating  | 
|
| 528 | 
		maximum weighted fractional matching in general graphs.  | 
|
| 529 | 
		- \ref MaxWeightedPerfectFractionalMatching  | 
|
| 530 | 
		Augmenting path algorithm for calculating maximum weighted  | 
|
| 531 | 
		perfect fractional matching in general graphs.  | 
|
| 452 | 532 | 
		 | 
| 453 | 
		\image html bipartite_matching.png  | 
|
| 454 | 
		\image latex bipartite_matching.eps "Bipartite Matching" width=\textwidth  | 
|
| 533 | 
		\image html matching.png  | 
|
| 534 | 
		\image latex matching.eps "Min Cost Perfect Matching" width=\textwidth  | 
|
| 455 | 535 | 
		*/  | 
| 456 | 536 | 
		 | 
| 457 | 537 | 
		/**  | 
| 458 | 
		@defgroup  | 
|
| 538 | 
		@defgroup graph_properties Connectivity and Other Graph Properties  | 
|
| 459 | 539 | 
		@ingroup algs  | 
| 460 | 
		\brief Algorithms for  | 
|
| 540 | 
		\brief Algorithms for discovering the graph properties  | 
|
| 461 | 541 | 
		 | 
| 462 | 
		This group contains the algorithms for finding minimum cost spanning  | 
|
| 463 | 
		trees and arborescences.  | 
|
| 542 | 
		This group contains the algorithms for discovering the graph properties  | 
|
| 543 | 
		like connectivity, bipartiteness, euler property, simplicity etc.  | 
|
| 544 | 
		 | 
|
| 545 | 
		\image html connected_components.png  | 
|
| 546 | 
		\image latex connected_components.eps "Connected components" width=\textwidth  | 
|
| 547 | 
		*/  | 
|
| 548 | 
		 | 
|
| 549 | 
		/**  | 
|
| 550 | 
		@defgroup planar Planarity Embedding and Drawing  | 
|
| 551 | 
		@ingroup algs  | 
|
| 552 | 
		\brief Algorithms for planarity checking, embedding and drawing  | 
|
| 553 | 
		 | 
|
| 554 | 
		This group contains the algorithms for planarity checking,  | 
|
| 555 | 
		embedding and drawing.  | 
|
| 556 | 
		 | 
|
| 557 | 
		\image html planar.png  | 
|
| 558 | 
		\image latex planar.eps "Plane graph" width=\textwidth  | 
|
| 559 | 
		*/  | 
|
| 560 | 
		 | 
|
| 561 | 
		/**  | 
|
| 562 | 
		@defgroup approx Approximation Algorithms  | 
|
| 563 | 
		@ingroup algs  | 
|
| 564 | 
		\brief Approximation algorithms.  | 
|
| 565 | 
		 | 
|
| 566 | 
		This group contains the approximation and heuristic algorithms  | 
|
| 567 | 
		implemented in LEMON.  | 
|
| 464 | 568 | 
		*/  | 
| 465 | 569 | 
		 | 
| 466 | 570 | 
		/**  | 
| 467 | 571 | 
		@defgroup auxalg Auxiliary Algorithms  | 
| 468 | 572 | 
		@ingroup algs  | 
| 469 | 573 | 
		\brief Auxiliary algorithms implemented in LEMON.  | 
| 470 | 574 | 
		 | 
| 471 | 575 | 
		This group contains some algorithms implemented in LEMON  | 
| 472 | 576 | 
		in order to make it easier to implement complex algorithms.  | 
| 473 | 577 | 
		*/  | 
| 474 | 578 | 
		 | 
| 475 | 579 | 
		/**  | 
| 476 | 
		@defgroup approx Approximation Algorithms  | 
|
| 477 | 
		@ingroup algs  | 
|
| 478 | 
		\brief Approximation algorithms.  | 
|
| 479 | 
		 | 
|
| 480 | 
		This group contains the approximation and heuristic algorithms  | 
|
| 481 | 
		implemented in LEMON.  | 
|
| 482 | 
		*/  | 
|
| 483 | 
		 | 
|
| 484 | 
		/**  | 
|
| 485 | 580 | 
		@defgroup gen_opt_group General Optimization Tools  | 
| 486 | 581 | 
		\brief This group contains some general optimization frameworks  | 
| 487 | 582 | 
		implemented in LEMON.  | 
| 488 | 583 | 
		 | 
| 489 | 584 | 
		This group contains some general optimization frameworks  | 
| 490 | 585 | 
		implemented in LEMON.  | 
| 491 | 586 | 
		*/  | 
| 492 | 587 | 
		 | 
| 493 | 588 | 
		/**  | 
| 494 | 
		@defgroup lp_group  | 
|
| 589 | 
		@defgroup lp_group LP and MIP Solvers  | 
|
| 495 | 590 | 
		@ingroup gen_opt_group  | 
| 496 | 
		\brief  | 
|
| 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 | 
		
  | 
|
| 593 | 
		This group contains LP and MIP solver interfaces for LEMON.  | 
|
| 594 | 
		Various LP solvers could be used in the same manner with this  | 
|
| 595 | 
		high-level interface.  | 
|
| 596 | 
		 | 
|
| 597 | 
		The currently supported solvers are \ref glpk, \ref clp, \ref cbc,  | 
|
| 598 | 
		\ref cplex, \ref soplex.  | 
|
| 501 | 599 | 
		*/  | 
| 502 | 600 | 
		 | 
| 503 | 601 | 
		/**  | 
| 504 | 602 | 
		@defgroup lp_utils Tools for Lp and Mip Solvers  | 
| 505 | 603 | 
		@ingroup lp_group  | 
| 506 | 604 | 
		\brief Helper tools to the Lp and Mip solvers.  | 
| 507 | 605 | 
		 | 
| 508 | 606 | 
		This group adds some helper tools to general optimization framework  | 
| 509 | 607 | 
		implemented in LEMON.  | 
| 510 | 608 | 
		*/  | 
| 511 | 609 | 
		 | 
| 512 | 610 | 
		/**  | 
| ... | ... | 
		@@ -578,25 +676,25 @@  | 
| 578 | 676 | 
		*/  | 
| 579 | 677 | 
		 | 
| 580 | 678 | 
		/**  | 
| 581 | 679 | 
		@defgroup eps_io Postscript Exporting  | 
| 582 | 680 | 
		@ingroup io_group  | 
| 583 | 681 | 
		\brief General \c EPS drawer and graph exporter  | 
| 584 | 682 | 
		 | 
| 585 | 683 | 
		This group contains general \c EPS drawing methods and special  | 
| 586 | 684 | 
		graph exporting tools.  | 
| 587 | 685 | 
		*/  | 
| 588 | 686 | 
		 | 
| 589 | 687 | 
		/**  | 
| 590 | 
		@defgroup dimacs_group DIMACS  | 
|
| 688 | 
		@defgroup dimacs_group DIMACS Format  | 
|
| 591 | 689 | 
		@ingroup io_group  | 
| 592 | 690 | 
		\brief Read and write files in DIMACS format  | 
| 593 | 691 | 
		 | 
| 594 | 692 | 
		Tools to read a digraph from or write it to a file in DIMACS format data.  | 
| 595 | 693 | 
		*/  | 
| 596 | 694 | 
		 | 
| 597 | 695 | 
		/**  | 
| 598 | 696 | 
		@defgroup nauty_group NAUTY Format  | 
| 599 | 697 | 
		@ingroup io_group  | 
| 600 | 698 | 
		\brief Read \e Nauty format  | 
| 601 | 699 | 
		 | 
| 602 | 700 | 
		Tool to read graphs from \e Nauty format data.  | 
| ... | ... | 
		@@ -627,46 +725,46 @@  | 
| 627 | 725 | 
		- The concept descriptor classes also provide a <em>checker class</em>  | 
| 628 | 726 | 
		that makes it possible to check whether a certain implementation of a  | 
| 629 | 727 | 
		concept indeed provides all the required features.  | 
| 630 | 728 | 
		 | 
| 631 | 729 | 
		- Finally, They can serve as a skeleton of a new implementation of a concept.  | 
| 632 | 730 | 
		*/  | 
| 633 | 731 | 
		 | 
| 634 | 732 | 
		/**  | 
| 635 | 733 | 
		@defgroup graph_concepts Graph Structure Concepts  | 
| 636 | 734 | 
		@ingroup concept  | 
| 637 | 735 | 
		\brief Skeleton and concept checking classes for graph structures  | 
| 638 | 736 | 
		 | 
| 639 | 
		This group contains the skeletons and concept checking classes of LEMON's  | 
|
| 640 | 
		graph structures and helper classes used to implement these.  | 
|
| 737 | 
		This group contains the skeletons and concept checking classes of  | 
|
| 738 | 
		graph structures.  | 
|
| 641 | 739 | 
		*/  | 
| 642 | 740 | 
		 | 
| 643 | 741 | 
		/**  | 
| 644 | 742 | 
		@defgroup map_concepts Map Concepts  | 
| 645 | 743 | 
		@ingroup concept  | 
| 646 | 744 | 
		\brief Skeleton and concept checking classes for maps  | 
| 647 | 745 | 
		 | 
| 648 | 746 | 
		This group contains the skeletons and concept checking classes of maps.  | 
| 649 | 747 | 
		*/  | 
| 650 | 748 | 
		 | 
| 651 | 749 | 
		/**  | 
| 750 | 
		@defgroup tools Standalone Utility Applications  | 
|
| 751 | 
		 | 
|
| 752 | 
		Some utility applications are listed here.  | 
|
| 753 | 
		 | 
|
| 754 | 
		The standard compilation procedure (<tt>./configure;make</tt>) will compile  | 
|
| 755 | 
		them, as well.  | 
|
| 756 | 
		*/  | 
|
| 757 | 
		 | 
|
| 758 | 
		/**  | 
|
| 652 | 759 | 
		\anchor demoprograms  | 
| 653 | 760 | 
		 | 
| 654 | 761 | 
		@defgroup demos Demo Programs  | 
| 655 | 762 | 
		 | 
| 656 | 763 | 
		Some demo programs are listed here. Their full source codes can be found in  | 
| 657 | 764 | 
		the \c demo subdirectory of the source tree.  | 
| 658 | 765 | 
		 | 
| 659 | 766 | 
		In order to compile them, use the <tt>make demo</tt> or the  | 
| 660 | 767 | 
		<tt>make check</tt> commands.  | 
| 661 | 768 | 
		*/  | 
| 662 | 769 | 
		 | 
| 663 | 
		/**  | 
|
| 664 | 
		@defgroup tools Standalone Utility Applications  | 
|
| 665 | 
		 | 
|
| 666 | 
		Some utility applications are listed here.  | 
|
| 667 | 
		 | 
|
| 668 | 
		The standard compilation procedure (<tt>./configure;make</tt>) will compile  | 
|
| 669 | 
		them, as well.  | 
|
| 670 | 
		*/  | 
|
| 671 | 
		 | 
|
| 672 | 770 | 
		}  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| 18 | 18 | 
		 | 
| 19 | 19 | 
		/**  | 
| 20 | 20 | 
		\mainpage @PACKAGE_NAME@ @PACKAGE_VERSION@ Documentation  | 
| 21 | 21 | 
		 | 
| 22 | 22 | 
		\section intro Introduction  | 
| 23 | 23 | 
		 | 
| 24 | 
		\subsection whatis What is LEMON  | 
|
| 25 | 
		 | 
|
| 26 | 
		LEMON stands for <b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling  | 
|
| 27 | 
		and <b>O</b>ptimization in <b>N</b>etworks.  | 
|
| 28 | 
		It is a C++ template  | 
|
| 29 | 
		library aimed at combinatorial optimization tasks which  | 
|
| 30 | 
		often involve in working  | 
|
| 31 | 
		with graphs.  | 
|
| 24 | 
		<b>LEMON</b> stands for <i><b>L</b>ibrary for <b>E</b>fficient <b>M</b>odeling  | 
|
| 25 | 
		and <b>O</b>ptimization in <b>N</b>etworks</i>.  | 
|
| 26 | 
		It is a C++ template library providing efficient implementations of common  | 
|
| 27 | 
		data structures and algorithms with focus on combinatorial optimization  | 
|
| 28 | 
		tasks connected mainly with graphs and networks.  | 
|
| 32 | 29 | 
		 | 
| 33 | 30 | 
		<b>  | 
| 34 | 31 | 
		LEMON is an <a class="el" href="http://opensource.org/">open source</a>  | 
| 35 | 32 | 
		project.  | 
| 36 | 33 | 
		You are free to use it in your commercial or  | 
| 37 | 34 | 
		non-commercial applications under very permissive  | 
| 38 | 35 | 
		\ref license "license terms".  | 
| 39 | 36 | 
		</b>  | 
| 40 | 37 | 
		 | 
| 41 | 
		
  | 
|
| 38 | 
		The project is maintained by the  | 
|
| 39 | 
		<a href="http://www.cs.elte.hu/egres/">Egervá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ötvös Loránd University</a>,  | 
|
| 43 | 
		Budapest, Hungary.  | 
|
| 44 | 
		LEMON is also a member of the <a href="http://www.coin-or.org/">COIN-OR</a>  | 
|
| 45 | 
		initiative \ref coinor.  | 
|
| 46 | 
		 | 
|
| 47 | 
		\section howtoread How to Read the Documentation  | 
|
| 42 | 48 | 
		 | 
| 43 | 49 | 
		If you would like to get to know the library, see  | 
| 44 | 50 | 
		<a class="el" href="http://lemon.cs.elte.hu/pub/tutorial/">LEMON Tutorial</a>.  | 
| 45 | 51 | 
		 | 
| 52 | 
		If you are interested in starting to use the library, see the <a class="el"  | 
|
| 53 | 
		href="http://lemon.cs.elte.hu/trac/lemon/wiki/InstallGuide/">Installation  | 
|
| 54 | 
		Guide</a>.  | 
|
| 55 | 
		 | 
|
| 46 | 56 | 
		If you know what you are looking for, then try to find it under the  | 
| 47 | 57 | 
		<a class="el" href="modules.html">Modules</a> section.  | 
| 48 | 58 | 
		 | 
| 49 | 59 | 
		If you are a user of the old (0.x) series of LEMON, please check out the  | 
| 50 | 60 | 
		\ref migration "Migration Guide" for the backward incompatibilities.  | 
| 51 | 61 | 
		*/  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| 18 | 18 | 
		 | 
| 19 | 19 | 
		namespace lemon {
	 | 
| 20 | 20 | 
		 | 
| 21 | 21 | 
		/**  | 
| 22 | 22 | 
		\page min_cost_flow Minimum Cost Flow Problem  | 
| 23 | 23 | 
		 | 
| 24 | 24 | 
		\section mcf_def Definition (GEQ form)  | 
| 25 | 25 | 
		 | 
| 26 | 26 | 
		The \e minimum \e cost \e flow \e problem is to find a feasible flow of  | 
| 27 | 27 | 
		minimum total cost from a set of supply nodes to a set of demand nodes  | 
| 28 | 28 | 
		in a network with capacity constraints (lower and upper bounds)  | 
| 29 | 
		and arc costs.  | 
|
| 29 | 
		and arc costs \ref amo93networkflows.  | 
|
| 30 | 30 | 
		 | 
| 31 | 31 | 
		Formally, let \f$G=(V,A)\f$ be a digraph, \f$lower: A\rightarrow\mathbf{R}\f$,
	 | 
| 32 | 32 | 
		\f$upper: A\rightarrow\mathbf{R}\cup\{+\infty\}\f$ denote the lower and
	 | 
| 33 | 33 | 
		upper bounds for the flow values on the arcs, for which  | 
| 34 | 34 | 
		\f$lower(uv) \leq upper(uv)\f$ must hold for all \f$uv\in A\f$,  | 
| 35 | 35 | 
		\f$cost: A\rightarrow\mathbf{R}\f$ denotes the cost per unit flow
	 | 
| 36 | 36 | 
		on the arcs and \f$sup: V\rightarrow\mathbf{R}\f$ denotes the
	 | 
| 37 | 37 | 
		signed supply values of the nodes.  | 
| 38 | 38 | 
		If \f$sup(u)>0\f$, then \f$u\f$ is a supply node with \f$sup(u)\f$  | 
| 39 | 39 | 
		supply, if \f$sup(u)<0\f$, then \f$u\f$ is a demand node with  | 
| 40 | 40 | 
		\f$-sup(u)\f$ demand.  | 
| 41 | 41 | 
		A minimum cost flow is an \f$f: A\rightarrow\mathbf{R}\f$ solution
	 | 
| ... | ... | 
		@@ -69,28 +69,28 @@  | 
| 69 | 69 | 
		 | 
| 70 | 70 | 
		The dual solution of the minimum cost flow problem is represented by  | 
| 71 | 71 | 
		node potentials \f$\pi: V\rightarrow\mathbf{R}\f$.
	 | 
| 72 | 72 | 
		An \f$f: A\rightarrow\mathbf{R}\f$ primal feasible solution is optimal
	 | 
| 73 | 73 | 
		if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$ node potentials
	 | 
| 74 | 74 | 
		the following \e complementary \e slackness optimality conditions hold.  | 
| 75 | 75 | 
		 | 
| 76 | 76 | 
		- For all \f$uv\in A\f$ arcs:  | 
| 77 | 77 | 
		- if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;  | 
| 78 | 78 | 
		- if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;  | 
| 79 | 79 | 
		- if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.  | 
| 80 | 80 | 
		- For all \f$u\in V\f$ nodes:  | 
| 81 | 
		- \f$\pi(u)  | 
|
| 81 | 
		- \f$\pi(u)\leq 0\f$;  | 
|
| 82 | 82 | 
		   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
	 | 
| 83 | 83 | 
		then \f$\pi(u)=0\f$.  | 
| 84 | 
		 | 
|
| 84 | 
		 | 
|
| 85 | 85 | 
		Here \f$cost^\pi(uv)\f$ denotes the \e reduced \e cost of the arc  | 
| 86 | 86 | 
		\f$uv\in A\f$ with respect to the potential function \f$\pi\f$, i.e.  | 
| 87 | 87 | 
		\f[ cost^\pi(uv) = cost(uv) + \pi(u) - \pi(v).\f]  | 
| 88 | 88 | 
		 | 
| 89 | 89 | 
		All algorithms provide dual solution (node potentials), as well,  | 
| 90 | 90 | 
		if an optimal flow is found.  | 
| 91 | 91 | 
		 | 
| 92 | 92 | 
		 | 
| 93 | 93 | 
		\section mcf_eq Equality Form  | 
| 94 | 94 | 
		 | 
| 95 | 95 | 
		The above \ref mcf_def "definition" is actually more general than the  | 
| 96 | 96 | 
		usual formulation of the minimum cost flow problem, in which strict  | 
| ... | ... | 
		@@ -110,25 +110,25 @@  | 
| 110 | 110 | 
		 | 
| 111 | 111 | 
		\section mcf_leq Opposite Inequalites (LEQ Form)  | 
| 112 | 112 | 
		 | 
| 113 | 113 | 
		Another possible definition of the minimum cost flow problem is  | 
| 114 | 114 | 
		when there are <em>"less or equal"</em> (LEQ) supply/demand constraints,  | 
| 115 | 115 | 
		instead of the <em>"greater or equal"</em> (GEQ) constraints.  | 
| 116 | 116 | 
		 | 
| 117 | 117 | 
		\f[ \min\sum_{uv\in A} f(uv) \cdot cost(uv) \f]
	 | 
| 118 | 118 | 
		\f[ \sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \leq
	 | 
| 119 | 119 | 
		sup(u) \quad \forall u\in V \f]  | 
| 120 | 120 | 
		\f[ lower(uv) \leq f(uv) \leq upper(uv) \quad \forall uv\in A \f]  | 
| 121 | 121 | 
		 | 
| 122 | 
		It means that the total demand must be less or equal to the  | 
|
| 122 | 
		It means that the total demand must be less or equal to the  | 
|
| 123 | 123 | 
		total supply (i.e. \f$\sum_{u\in V} sup(u)\f$ must be zero or
	 | 
| 124 | 124 | 
		positive) and all the demands have to be satisfied, but there  | 
| 125 | 125 | 
		could be supplies that are not carried out from the supply  | 
| 126 | 126 | 
		nodes.  | 
| 127 | 127 | 
		The equality form is also a special case of this form, of course.  | 
| 128 | 128 | 
		 | 
| 129 | 129 | 
		You could easily transform this case to the \ref mcf_def "GEQ form"  | 
| 130 | 130 | 
		of the problem by reversing the direction of the arcs and taking the  | 
| 131 | 131 | 
		negative of the supply values (e.g. using \ref ReverseDigraph and  | 
| 132 | 132 | 
		\ref NegMap adaptors).  | 
| 133 | 133 | 
		However \ref NetworkSimplex algorithm also supports this form directly  | 
| 134 | 134 | 
		for the sake of convenience.  | 
| ... | ... | 
		@@ -136,18 +136,18 @@  | 
| 136 | 136 | 
		Note that the optimality conditions for this supply constraint type are  | 
| 137 | 137 | 
		slightly differ from the conditions that are discussed for the GEQ form,  | 
| 138 | 138 | 
		namely the potentials have to be non-negative instead of non-positive.  | 
| 139 | 139 | 
		An \f$f: A\rightarrow\mathbf{R}\f$ feasible solution of this problem
	 | 
| 140 | 140 | 
		is optimal if and only if for some \f$\pi: V\rightarrow\mathbf{R}\f$
	 | 
| 141 | 141 | 
		node potentials the following conditions hold.  | 
| 142 | 142 | 
		 | 
| 143 | 143 | 
		- For all \f$uv\in A\f$ arcs:  | 
| 144 | 144 | 
		- if \f$cost^\pi(uv)>0\f$, then \f$f(uv)=lower(uv)\f$;  | 
| 145 | 145 | 
		- if \f$lower(uv)<f(uv)<upper(uv)\f$, then \f$cost^\pi(uv)=0\f$;  | 
| 146 | 146 | 
		- if \f$cost^\pi(uv)<0\f$, then \f$f(uv)=upper(uv)\f$.  | 
| 147 | 147 | 
		- For all \f$u\in V\f$ nodes:  | 
| 148 | 
		- \f$\pi(u)  | 
|
| 148 | 
		- \f$\pi(u)\geq 0\f$;  | 
|
| 149 | 149 | 
		   - if \f$\sum_{uv\in A} f(uv) - \sum_{vu\in A} f(vu) \neq sup(u)\f$,
	 | 
| 150 | 150 | 
		then \f$\pi(u)=0\f$.  | 
| 151 | 151 | 
		 | 
| 152 | 152 | 
		*/  | 
| 153 | 153 | 
		}  | 
| ... | ... | 
		@@ -49,72 +49,86 @@  | 
| 49 | 49 | 
		if HAVE_CLP  | 
| 50 | 50 | 
		lemon_libemon_la_SOURCES += lemon/clp.cc  | 
| 51 | 51 | 
		endif  | 
| 52 | 52 | 
		 | 
| 53 | 53 | 
		if HAVE_CBC  | 
| 54 | 54 | 
		lemon_libemon_la_SOURCES += lemon/cbc.cc  | 
| 55 | 55 | 
		endif  | 
| 56 | 56 | 
		 | 
| 57 | 57 | 
		lemon_HEADERS += \  | 
| 58 | 58 | 
		lemon/adaptors.h \  | 
| 59 | 59 | 
		lemon/arg_parser.h \  | 
| 60 | 60 | 
		lemon/assert.h \  | 
| 61 | 
		lemon/bellman_ford.h \  | 
|
| 61 | 62 | 
		lemon/bfs.h \  | 
| 62 | 63 | 
		lemon/bin_heap.h \  | 
| 64 | 
		lemon/binomial_heap.h \  | 
|
| 63 | 65 | 
		lemon/bucket_heap.h \  | 
| 66 | 
		lemon/capacity_scaling.h \  | 
|
| 64 | 67 | 
		lemon/cbc.h \  | 
| 65 | 68 | 
		lemon/circulation.h \  | 
| 66 | 69 | 
		lemon/clp.h \  | 
| 67 | 70 | 
		lemon/color.h \  | 
| 68 | 71 | 
		lemon/concept_check.h \  | 
| 69 | 72 | 
		lemon/connectivity.h \  | 
| 73 | 
		lemon/core.h \  | 
|
| 74 | 
		lemon/cost_scaling.h \  | 
|
| 70 | 75 | 
		lemon/counter.h \  | 
| 71 | 
		lemon/core.h \  | 
|
| 72 | 76 | 
		lemon/cplex.h \  | 
| 77 | 
		lemon/cycle_canceling.h \  | 
|
| 73 | 78 | 
		lemon/dfs.h \  | 
| 79 | 
		lemon/dheap.h \  | 
|
| 74 | 80 | 
		lemon/dijkstra.h \  | 
| 75 | 81 | 
		lemon/dim2.h \  | 
| 76 | 82 | 
		lemon/dimacs.h \  | 
| 77 | 83 | 
		lemon/edge_set.h \  | 
| 78 | 84 | 
		lemon/elevator.h \  | 
| 79 | 85 | 
		lemon/error.h \  | 
| 80 | 86 | 
		lemon/euler.h \  | 
| 81 | 87 | 
		lemon/fib_heap.h \  | 
| 88 | 
		lemon/fractional_matching.h \  | 
|
| 82 | 89 | 
		lemon/full_graph.h \  | 
| 83 | 90 | 
		lemon/glpk.h \  | 
| 84 | 91 | 
		lemon/gomory_hu.h \  | 
| 85 | 92 | 
		lemon/graph_to_eps.h \  | 
| 86 | 93 | 
		lemon/grid_graph.h \  | 
| 94 | 
		lemon/hartmann_orlin_mmc.h \  | 
|
| 95 | 
		lemon/howard_mmc.h \  | 
|
| 87 | 96 | 
		lemon/hypercube_graph.h \  | 
| 97 | 
		lemon/karp_mmc.h \  | 
|
| 88 | 98 | 
		lemon/kruskal.h \  | 
| 89 | 99 | 
		lemon/hao_orlin.h \  | 
| 90 | 100 | 
		lemon/lgf_reader.h \  | 
| 91 | 101 | 
		lemon/lgf_writer.h \  | 
| 92 | 102 | 
		lemon/list_graph.h \  | 
| 93 | 103 | 
		lemon/lp.h \  | 
| 94 | 104 | 
		lemon/lp_base.h \  | 
| 95 | 105 | 
		lemon/lp_skeleton.h \  | 
| 96 | 106 | 
		lemon/maps.h \  | 
| 97 | 107 | 
		lemon/matching.h \  | 
| 98 | 108 | 
		lemon/math.h \  | 
| 99 | 109 | 
		lemon/min_cost_arborescence.h \  | 
| 100 | 110 | 
		lemon/nauty_reader.h \  | 
| 101 | 111 | 
		lemon/network_simplex.h \  | 
| 112 | 
		lemon/pairing_heap.h \  | 
|
| 102 | 113 | 
		lemon/path.h \  | 
| 114 | 
		lemon/planarity.h \  | 
|
| 103 | 115 | 
		lemon/preflow.h \  | 
| 116 | 
		lemon/quad_heap.h \  | 
|
| 104 | 117 | 
		lemon/radix_heap.h \  | 
| 105 | 118 | 
		lemon/radix_sort.h \  | 
| 106 | 119 | 
		lemon/random.h \  | 
| 107 | 120 | 
		lemon/smart_graph.h \  | 
| 108 | 121 | 
		lemon/soplex.h \  | 
| 122 | 
		lemon/static_graph.h \  | 
|
| 109 | 123 | 
		lemon/suurballe.h \  | 
| 110 | 124 | 
		lemon/time_measure.h \  | 
| 111 | 125 | 
		lemon/tolerance.h \  | 
| 112 | 126 | 
		lemon/unionfind.h \  | 
| 113 | 127 | 
		lemon/bits/windows.h  | 
| 114 | 128 | 
		 | 
| 115 | 129 | 
		bits_HEADERS += \  | 
| 116 | 130 | 
		lemon/bits/alteration_notifier.h \  | 
| 117 | 131 | 
		lemon/bits/array_map.h \  | 
| 118 | 132 | 
		lemon/bits/bezier.h \  | 
| 119 | 133 | 
		lemon/bits/default_map.h \  | 
| 120 | 134 | 
		lemon/bits/edge_set_extender.h \  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -351,24 +351,27 @@  | 
| 351 | 351 | 
		/// \ingroup graph_adaptors  | 
| 352 | 352 | 
		///  | 
| 353 | 353 | 
		/// \brief Adaptor class for reversing the orientation of the arcs in  | 
| 354 | 354 | 
		/// a digraph.  | 
| 355 | 355 | 
		///  | 
| 356 | 356 | 
		/// ReverseDigraph can be used for reversing the arcs in a digraph.  | 
| 357 | 357 | 
		/// It conforms to the \ref concepts::Digraph "Digraph" concept.  | 
| 358 | 358 | 
		///  | 
| 359 | 359 | 
		/// The adapted digraph can also be modified through this adaptor  | 
| 360 | 360 | 
		/// by adding or removing nodes or arcs, unless the \c GR template  | 
| 361 | 361 | 
		/// parameter is set to be \c const.  | 
| 362 | 362 | 
		///  | 
| 363 | 
		/// This class provides item counting in the same time as the adapted  | 
|
| 364 | 
		/// digraph structure.  | 
|
| 365 | 
		///  | 
|
| 363 | 366 | 
		/// \tparam DGR The type of the adapted digraph.  | 
| 364 | 367 | 
		/// It must conform to the \ref concepts::Digraph "Digraph" concept.  | 
| 365 | 368 | 
		/// It can also be specified to be \c const.  | 
| 366 | 369 | 
		///  | 
| 367 | 370 | 
		/// \note The \c Node and \c Arc types of this adaptor and the adapted  | 
| 368 | 371 | 
		/// digraph are convertible to each other.  | 
| 369 | 372 | 
		template<typename DGR>  | 
| 370 | 373 | 
		#ifdef DOXYGEN  | 
| 371 | 374 | 
		  class ReverseDigraph {
	 | 
| 372 | 375 | 
		#else  | 
| 373 | 376 | 
		class ReverseDigraph :  | 
| 374 | 377 | 
		    public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
	 | 
| ... | ... | 
		@@ -409,25 +412,25 @@  | 
| 409 | 412 | 
		typedef AF ArcFilterMap;  | 
| 410 | 413 | 
		 | 
| 411 | 414 | 
		typedef SubDigraphBase Adaptor;  | 
| 412 | 415 | 
		protected:  | 
| 413 | 416 | 
		NF* _node_filter;  | 
| 414 | 417 | 
		AF* _arc_filter;  | 
| 415 | 418 | 
		SubDigraphBase()  | 
| 416 | 419 | 
		      : Parent(), _node_filter(0), _arc_filter(0) { }
	 | 
| 417 | 420 | 
		 | 
| 418 | 421 | 
		    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
	 | 
| 419 | 422 | 
		Parent::initialize(digraph);  | 
| 420 | 423 | 
		_node_filter = &node_filter;  | 
| 421 | 
		_arc_filter = &arc_filter;  | 
|
| 424 | 
		_arc_filter = &arc_filter;  | 
|
| 422 | 425 | 
		}  | 
| 423 | 426 | 
		 | 
| 424 | 427 | 
		public:  | 
| 425 | 428 | 
		 | 
| 426 | 429 | 
		typedef typename Parent::Node Node;  | 
| 427 | 430 | 
		typedef typename Parent::Arc Arc;  | 
| 428 | 431 | 
		 | 
| 429 | 432 | 
		    void first(Node& i) const {
	 | 
| 430 | 433 | 
		Parent::first(i);  | 
| 431 | 434 | 
		while (i != INVALID && !(*_node_filter)[i]) Parent::next(i);  | 
| 432 | 435 | 
		}  | 
| 433 | 436 | 
		 | 
| ... | ... | 
		@@ -496,54 +499,54 @@  | 
| 496 | 499 | 
		return INVALID;  | 
| 497 | 500 | 
		}  | 
| 498 | 501 | 
		Arc arc = Parent::findArc(source, target, prev);  | 
| 499 | 502 | 
		      while (arc != INVALID && !(*_arc_filter)[arc]) {
	 | 
| 500 | 503 | 
		arc = Parent::findArc(source, target, arc);  | 
| 501 | 504 | 
		}  | 
| 502 | 505 | 
		return arc;  | 
| 503 | 506 | 
		}  | 
| 504 | 507 | 
		 | 
| 505 | 508 | 
		public:  | 
| 506 | 509 | 
		 | 
| 507 | 510 | 
		template <typename V>  | 
| 508 | 
		class NodeMap  | 
|
| 509 | 
		: public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,  | 
|
| 510 | 
		
  | 
|
| 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 | 
		
  | 
|
| 515 | 
		LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;  | 
|
| 513 | 516 | 
		 | 
| 514 | 517 | 
		public:  | 
| 515 | 518 | 
		typedef V Value;  | 
| 516 | 519 | 
		 | 
| 517 | 520 | 
		NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)  | 
| 518 | 521 | 
		        : Parent(adaptor) {}
	 | 
| 519 | 522 | 
		NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)  | 
| 520 | 523 | 
		        : Parent(adaptor, value) {}
	 | 
| 521 | 524 | 
		 | 
| 522 | 525 | 
		private:  | 
| 523 | 526 | 
		      NodeMap& operator=(const NodeMap& cmap) {
	 | 
| 524 | 527 | 
		return operator=<NodeMap>(cmap);  | 
| 525 | 528 | 
		}  | 
| 526 | 529 | 
		 | 
| 527 | 530 | 
		template <typename CMap>  | 
| 528 | 531 | 
		      NodeMap& operator=(const CMap& cmap) {
	 | 
| 529 | 532 | 
		Parent::operator=(cmap);  | 
| 530 | 533 | 
		return *this;  | 
| 531 | 534 | 
		}  | 
| 532 | 535 | 
		};  | 
| 533 | 536 | 
		 | 
| 534 | 537 | 
		template <typename V>  | 
| 535 | 
		class ArcMap  | 
|
| 538 | 
		class ArcMap  | 
|
| 536 | 539 | 
		: public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,  | 
| 537 | 
		
  | 
|
| 540 | 
		              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
	 | 
|
| 538 | 541 | 
		typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,  | 
| 539 | 542 | 
		LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;  | 
| 540 | 543 | 
		 | 
| 541 | 544 | 
		public:  | 
| 542 | 545 | 
		typedef V Value;  | 
| 543 | 546 | 
		 | 
| 544 | 547 | 
		ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)  | 
| 545 | 548 | 
		        : Parent(adaptor) {}
	 | 
| 546 | 549 | 
		ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)  | 
| 547 | 550 | 
		        : Parent(adaptor, value) {}
	 | 
| 548 | 551 | 
		 | 
| 549 | 552 | 
		private:  | 
| ... | ... | 
		@@ -570,25 +573,25 @@  | 
| 570 | 573 | 
		typedef AF ArcFilterMap;  | 
| 571 | 574 | 
		 | 
| 572 | 575 | 
		typedef SubDigraphBase Adaptor;  | 
| 573 | 576 | 
		protected:  | 
| 574 | 577 | 
		NF* _node_filter;  | 
| 575 | 578 | 
		AF* _arc_filter;  | 
| 576 | 579 | 
		SubDigraphBase()  | 
| 577 | 580 | 
		      : Parent(), _node_filter(0), _arc_filter(0) { }
	 | 
| 578 | 581 | 
		 | 
| 579 | 582 | 
		    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
	 | 
| 580 | 583 | 
		Parent::initialize(digraph);  | 
| 581 | 584 | 
		_node_filter = &node_filter;  | 
| 582 | 
		_arc_filter = &arc_filter;  | 
|
| 585 | 
		_arc_filter = &arc_filter;  | 
|
| 583 | 586 | 
		}  | 
| 584 | 587 | 
		 | 
| 585 | 588 | 
		public:  | 
| 586 | 589 | 
		 | 
| 587 | 590 | 
		typedef typename Parent::Node Node;  | 
| 588 | 591 | 
		typedef typename Parent::Arc Arc;  | 
| 589 | 592 | 
		 | 
| 590 | 593 | 
		    void first(Node& i) const {
	 | 
| 591 | 594 | 
		Parent::first(i);  | 
| 592 | 595 | 
		while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);  | 
| 593 | 596 | 
		}  | 
| 594 | 597 | 
		 | 
| ... | ... | 
		@@ -639,52 +642,52 @@  | 
| 639 | 642 | 
		                const Arc& prev = INVALID) const {
	 | 
| 640 | 643 | 
		      if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
	 | 
| 641 | 644 | 
		return INVALID;  | 
| 642 | 645 | 
		}  | 
| 643 | 646 | 
		Arc arc = Parent::findArc(source, target, prev);  | 
| 644 | 647 | 
		      while (arc != INVALID && !(*_arc_filter)[arc]) {
	 | 
| 645 | 648 | 
		arc = Parent::findArc(source, target, arc);  | 
| 646 | 649 | 
		}  | 
| 647 | 650 | 
		return arc;  | 
| 648 | 651 | 
		}  | 
| 649 | 652 | 
		 | 
| 650 | 653 | 
		template <typename V>  | 
| 651 | 
		class NodeMap  | 
|
| 654 | 
		class NodeMap  | 
|
| 652 | 655 | 
		: public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,  | 
| 653 | 656 | 
		          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
	 | 
| 654 | 
		typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,  | 
|
| 657 | 
		typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,  | 
|
| 655 | 658 | 
		LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;  | 
| 656 | 659 | 
		 | 
| 657 | 660 | 
		public:  | 
| 658 | 661 | 
		typedef V Value;  | 
| 659 | 662 | 
		 | 
| 660 | 663 | 
		NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)  | 
| 661 | 664 | 
		        : Parent(adaptor) {}
	 | 
| 662 | 665 | 
		NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)  | 
| 663 | 666 | 
		        : Parent(adaptor, value) {}
	 | 
| 664 | 667 | 
		 | 
| 665 | 668 | 
		private:  | 
| 666 | 669 | 
		      NodeMap& operator=(const NodeMap& cmap) {
	 | 
| 667 | 670 | 
		return operator=<NodeMap>(cmap);  | 
| 668 | 671 | 
		}  | 
| 669 | 672 | 
		 | 
| 670 | 673 | 
		template <typename CMap>  | 
| 671 | 674 | 
		      NodeMap& operator=(const CMap& cmap) {
	 | 
| 672 | 675 | 
		Parent::operator=(cmap);  | 
| 673 | 676 | 
		return *this;  | 
| 674 | 677 | 
		}  | 
| 675 | 678 | 
		};  | 
| 676 | 679 | 
		 | 
| 677 | 680 | 
		template <typename V>  | 
| 678 | 
		class ArcMap  | 
|
| 681 | 
		class ArcMap  | 
|
| 679 | 682 | 
		: public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,  | 
| 680 | 683 | 
		          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
	 | 
| 681 | 684 | 
		typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,  | 
| 682 | 685 | 
		LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;  | 
| 683 | 686 | 
		 | 
| 684 | 687 | 
		public:  | 
| 685 | 688 | 
		typedef V Value;  | 
| 686 | 689 | 
		 | 
| 687 | 690 | 
		ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)  | 
| 688 | 691 | 
		        : Parent(adaptor) {}
	 | 
| 689 | 692 | 
		ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)  | 
| 690 | 693 | 
		        : Parent(adaptor, value) {}
	 | 
| ... | ... | 
		@@ -710,24 +713,26 @@  | 
| 710 | 713 | 
		/// SubDigraph can be used for hiding nodes and arcs in a digraph.  | 
| 711 | 714 | 
		/// A \c bool node map and a \c bool arc map must be specified, which  | 
| 712 | 715 | 
		/// define the filters for nodes and arcs.  | 
| 713 | 716 | 
		/// Only the nodes and arcs with \c true filter value are  | 
| 714 | 717 | 
		/// shown in the subdigraph. The arcs that are incident to hidden  | 
| 715 | 718 | 
		/// nodes are also filtered out.  | 
| 716 | 719 | 
		/// This adaptor conforms to the \ref concepts::Digraph "Digraph" concept.  | 
| 717 | 720 | 
		///  | 
| 718 | 721 | 
		/// The adapted digraph can also be modified through this adaptor  | 
| 719 | 722 | 
		/// by adding or removing nodes or arcs, unless the \c GR template  | 
| 720 | 723 | 
		/// parameter is set to be \c const.  | 
| 721 | 724 | 
		///  | 
| 725 | 
		/// This class provides only linear time counting for nodes and arcs.  | 
|
| 726 | 
		///  | 
|
| 722 | 727 | 
		/// \tparam DGR The type of the adapted digraph.  | 
| 723 | 728 | 
		/// It must conform to the \ref concepts::Digraph "Digraph" concept.  | 
| 724 | 729 | 
		/// It can also be specified to be \c const.  | 
| 725 | 730 | 
		/// \tparam NF The type of the node filter map.  | 
| 726 | 731 | 
		/// It must be a \c bool (or convertible) node map of the  | 
| 727 | 732 | 
		/// adapted digraph. The default type is  | 
| 728 | 733 | 
		/// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".  | 
| 729 | 734 | 
		/// \tparam AF The type of the arc filter map.  | 
| 730 | 735 | 
		/// It must be \c bool (or convertible) arc map of the  | 
| 731 | 736 | 
		/// adapted digraph. The default type is  | 
| 732 | 737 | 
		/// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".  | 
| 733 | 738 | 
		///  | 
| ... | ... | 
		@@ -1007,82 +1012,82 @@  | 
| 1007 | 1012 | 
		                  const Edge& prev = INVALID) const {
	 | 
| 1008 | 1013 | 
		      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
	 | 
| 1009 | 1014 | 
		return INVALID;  | 
| 1010 | 1015 | 
		}  | 
| 1011 | 1016 | 
		Edge edge = Parent::findEdge(u, v, prev);  | 
| 1012 | 1017 | 
		      while (edge != INVALID && !(*_edge_filter)[edge]) {
	 | 
| 1013 | 1018 | 
		edge = Parent::findEdge(u, v, edge);  | 
| 1014 | 1019 | 
		}  | 
| 1015 | 1020 | 
		return edge;  | 
| 1016 | 1021 | 
		}  | 
| 1017 | 1022 | 
		 | 
| 1018 | 1023 | 
		template <typename V>  | 
| 1019 | 
		class NodeMap  | 
|
| 1024 | 
		class NodeMap  | 
|
| 1020 | 1025 | 
		: public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
| 1021 | 1026 | 
		          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
	 | 
| 1022 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
|
| 1027 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
|
| 1023 | 1028 | 
		LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;  | 
| 1024 | 1029 | 
		 | 
| 1025 | 1030 | 
		public:  | 
| 1026 | 1031 | 
		typedef V Value;  | 
| 1027 | 1032 | 
		 | 
| 1028 | 1033 | 
		NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)  | 
| 1029 | 1034 | 
		        : Parent(adaptor) {}
	 | 
| 1030 | 1035 | 
		NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)  | 
| 1031 | 1036 | 
		        : Parent(adaptor, value) {}
	 | 
| 1032 | 1037 | 
		 | 
| 1033 | 1038 | 
		private:  | 
| 1034 | 1039 | 
		      NodeMap& operator=(const NodeMap& cmap) {
	 | 
| 1035 | 1040 | 
		return operator=<NodeMap>(cmap);  | 
| 1036 | 1041 | 
		}  | 
| 1037 | 1042 | 
		 | 
| 1038 | 1043 | 
		template <typename CMap>  | 
| 1039 | 1044 | 
		      NodeMap& operator=(const CMap& cmap) {
	 | 
| 1040 | 1045 | 
		Parent::operator=(cmap);  | 
| 1041 | 1046 | 
		return *this;  | 
| 1042 | 1047 | 
		}  | 
| 1043 | 1048 | 
		};  | 
| 1044 | 1049 | 
		 | 
| 1045 | 1050 | 
		template <typename V>  | 
| 1046 | 
		class ArcMap  | 
|
| 1051 | 
		class ArcMap  | 
|
| 1047 | 1052 | 
		: public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
| 1048 | 1053 | 
		          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
	 | 
| 1049 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
|
| 1054 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
|
| 1050 | 1055 | 
		LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;  | 
| 1051 | 1056 | 
		 | 
| 1052 | 1057 | 
		public:  | 
| 1053 | 1058 | 
		typedef V Value;  | 
| 1054 | 1059 | 
		 | 
| 1055 | 1060 | 
		ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)  | 
| 1056 | 1061 | 
		        : Parent(adaptor) {}
	 | 
| 1057 | 1062 | 
		ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)  | 
| 1058 | 1063 | 
		        : Parent(adaptor, value) {}
	 | 
| 1059 | 1064 | 
		 | 
| 1060 | 1065 | 
		private:  | 
| 1061 | 1066 | 
		      ArcMap& operator=(const ArcMap& cmap) {
	 | 
| 1062 | 1067 | 
		return operator=<ArcMap>(cmap);  | 
| 1063 | 1068 | 
		}  | 
| 1064 | 1069 | 
		 | 
| 1065 | 1070 | 
		template <typename CMap>  | 
| 1066 | 1071 | 
		      ArcMap& operator=(const CMap& cmap) {
	 | 
| 1067 | 1072 | 
		Parent::operator=(cmap);  | 
| 1068 | 1073 | 
		return *this;  | 
| 1069 | 1074 | 
		}  | 
| 1070 | 1075 | 
		};  | 
| 1071 | 1076 | 
		 | 
| 1072 | 1077 | 
		template <typename V>  | 
| 1073 | 
		class EdgeMap  | 
|
| 1078 | 
		class EdgeMap  | 
|
| 1074 | 1079 | 
		: public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
| 1075 | 1080 | 
		        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
	 | 
| 1076 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
|
| 1081 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,  | 
|
| 1077 | 1082 | 
		LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;  | 
| 1078 | 1083 | 
		 | 
| 1079 | 1084 | 
		public:  | 
| 1080 | 1085 | 
		typedef V Value;  | 
| 1081 | 1086 | 
		 | 
| 1082 | 1087 | 
		EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)  | 
| 1083 | 1088 | 
		        : Parent(adaptor) {}
	 | 
| 1084 | 1089 | 
		 | 
| 1085 | 1090 | 
		EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)  | 
| 1086 | 1091 | 
		        : Parent(adaptor, value) {}
	 | 
| 1087 | 1092 | 
		 | 
| 1088 | 1093 | 
		private:  | 
| ... | ... | 
		@@ -1103,26 +1108,26 @@  | 
| 1103 | 1108 | 
		class SubGraphBase<GR, NF, EF, false>  | 
| 1104 | 1109 | 
		    : public GraphAdaptorBase<GR> {
	 | 
| 1105 | 1110 | 
		typedef GraphAdaptorBase<GR> Parent;  | 
| 1106 | 1111 | 
		public:  | 
| 1107 | 1112 | 
		typedef GR Graph;  | 
| 1108 | 1113 | 
		typedef NF NodeFilterMap;  | 
| 1109 | 1114 | 
		typedef EF EdgeFilterMap;  | 
| 1110 | 1115 | 
		 | 
| 1111 | 1116 | 
		typedef SubGraphBase Adaptor;  | 
| 1112 | 1117 | 
		protected:  | 
| 1113 | 1118 | 
		NF* _node_filter;  | 
| 1114 | 1119 | 
		EF* _edge_filter;  | 
| 1115 | 
		SubGraphBase()  | 
|
| 1116 | 
			  : Parent(), _node_filter(0), _edge_filter(0) { }
	 | 
|
| 1120 | 
		SubGraphBase()  | 
|
| 1121 | 
		          : Parent(), _node_filter(0), _edge_filter(0) { }
	 | 
|
| 1117 | 1122 | 
		 | 
| 1118 | 1123 | 
		    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
	 | 
| 1119 | 1124 | 
		Parent::initialize(graph);  | 
| 1120 | 1125 | 
		_node_filter = &node_filter;  | 
| 1121 | 1126 | 
		_edge_filter = &edge_filter;  | 
| 1122 | 1127 | 
		}  | 
| 1123 | 1128 | 
		 | 
| 1124 | 1129 | 
		public:  | 
| 1125 | 1130 | 
		 | 
| 1126 | 1131 | 
		typedef typename Parent::Node Node;  | 
| 1127 | 1132 | 
		typedef typename Parent::Arc Arc;  | 
| 1128 | 1133 | 
		typedef typename Parent::Edge Edge;  | 
| ... | ... | 
		@@ -1205,83 +1210,83 @@  | 
| 1205 | 1210 | 
		 | 
| 1206 | 1211 | 
		typedef FindEdgeTagIndicator<Graph> FindEdgeTag;  | 
| 1207 | 1212 | 
		Edge findEdge(const Node& u, const Node& v,  | 
| 1208 | 1213 | 
		                  const Edge& prev = INVALID) const {
	 | 
| 1209 | 1214 | 
		Edge edge = Parent::findEdge(u, v, prev);  | 
| 1210 | 1215 | 
		      while (edge != INVALID && !(*_edge_filter)[edge]) {
	 | 
| 1211 | 1216 | 
		edge = Parent::findEdge(u, v, edge);  | 
| 1212 | 1217 | 
		}  | 
| 1213 | 1218 | 
		return edge;  | 
| 1214 | 1219 | 
		}  | 
| 1215 | 1220 | 
		 | 
| 1216 | 1221 | 
		template <typename V>  | 
| 1217 | 
		class NodeMap  | 
|
| 1222 | 
		class NodeMap  | 
|
| 1218 | 1223 | 
		: public SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
| 1219 | 1224 | 
		          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
	 | 
| 1220 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
|
| 1225 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
|
| 1221 | 1226 | 
		LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;  | 
| 1222 | 1227 | 
		 | 
| 1223 | 1228 | 
		public:  | 
| 1224 | 1229 | 
		typedef V Value;  | 
| 1225 | 1230 | 
		 | 
| 1226 | 1231 | 
		NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)  | 
| 1227 | 1232 | 
		        : Parent(adaptor) {}
	 | 
| 1228 | 1233 | 
		NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)  | 
| 1229 | 1234 | 
		        : Parent(adaptor, value) {}
	 | 
| 1230 | 1235 | 
		 | 
| 1231 | 1236 | 
		private:  | 
| 1232 | 1237 | 
		      NodeMap& operator=(const NodeMap& cmap) {
	 | 
| 1233 | 1238 | 
		return operator=<NodeMap>(cmap);  | 
| 1234 | 1239 | 
		}  | 
| 1235 | 1240 | 
		 | 
| 1236 | 1241 | 
		template <typename CMap>  | 
| 1237 | 1242 | 
		      NodeMap& operator=(const CMap& cmap) {
	 | 
| 1238 | 1243 | 
		Parent::operator=(cmap);  | 
| 1239 | 1244 | 
		return *this;  | 
| 1240 | 1245 | 
		}  | 
| 1241 | 1246 | 
		};  | 
| 1242 | 1247 | 
		 | 
| 1243 | 1248 | 
		template <typename V>  | 
| 1244 | 
		class ArcMap  | 
|
| 1249 | 
		class ArcMap  | 
|
| 1245 | 1250 | 
		: public SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
| 1246 | 1251 | 
		          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
	 | 
| 1247 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
|
| 1252 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
|
| 1248 | 1253 | 
		LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;  | 
| 1249 | 1254 | 
		 | 
| 1250 | 1255 | 
		public:  | 
| 1251 | 1256 | 
		typedef V Value;  | 
| 1252 | 1257 | 
		 | 
| 1253 | 1258 | 
		ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)  | 
| 1254 | 1259 | 
		        : Parent(adaptor) {}
	 | 
| 1255 | 1260 | 
		ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)  | 
| 1256 | 1261 | 
		        : Parent(adaptor, value) {}
	 | 
| 1257 | 1262 | 
		 | 
| 1258 | 1263 | 
		private:  | 
| 1259 | 1264 | 
		      ArcMap& operator=(const ArcMap& cmap) {
	 | 
| 1260 | 1265 | 
		return operator=<ArcMap>(cmap);  | 
| 1261 | 1266 | 
		}  | 
| 1262 | 1267 | 
		 | 
| 1263 | 1268 | 
		template <typename CMap>  | 
| 1264 | 1269 | 
		      ArcMap& operator=(const CMap& cmap) {
	 | 
| 1265 | 1270 | 
		Parent::operator=(cmap);  | 
| 1266 | 1271 | 
		return *this;  | 
| 1267 | 1272 | 
		}  | 
| 1268 | 1273 | 
		};  | 
| 1269 | 1274 | 
		 | 
| 1270 | 1275 | 
		template <typename V>  | 
| 1271 | 
		class EdgeMap  | 
|
| 1276 | 
		class EdgeMap  | 
|
| 1272 | 1277 | 
		: public SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
| 1273 | 1278 | 
		        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
	 | 
| 1274 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
|
| 1275 | 
		LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;  | 
|
| 1279 | 
		typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,  | 
|
| 1280 | 
		LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;  | 
|
| 1276 | 1281 | 
		 | 
| 1277 | 1282 | 
		public:  | 
| 1278 | 1283 | 
		typedef V Value;  | 
| 1279 | 1284 | 
		 | 
| 1280 | 1285 | 
		EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)  | 
| 1281 | 1286 | 
		        : Parent(adaptor) {}
	 | 
| 1282 | 1287 | 
		 | 
| 1283 | 1288 | 
		EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)  | 
| 1284 | 1289 | 
		        : Parent(adaptor, value) {}
	 | 
| 1285 | 1290 | 
		 | 
| 1286 | 1291 | 
		private:  | 
| 1287 | 1292 | 
		      EdgeMap& operator=(const EdgeMap& cmap) {
	 | 
| ... | ... | 
		@@ -1305,24 +1310,26 @@  | 
| 1305 | 1310 | 
		/// SubGraph can be used for hiding nodes and edges in a graph.  | 
| 1306 | 1311 | 
		/// A \c bool node map and a \c bool edge map must be specified, which  | 
| 1307 | 1312 | 
		/// define the filters for nodes and edges.  | 
| 1308 | 1313 | 
		/// Only the nodes and edges with \c true filter value are  | 
| 1309 | 1314 | 
		/// shown in the subgraph. The edges that are incident to hidden  | 
| 1310 | 1315 | 
		/// nodes are also filtered out.  | 
| 1311 | 1316 | 
		/// This adaptor conforms to the \ref concepts::Graph "Graph" concept.  | 
| 1312 | 1317 | 
		///  | 
| 1313 | 1318 | 
		/// The adapted graph can also be modified through this adaptor  | 
| 1314 | 1319 | 
		/// by adding or removing nodes or edges, unless the \c GR template  | 
| 1315 | 1320 | 
		/// parameter is set to be \c const.  | 
| 1316 | 1321 | 
		///  | 
| 1322 | 
		/// This class provides only linear time counting for nodes, edges and arcs.  | 
|
| 1323 | 
		///  | 
|
| 1317 | 1324 | 
		/// \tparam GR The type of the adapted graph.  | 
| 1318 | 1325 | 
		/// It must conform to the \ref concepts::Graph "Graph" concept.  | 
| 1319 | 1326 | 
		/// It can also be specified to be \c const.  | 
| 1320 | 1327 | 
		/// \tparam NF The type of the node filter map.  | 
| 1321 | 1328 | 
		/// It must be a \c bool (or convertible) node map of the  | 
| 1322 | 1329 | 
		/// adapted graph. The default type is  | 
| 1323 | 1330 | 
		/// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".  | 
| 1324 | 1331 | 
		/// \tparam EF The type of the edge filter map.  | 
| 1325 | 1332 | 
		/// It must be a \c bool (or convertible) edge map of the  | 
| 1326 | 1333 | 
		/// adapted graph. The default type is  | 
| 1327 | 1334 | 
		/// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".  | 
| 1328 | 1335 | 
		///  | 
| ... | ... | 
		@@ -1462,70 +1469,72 @@  | 
| 1462 | 1469 | 
		/// FilterNodes adaptor can be used for hiding nodes in a digraph or a  | 
| 1463 | 1470 | 
		/// graph. A \c bool node map must be specified, which defines the filter  | 
| 1464 | 1471 | 
		/// for the nodes. Only the nodes with \c true filter value and the  | 
| 1465 | 1472 | 
		/// arcs/edges incident to nodes both with \c true filter value are shown  | 
| 1466 | 1473 | 
		/// in the subgraph. This adaptor conforms to the \ref concepts::Digraph  | 
| 1467 | 1474 | 
		/// "Digraph" concept or the \ref concepts::Graph "Graph" concept  | 
| 1468 | 1475 | 
		/// depending on the \c GR template parameter.  | 
| 1469 | 1476 | 
		///  | 
| 1470 | 1477 | 
		/// The adapted (di)graph can also be modified through this adaptor  | 
| 1471 | 1478 | 
		/// by adding or removing nodes or arcs/edges, unless the \c GR template  | 
| 1472 | 1479 | 
		/// parameter is set to be \c const.  | 
| 1473 | 1480 | 
		///  | 
| 1481 | 
		/// This class provides only linear time item counting.  | 
|
| 1482 | 
		///  | 
|
| 1474 | 1483 | 
		/// \tparam GR The type of the adapted digraph or graph.  | 
| 1475 | 1484 | 
		/// It must conform to the \ref concepts::Digraph "Digraph" concept  | 
| 1476 | 1485 | 
		/// or the \ref concepts::Graph "Graph" concept.  | 
| 1477 | 1486 | 
		/// It can also be specified to be \c const.  | 
| 1478 | 1487 | 
		/// \tparam NF The type of the node filter map.  | 
| 1479 | 1488 | 
		/// It must be a \c bool (or convertible) node map of the  | 
| 1480 | 1489 | 
		/// adapted (di)graph. The default type is  | 
| 1481 | 1490 | 
		/// \ref concepts::Graph::NodeMap "GR::NodeMap<bool>".  | 
| 1482 | 1491 | 
		///  | 
| 1483 | 1492 | 
		/// \note The \c Node and <tt>Arc/Edge</tt> types of this adaptor and the  | 
| 1484 | 1493 | 
		/// adapted (di)graph are convertible to each other.  | 
| 1485 | 1494 | 
		#ifdef DOXYGEN  | 
| 1486 | 1495 | 
		template<typename GR, typename NF>  | 
| 1487 | 1496 | 
		  class FilterNodes {
	 | 
| 1488 | 1497 | 
		#else  | 
| 1489 | 1498 | 
		template<typename GR,  | 
| 1490 | 1499 | 
		typename NF = typename GR::template NodeMap<bool>,  | 
| 1491 | 1500 | 
		typename Enable = void>  | 
| 1492 | 1501 | 
		class FilterNodes :  | 
| 1493 | 1502 | 
		public DigraphAdaptorExtender<  | 
| 1494 | 1503 | 
		SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,  | 
| 1495 | 1504 | 
		                     true> > {
	 | 
| 1496 | 1505 | 
		#endif  | 
| 1497 | 1506 | 
		typedef DigraphAdaptorExtender<  | 
| 1498 | 
		SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,  | 
|
| 1507 | 
		SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,  | 
|
| 1499 | 1508 | 
		true> > Parent;  | 
| 1500 | 1509 | 
		 | 
| 1501 | 1510 | 
		public:  | 
| 1502 | 1511 | 
		 | 
| 1503 | 1512 | 
		typedef GR Digraph;  | 
| 1504 | 1513 | 
		typedef NF NodeFilterMap;  | 
| 1505 | 1514 | 
		 | 
| 1506 | 1515 | 
		typedef typename Parent::Node Node;  | 
| 1507 | 1516 | 
		 | 
| 1508 | 1517 | 
		protected:  | 
| 1509 | 1518 | 
		ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;  | 
| 1510 | 1519 | 
		 | 
| 1511 | 1520 | 
		    FilterNodes() : const_true_map() {}
	 | 
| 1512 | 1521 | 
		 | 
| 1513 | 1522 | 
		public:  | 
| 1514 | 1523 | 
		 | 
| 1515 | 1524 | 
		/// \brief Constructor  | 
| 1516 | 1525 | 
		///  | 
| 1517 | 1526 | 
		/// Creates a subgraph for the given digraph or graph with the  | 
| 1518 | 1527 | 
		/// given node filter map.  | 
| 1519 | 
		FilterNodes(GR& graph, NF& node_filter)  | 
|
| 1528 | 
		FilterNodes(GR& graph, NF& node_filter)  | 
|
| 1520 | 1529 | 
		: Parent(), const_true_map()  | 
| 1521 | 1530 | 
		    {
	 | 
| 1522 | 1531 | 
		Parent::initialize(graph, node_filter, const_true_map);  | 
| 1523 | 1532 | 
		}  | 
| 1524 | 1533 | 
		 | 
| 1525 | 1534 | 
		/// \brief Sets the status of the given node  | 
| 1526 | 1535 | 
		///  | 
| 1527 | 1536 | 
		/// This function sets the status of the given node.  | 
| 1528 | 1537 | 
		/// It is done by simply setting the assigned value of \c n  | 
| 1529 | 1538 | 
		/// to \c v in the node filter map.  | 
| 1530 | 1539 | 
		    void status(const Node& n, bool v) const { Parent::status(n, v); }
	 | 
| 1531 | 1540 | 
		 | 
| ... | ... | 
		@@ -1545,29 +1554,29 @@  | 
| 1545 | 1554 | 
		/// \brief Enables the given node  | 
| 1546 | 1555 | 
		///  | 
| 1547 | 1556 | 
		/// This function enables the given node.  | 
| 1548 | 1557 | 
		/// It is the same as \ref status() "status(n, true)".  | 
| 1549 | 1558 | 
		    void enable(const Node& n) const { Parent::status(n, true); }
	 | 
| 1550 | 1559 | 
		 | 
| 1551 | 1560 | 
		};  | 
| 1552 | 1561 | 
		 | 
| 1553 | 1562 | 
		template<typename GR, typename NF>  | 
| 1554 | 1563 | 
		class FilterNodes<GR, NF,  | 
| 1555 | 1564 | 
		typename enable_if<UndirectedTagIndicator<GR> >::type> :  | 
| 1556 | 1565 | 
		public GraphAdaptorExtender<  | 
| 1557 | 
		SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,  | 
|
| 1566 | 
		SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,  | 
|
| 1558 | 1567 | 
		                   true> > {
	 | 
| 1559 | 1568 | 
		 | 
| 1560 | 1569 | 
		typedef GraphAdaptorExtender<  | 
| 1561 | 
		SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,  | 
|
| 1570 | 
		SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,  | 
|
| 1562 | 1571 | 
		true> > Parent;  | 
| 1563 | 1572 | 
		 | 
| 1564 | 1573 | 
		public:  | 
| 1565 | 1574 | 
		 | 
| 1566 | 1575 | 
		typedef GR Graph;  | 
| 1567 | 1576 | 
		typedef NF NodeFilterMap;  | 
| 1568 | 1577 | 
		 | 
| 1569 | 1578 | 
		typedef typename Parent::Node Node;  | 
| 1570 | 1579 | 
		 | 
| 1571 | 1580 | 
		protected:  | 
| 1572 | 1581 | 
		ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;  | 
| 1573 | 1582 | 
		 | 
| ... | ... | 
		@@ -1610,48 +1619,50 @@  | 
| 1610 | 1619 | 
		/// \brief Adaptor class for hiding arcs in a digraph.  | 
| 1611 | 1620 | 
		///  | 
| 1612 | 1621 | 
		/// FilterArcs adaptor can be used for hiding arcs in a digraph.  | 
| 1613 | 1622 | 
		/// A \c bool arc map must be specified, which defines the filter for  | 
| 1614 | 1623 | 
		/// the arcs. Only the arcs with \c true filter value are shown in the  | 
| 1615 | 1624 | 
		/// subdigraph. This adaptor conforms to the \ref concepts::Digraph  | 
| 1616 | 1625 | 
		/// "Digraph" concept.  | 
| 1617 | 1626 | 
		///  | 
| 1618 | 1627 | 
		/// The adapted digraph can also be modified through this adaptor  | 
| 1619 | 1628 | 
		/// by adding or removing nodes or arcs, unless the \c GR template  | 
| 1620 | 1629 | 
		/// parameter is set to be \c const.  | 
| 1621 | 1630 | 
		///  | 
| 1631 | 
		/// This class provides only linear time counting for nodes and arcs.  | 
|
| 1632 | 
		///  | 
|
| 1622 | 1633 | 
		/// \tparam DGR The type of the adapted digraph.  | 
| 1623 | 1634 | 
		/// It must conform to the \ref concepts::Digraph "Digraph" concept.  | 
| 1624 | 1635 | 
		/// It can also be specified to be \c const.  | 
| 1625 | 1636 | 
		/// \tparam AF The type of the arc filter map.  | 
| 1626 | 1637 | 
		/// It must be a \c bool (or convertible) arc map of the  | 
| 1627 | 1638 | 
		/// adapted digraph. The default type is  | 
| 1628 | 1639 | 
		/// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".  | 
| 1629 | 1640 | 
		///  | 
| 1630 | 1641 | 
		/// \note The \c Node and \c Arc types of this adaptor and the adapted  | 
| 1631 | 1642 | 
		/// digraph are convertible to each other.  | 
| 1632 | 1643 | 
		#ifdef DOXYGEN  | 
| 1633 | 1644 | 
		template<typename DGR,  | 
| 1634 | 1645 | 
		typename AF>  | 
| 1635 | 1646 | 
		  class FilterArcs {
	 | 
| 1636 | 1647 | 
		#else  | 
| 1637 | 1648 | 
		template<typename DGR,  | 
| 1638 | 1649 | 
		typename AF = typename DGR::template ArcMap<bool> >  | 
| 1639 | 1650 | 
		class FilterArcs :  | 
| 1640 | 1651 | 
		public DigraphAdaptorExtender<  | 
| 1641 | 1652 | 
		SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,  | 
| 1642 | 1653 | 
		                     AF, false> > {
	 | 
| 1643 | 1654 | 
		#endif  | 
| 1644 | 1655 | 
		typedef DigraphAdaptorExtender<  | 
| 1645 | 
		SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,  | 
|
| 1656 | 
		SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,  | 
|
| 1646 | 1657 | 
		AF, false> > Parent;  | 
| 1647 | 1658 | 
		 | 
| 1648 | 1659 | 
		public:  | 
| 1649 | 1660 | 
		 | 
| 1650 | 1661 | 
		/// The type of the adapted digraph.  | 
| 1651 | 1662 | 
		typedef DGR Digraph;  | 
| 1652 | 1663 | 
		/// The type of the arc filter map.  | 
| 1653 | 1664 | 
		typedef AF ArcFilterMap;  | 
| 1654 | 1665 | 
		 | 
| 1655 | 1666 | 
		typedef typename Parent::Arc Arc;  | 
| 1656 | 1667 | 
		 | 
| 1657 | 1668 | 
		protected:  | 
| ... | ... | 
		@@ -1720,73 +1731,75 @@  | 
| 1720 | 1731 | 
		/// \brief Adaptor class for hiding edges in a graph.  | 
| 1721 | 1732 | 
		///  | 
| 1722 | 1733 | 
		/// FilterEdges adaptor can be used for hiding edges in a graph.  | 
| 1723 | 1734 | 
		/// A \c bool edge map must be specified, which defines the filter for  | 
| 1724 | 1735 | 
		/// the edges. Only the edges with \c true filter value are shown in the  | 
| 1725 | 1736 | 
		/// subgraph. This adaptor conforms to the \ref concepts::Graph  | 
| 1726 | 1737 | 
		/// "Graph" concept.  | 
| 1727 | 1738 | 
		///  | 
| 1728 | 1739 | 
		/// The adapted graph can also be modified through this adaptor  | 
| 1729 | 1740 | 
		/// by adding or removing nodes or edges, unless the \c GR template  | 
| 1730 | 1741 | 
		/// parameter is set to be \c const.  | 
| 1731 | 1742 | 
		///  | 
| 1743 | 
		/// This class provides only linear time counting for nodes, edges and arcs.  | 
|
| 1744 | 
		///  | 
|
| 1732 | 1745 | 
		/// \tparam GR The type of the adapted graph.  | 
| 1733 | 1746 | 
		/// It must conform to the \ref concepts::Graph "Graph" concept.  | 
| 1734 | 1747 | 
		/// It can also be specified to be \c const.  | 
| 1735 | 1748 | 
		/// \tparam EF The type of the edge filter map.  | 
| 1736 | 1749 | 
		/// It must be a \c bool (or convertible) edge map of the  | 
| 1737 | 1750 | 
		/// adapted graph. The default type is  | 
| 1738 | 1751 | 
		/// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".  | 
| 1739 | 1752 | 
		///  | 
| 1740 | 1753 | 
		/// \note The \c Node, \c Edge and \c Arc types of this adaptor and the  | 
| 1741 | 1754 | 
		/// adapted graph are convertible to each other.  | 
| 1742 | 1755 | 
		#ifdef DOXYGEN  | 
| 1743 | 1756 | 
		template<typename GR,  | 
| 1744 | 1757 | 
		typename EF>  | 
| 1745 | 1758 | 
		  class FilterEdges {
	 | 
| 1746 | 1759 | 
		#else  | 
| 1747 | 1760 | 
		template<typename GR,  | 
| 1748 | 1761 | 
		typename EF = typename GR::template EdgeMap<bool> >  | 
| 1749 | 1762 | 
		class FilterEdges :  | 
| 1750 | 1763 | 
		public GraphAdaptorExtender<  | 
| 1751 | 
		SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,  | 
|
| 1764 | 
		SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,  | 
|
| 1752 | 1765 | 
		                   EF, false> > {
	 | 
| 1753 | 1766 | 
		#endif  | 
| 1754 | 1767 | 
		typedef GraphAdaptorExtender<  | 
| 1755 | 
		SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,  | 
|
| 1768 | 
		SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,  | 
|
| 1756 | 1769 | 
		EF, false> > Parent;  | 
| 1757 | 1770 | 
		 | 
| 1758 | 1771 | 
		public:  | 
| 1759 | 1772 | 
		 | 
| 1760 | 1773 | 
		/// The type of the adapted graph.  | 
| 1761 | 1774 | 
		typedef GR Graph;  | 
| 1762 | 1775 | 
		/// The type of the edge filter map.  | 
| 1763 | 1776 | 
		typedef EF EdgeFilterMap;  | 
| 1764 | 1777 | 
		 | 
| 1765 | 1778 | 
		typedef typename Parent::Edge Edge;  | 
| 1766 | 1779 | 
		 | 
| 1767 | 1780 | 
		protected:  | 
| 1768 | 1781 | 
		ConstMap<typename GR::Node, Const<bool, true> > const_true_map;  | 
| 1769 | 1782 | 
		 | 
| 1770 | 1783 | 
		    FilterEdges() : const_true_map(true) {
	 | 
| 1771 | 1784 | 
		Parent::setNodeFilterMap(const_true_map);  | 
| 1772 | 1785 | 
		}  | 
| 1773 | 1786 | 
		 | 
| 1774 | 1787 | 
		public:  | 
| 1775 | 1788 | 
		 | 
| 1776 | 1789 | 
		/// \brief Constructor  | 
| 1777 | 1790 | 
		///  | 
| 1778 | 1791 | 
		/// Creates a subgraph for the given graph with the given edge  | 
| 1779 | 1792 | 
		/// filter map.  | 
| 1780 | 
		FilterEdges(GR& graph, EF& edge_filter)  | 
|
| 1793 | 
		FilterEdges(GR& graph, EF& edge_filter)  | 
|
| 1781 | 1794 | 
		      : Parent(), const_true_map() {
	 | 
| 1782 | 1795 | 
		Parent::initialize(graph, const_true_map, edge_filter);  | 
| 1783 | 1796 | 
		}  | 
| 1784 | 1797 | 
		 | 
| 1785 | 1798 | 
		/// \brief Sets the status of the given edge  | 
| 1786 | 1799 | 
		///  | 
| 1787 | 1800 | 
		/// This function sets the status of the given edge.  | 
| 1788 | 1801 | 
		/// It is done by simply setting the assigned value of \c e  | 
| 1789 | 1802 | 
		/// to \c v in the edge filter map.  | 
| 1790 | 1803 | 
		    void status(const Edge& e, bool v) const { Parent::status(e, v); }
	 | 
| 1791 | 1804 | 
		 | 
| 1792 | 1805 | 
		/// \brief Returns the status of the given edge  | 
| ... | ... | 
		@@ -1836,25 +1849,25 @@  | 
| 1836 | 1849 | 
		 | 
| 1837 | 1850 | 
		typedef True UndirectedTag;  | 
| 1838 | 1851 | 
		 | 
| 1839 | 1852 | 
		typedef typename Digraph::Arc Edge;  | 
| 1840 | 1853 | 
		typedef typename Digraph::Node Node;  | 
| 1841 | 1854 | 
		 | 
| 1842 | 1855 | 
		    class Arc {
	 | 
| 1843 | 1856 | 
		friend class UndirectorBase;  | 
| 1844 | 1857 | 
		protected:  | 
| 1845 | 1858 | 
		Edge _edge;  | 
| 1846 | 1859 | 
		bool _forward;  | 
| 1847 | 1860 | 
		 | 
| 1848 | 
		Arc(const Edge& edge, bool forward)  | 
|
| 1861 | 
		Arc(const Edge& edge, bool forward)  | 
|
| 1849 | 1862 | 
		        : _edge(edge), _forward(forward) {}
	 | 
| 1850 | 1863 | 
		 | 
| 1851 | 1864 | 
		public:  | 
| 1852 | 1865 | 
		      Arc() {}
	 | 
| 1853 | 1866 | 
		 | 
| 1854 | 1867 | 
		      Arc(Invalid) : _edge(INVALID), _forward(true) {}
	 | 
| 1855 | 1868 | 
		 | 
| 1856 | 1869 | 
		      operator const Edge&() const { return _edge; }
	 | 
| 1857 | 1870 | 
		 | 
| 1858 | 1871 | 
		      bool operator==(const Arc &other) const {
	 | 
| 1859 | 1872 | 
		return _forward == other._forward && _edge == other._edge;  | 
| 1860 | 1873 | 
		}  | 
| ... | ... | 
		@@ -2076,25 +2089,25 @@  | 
| 2076 | 2089 | 
		 | 
| 2077 | 2090 | 
		typedef V Value;  | 
| 2078 | 2091 | 
		typedef Arc Key;  | 
| 2079 | 2092 | 
		typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;  | 
| 2080 | 2093 | 
		typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;  | 
| 2081 | 2094 | 
		typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;  | 
| 2082 | 2095 | 
		typedef typename MapTraits<MapImpl>::ReturnValue Reference;  | 
| 2083 | 2096 | 
		 | 
| 2084 | 2097 | 
		ArcMapBase(const UndirectorBase<DGR>& adaptor) :  | 
| 2085 | 2098 | 
		        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
	 | 
| 2086 | 2099 | 
		 | 
| 2087 | 2100 | 
		ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)  | 
| 2088 | 
		: _forward(*adaptor._digraph, value),  | 
|
| 2101 | 
		: _forward(*adaptor._digraph, value),  | 
|
| 2089 | 2102 | 
		          _backward(*adaptor._digraph, value) {}
	 | 
| 2090 | 2103 | 
		 | 
| 2091 | 2104 | 
		      void set(const Arc& a, const V& value) {
	 | 
| 2092 | 2105 | 
		        if (direction(a)) {
	 | 
| 2093 | 2106 | 
		_forward.set(a, value);  | 
| 2094 | 2107 | 
		        } else {
	 | 
| 2095 | 2108 | 
		_backward.set(a, value);  | 
| 2096 | 2109 | 
		}  | 
| 2097 | 2110 | 
		}  | 
| 2098 | 2111 | 
		 | 
| 2099 | 2112 | 
		      ConstReturnValue operator[](const Arc& a) const {
	 | 
| 2100 | 2113 | 
		        if (direction(a)) {
	 | 
| ... | ... | 
		@@ -2194,25 +2207,25 @@  | 
| 2194 | 2207 | 
		      EdgeMap& operator=(const CMap& cmap) {
	 | 
| 2195 | 2208 | 
		Parent::operator=(cmap);  | 
| 2196 | 2209 | 
		return *this;  | 
| 2197 | 2210 | 
		}  | 
| 2198 | 2211 | 
		 | 
| 2199 | 2212 | 
		};  | 
| 2200 | 2213 | 
		 | 
| 2201 | 2214 | 
		typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;  | 
| 2202 | 2215 | 
		    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
	 | 
| 2203 | 2216 | 
		 | 
| 2204 | 2217 | 
		typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;  | 
| 2205 | 2218 | 
		    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
	 | 
| 2206 | 
		 | 
|
| 2219 | 
		 | 
|
| 2207 | 2220 | 
		typedef EdgeNotifier ArcNotifier;  | 
| 2208 | 2221 | 
		    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
	 | 
| 2209 | 2222 | 
		 | 
| 2210 | 2223 | 
		protected:  | 
| 2211 | 2224 | 
		 | 
| 2212 | 2225 | 
		    UndirectorBase() : _digraph(0) {}
	 | 
| 2213 | 2226 | 
		 | 
| 2214 | 2227 | 
		DGR* _digraph;  | 
| 2215 | 2228 | 
		 | 
| 2216 | 2229 | 
		    void initialize(DGR& digraph) {
	 | 
| 2217 | 2230 | 
		_digraph = &digraph;  | 
| 2218 | 2231 | 
		}  | 
| ... | ... | 
		@@ -2223,24 +2236,27 @@  | 
| 2223 | 2236 | 
		///  | 
| 2224 | 2237 | 
		/// \brief Adaptor class for viewing a digraph as an undirected graph.  | 
| 2225 | 2238 | 
		///  | 
| 2226 | 2239 | 
		/// Undirector adaptor can be used for viewing a digraph as an undirected  | 
| 2227 | 2240 | 
		/// graph. All arcs of the underlying digraph are showed in the  | 
| 2228 | 2241 | 
		/// adaptor as an edge (and also as a pair of arcs, of course).  | 
| 2229 | 2242 | 
		/// This adaptor conforms to the \ref concepts::Graph "Graph" concept.  | 
| 2230 | 2243 | 
		///  | 
| 2231 | 2244 | 
		/// The adapted digraph can also be modified through this adaptor  | 
| 2232 | 2245 | 
		/// by adding or removing nodes or edges, unless the \c GR template  | 
| 2233 | 2246 | 
		/// parameter is set to be \c const.  | 
| 2234 | 2247 | 
		///  | 
| 2248 | 
		/// This class provides item counting in the same time as the adapted  | 
|
| 2249 | 
		/// digraph structure.  | 
|
| 2250 | 
		///  | 
|
| 2235 | 2251 | 
		/// \tparam DGR The type of the adapted digraph.  | 
| 2236 | 2252 | 
		/// It must conform to the \ref concepts::Digraph "Digraph" concept.  | 
| 2237 | 2253 | 
		/// It can also be specified to be \c const.  | 
| 2238 | 2254 | 
		///  | 
| 2239 | 2255 | 
		/// \note The \c Node type of this adaptor and the adapted digraph are  | 
| 2240 | 2256 | 
		/// convertible to each other, moreover the \c Edge type of the adaptor  | 
| 2241 | 2257 | 
		/// and the \c Arc type of the adapted digraph are also convertible to  | 
| 2242 | 2258 | 
		/// each other.  | 
| 2243 | 2259 | 
		/// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type  | 
| 2244 | 2260 | 
		/// of the adapted digraph.)  | 
| 2245 | 2261 | 
		template<typename DGR>  | 
| 2246 | 2262 | 
		#ifdef DOXYGEN  | 
| ... | ... | 
		@@ -2526,24 +2542,27 @@  | 
| 2526 | 2542 | 
		///  | 
| 2527 | 2543 | 
		/// Orienter adaptor can be used for orienting the edges of a graph to  | 
| 2528 | 2544 | 
		/// get a digraph. A \c bool edge map of the underlying graph must be  | 
| 2529 | 2545 | 
		/// specified, which define the direction of the arcs in the adaptor.  | 
| 2530 | 2546 | 
		/// The arcs can be easily reversed by the \c reverseArc() member function  | 
| 2531 | 2547 | 
		/// of the adaptor.  | 
| 2532 | 2548 | 
		/// This class conforms to the \ref concepts::Digraph "Digraph" concept.  | 
| 2533 | 2549 | 
		///  | 
| 2534 | 2550 | 
		/// The adapted graph can also be modified through this adaptor  | 
| 2535 | 2551 | 
		/// by adding or removing nodes or arcs, unless the \c GR template  | 
| 2536 | 2552 | 
		/// parameter is set to be \c const.  | 
| 2537 | 2553 | 
		///  | 
| 2554 | 
		/// This class provides item counting in the same time as the adapted  | 
|
| 2555 | 
		/// graph structure.  | 
|
| 2556 | 
		///  | 
|
| 2538 | 2557 | 
		/// \tparam GR The type of the adapted graph.  | 
| 2539 | 2558 | 
		/// It must conform to the \ref concepts::Graph "Graph" concept.  | 
| 2540 | 2559 | 
		/// It can also be specified to be \c const.  | 
| 2541 | 2560 | 
		/// \tparam DM The type of the direction map.  | 
| 2542 | 2561 | 
		/// It must be a \c bool (or convertible) edge map of the  | 
| 2543 | 2562 | 
		/// adapted graph. The default type is  | 
| 2544 | 2563 | 
		/// \ref concepts::Graph::EdgeMap "GR::EdgeMap<bool>".  | 
| 2545 | 2564 | 
		///  | 
| 2546 | 2565 | 
		/// \note The \c Node type of this adaptor and the adapted graph are  | 
| 2547 | 2566 | 
		/// convertible to each other, moreover the \c Arc type of the adaptor  | 
| 2548 | 2567 | 
		/// and the \c Edge type of the adapted graph are also convertible to  | 
| 2549 | 2568 | 
		/// each other.  | 
| ... | ... | 
		@@ -2669,24 +2688,26 @@  | 
| 2669 | 2688 | 
		/// Let \f$ flow, cap: A\to F \f$ be functions on the arcs.  | 
| 2670 | 2689 | 
		/// This adaptor implements a digraph structure with node set \f$ V \f$  | 
| 2671 | 2690 | 
		  /// and arc set \f$ A_{forward}\cup A_{backward} \f$,
	 | 
| 2672 | 2691 | 
		  /// where \f$ A_{forward}=\{uv : uv\in A, flow(uv)<cap(uv)\} \f$ and
	 | 
| 2673 | 2692 | 
		  /// \f$ A_{backward}=\{vu : uv\in A, flow(uv)>0\} \f$, i.e. the so
	 | 
| 2674 | 2693 | 
		/// called residual digraph.  | 
| 2675 | 2694 | 
		  /// When the union \f$ A_{forward}\cup A_{backward} \f$ is taken,
	 | 
| 2676 | 2695 | 
		/// multiplicities are counted, i.e. the adaptor has exactly  | 
| 2677 | 2696 | 
		  /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
	 | 
| 2678 | 2697 | 
		/// arcs).  | 
| 2679 | 2698 | 
		/// This class conforms to the \ref concepts::Digraph "Digraph" concept.  | 
| 2680 | 2699 | 
		///  | 
| 2700 | 
		/// This class provides only linear time counting for nodes and arcs.  | 
|
| 2701 | 
		///  | 
|
| 2681 | 2702 | 
		/// \tparam DGR The type of the adapted digraph.  | 
| 2682 | 2703 | 
		/// It must conform to the \ref concepts::Digraph "Digraph" concept.  | 
| 2683 | 2704 | 
		/// It is implicitly \c const.  | 
| 2684 | 2705 | 
		/// \tparam CM The type of the capacity map.  | 
| 2685 | 2706 | 
		/// It must be an arc map of some numerical type, which defines  | 
| 2686 | 2707 | 
		/// the capacities in the flow problem. It is implicitly \c const.  | 
| 2687 | 2708 | 
		/// The default type is  | 
| 2688 | 2709 | 
		/// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".  | 
| 2689 | 2710 | 
		/// \tparam FM The type of the flow map.  | 
| 2690 | 2711 | 
		/// It must be an arc map of some numerical type, which defines  | 
| 2691 | 2712 | 
		/// the flow values in the flow problem. The default type is \c CM.  | 
| 2692 | 2713 | 
		/// \tparam TL The tolerance type for handling inexact computation.  | 
| ... | ... | 
		@@ -2698,25 +2719,25 @@  | 
| 2698 | 2719 | 
		///  | 
| 2699 | 2720 | 
		/// \note The \c Node type of this adaptor and the adapted digraph are  | 
| 2700 | 2721 | 
		/// convertible to each other, moreover the \c Arc type of the adaptor  | 
| 2701 | 2722 | 
		/// is convertible to the \c Arc type of the adapted digraph.  | 
| 2702 | 2723 | 
		#ifdef DOXYGEN  | 
| 2703 | 2724 | 
		template<typename DGR, typename CM, typename FM, typename TL>  | 
| 2704 | 2725 | 
		class ResidualDigraph  | 
| 2705 | 2726 | 
		#else  | 
| 2706 | 2727 | 
		template<typename DGR,  | 
| 2707 | 2728 | 
		typename CM = typename DGR::template ArcMap<int>,  | 
| 2708 | 2729 | 
		typename FM = CM,  | 
| 2709 | 2730 | 
		typename TL = Tolerance<typename CM::Value> >  | 
| 2710 | 
		class ResidualDigraph  | 
|
| 2731 | 
		class ResidualDigraph  | 
|
| 2711 | 2732 | 
		: public SubDigraph<  | 
| 2712 | 2733 | 
		Undirector<const DGR>,  | 
| 2713 | 2734 | 
		ConstMap<typename DGR::Node, Const<bool, true> >,  | 
| 2714 | 2735 | 
		typename Undirector<const DGR>::template CombinedArcMap<  | 
| 2715 | 2736 | 
		_adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,  | 
| 2716 | 2737 | 
		_adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >  | 
| 2717 | 2738 | 
		#endif  | 
| 2718 | 2739 | 
		  {
	 | 
| 2719 | 2740 | 
		public:  | 
| 2720 | 2741 | 
		 | 
| 2721 | 2742 | 
		/// The type of the underlying digraph.  | 
| 2722 | 2743 | 
		typedef DGR Digraph;  | 
| ... | ... | 
		@@ -2755,25 +2776,25 @@  | 
| 2755 | 2776 | 
		ForwardFilter _forward_filter;  | 
| 2756 | 2777 | 
		BackwardFilter _backward_filter;  | 
| 2757 | 2778 | 
		ArcFilter _arc_filter;  | 
| 2758 | 2779 | 
		 | 
| 2759 | 2780 | 
		public:  | 
| 2760 | 2781 | 
		 | 
| 2761 | 2782 | 
		/// \brief Constructor  | 
| 2762 | 2783 | 
		///  | 
| 2763 | 2784 | 
		/// Constructor of the residual digraph adaptor. The parameters are the  | 
| 2764 | 2785 | 
		/// digraph, the capacity map, the flow map, and a tolerance object.  | 
| 2765 | 2786 | 
		ResidualDigraph(const DGR& digraph, const CM& capacity,  | 
| 2766 | 2787 | 
		FM& flow, const TL& tolerance = Tolerance())  | 
| 2767 | 
		: Parent(), _capacity(&capacity), _flow(&flow),  | 
|
| 2788 | 
		: Parent(), _capacity(&capacity), _flow(&flow),  | 
|
| 2768 | 2789 | 
		_graph(digraph), _node_filter(),  | 
| 2769 | 2790 | 
		_forward_filter(capacity, flow, tolerance),  | 
| 2770 | 2791 | 
		_backward_filter(capacity, flow, tolerance),  | 
| 2771 | 2792 | 
		_arc_filter(_forward_filter, _backward_filter)  | 
| 2772 | 2793 | 
		    {
	 | 
| 2773 | 2794 | 
		Parent::initialize(_graph, _node_filter, _arc_filter);  | 
| 2774 | 2795 | 
		}  | 
| 2775 | 2796 | 
		 | 
| 2776 | 2797 | 
		typedef typename Parent::Arc Arc;  | 
| 2777 | 2798 | 
		 | 
| 2778 | 2799 | 
		/// \brief Returns the residual capacity of the given arc.  | 
| 2779 | 2800 | 
		///  | 
| ... | ... | 
		@@ -2837,25 +2858,25 @@  | 
| 2837 | 2858 | 
		/// capacities as an arc map of the residual digraph.  | 
| 2838 | 2859 | 
		/// Its value type is inherited from the capacity map.  | 
| 2839 | 2860 | 
		    class ResidualCapacity {
	 | 
| 2840 | 2861 | 
		protected:  | 
| 2841 | 2862 | 
		const Adaptor* _adaptor;  | 
| 2842 | 2863 | 
		public:  | 
| 2843 | 2864 | 
		/// The key type of the map  | 
| 2844 | 2865 | 
		typedef Arc Key;  | 
| 2845 | 2866 | 
		/// The value type of the map  | 
| 2846 | 2867 | 
		typedef typename CapacityMap::Value Value;  | 
| 2847 | 2868 | 
		 | 
| 2848 | 2869 | 
		/// Constructor  | 
| 2849 | 
		ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)  | 
|
| 2870 | 
		ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)  | 
|
| 2850 | 2871 | 
		        : _adaptor(&adaptor) {}
	 | 
| 2851 | 2872 | 
		 | 
| 2852 | 2873 | 
		/// Returns the value associated with the given residual arc  | 
| 2853 | 2874 | 
		      Value operator[](const Arc& a) const {
	 | 
| 2854 | 2875 | 
		return _adaptor->residualCapacity(a);  | 
| 2855 | 2876 | 
		}  | 
| 2856 | 2877 | 
		 | 
| 2857 | 2878 | 
		};  | 
| 2858 | 2879 | 
		 | 
| 2859 | 2880 | 
		/// \brief Returns a residual capacity map  | 
| 2860 | 2881 | 
		///  | 
| 2861 | 2882 | 
		/// This function just returns a residual capacity map.  | 
| ... | ... | 
		@@ -3316,24 +3337,27 @@  | 
| 3316 | 3337 | 
		  /// new target of the arc will be \f$ u_{in} \f$ and similarly the
	 | 
| 3317 | 3338 | 
		  /// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
	 | 
| 3318 | 3339 | 
		  /// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
	 | 
| 3319 | 3340 | 
		  /// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
	 | 
| 3320 | 3341 | 
		///  | 
| 3321 | 3342 | 
		/// The aim of this class is running an algorithm with respect to node  | 
| 3322 | 3343 | 
		/// costs or capacities if the algorithm considers only arc costs or  | 
| 3323 | 3344 | 
		/// capacities directly.  | 
| 3324 | 3345 | 
		/// In this case you can use \c SplitNodes adaptor, and set the node  | 
| 3325 | 3346 | 
		/// costs/capacities of the original digraph to the \e bind \e arcs  | 
| 3326 | 3347 | 
		/// in the adaptor.  | 
| 3327 | 3348 | 
		///  | 
| 3349 | 
		/// This class provides item counting in the same time as the adapted  | 
|
| 3350 | 
		/// digraph structure.  | 
|
| 3351 | 
		///  | 
|
| 3328 | 3352 | 
		/// \tparam DGR The type of the adapted digraph.  | 
| 3329 | 3353 | 
		/// It must conform to the \ref concepts::Digraph "Digraph" concept.  | 
| 3330 | 3354 | 
		/// It is implicitly \c const.  | 
| 3331 | 3355 | 
		///  | 
| 3332 | 3356 | 
		/// \note The \c Node type of this adaptor is converible to the \c Node  | 
| 3333 | 3357 | 
		/// type of the adapted digraph.  | 
| 3334 | 3358 | 
		template <typename DGR>  | 
| 3335 | 3359 | 
		#ifdef DOXYGEN  | 
| 3336 | 3360 | 
		  class SplitNodes {
	 | 
| 3337 | 3361 | 
		#else  | 
| 3338 | 3362 | 
		class SplitNodes  | 
| 3339 | 3363 | 
		    : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
	 | 
| ... | ... | 
		@@ -3414,25 +3438,25 @@  | 
| 3414 | 3438 | 
		///  | 
| 3415 | 3439 | 
		/// Returns the arc in the adaptor that corresponds to the given  | 
| 3416 | 3440 | 
		/// original arc.  | 
| 3417 | 3441 | 
		    static Arc arc(const DigraphArc& a) {
	 | 
| 3418 | 3442 | 
		return Parent::arc(a);  | 
| 3419 | 3443 | 
		}  | 
| 3420 | 3444 | 
		 | 
| 3421 | 3445 | 
		/// \brief Node map combined from two original node maps  | 
| 3422 | 3446 | 
		///  | 
| 3423 | 3447 | 
		/// This map adaptor class adapts two node maps of the original digraph  | 
| 3424 | 3448 | 
		/// to get a node map of the split digraph.  | 
| 3425 | 3449 | 
		/// Its value type is inherited from the first node map type (\c IN).  | 
| 3426 | 
		/// \tparam IN The type of the node map for the in-nodes.  | 
|
| 3450 | 
		/// \tparam IN The type of the node map for the in-nodes.  | 
|
| 3427 | 3451 | 
		/// \tparam OUT The type of the node map for the out-nodes.  | 
| 3428 | 3452 | 
		template <typename IN, typename OUT>  | 
| 3429 | 3453 | 
		    class CombinedNodeMap {
	 | 
| 3430 | 3454 | 
		public:  | 
| 3431 | 3455 | 
		 | 
| 3432 | 3456 | 
		/// The key type of the map  | 
| 3433 | 3457 | 
		typedef Node Key;  | 
| 3434 | 3458 | 
		/// The value type of the map  | 
| 3435 | 3459 | 
		typedef typename IN::Value Value;  | 
| 3436 | 3460 | 
		 | 
| 3437 | 3461 | 
		typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;  | 
| 3438 | 3462 | 
		typedef typename MapTraits<IN>::ReturnValue ReturnValue;  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| 18 | 18 | 
		 | 
| 19 | 19 | 
		#include <lemon/arg_parser.h>  | 
| 20 | 20 | 
		 | 
| 21 | 21 | 
		namespace lemon {
	 | 
| 22 | 22 | 
		 | 
| 23 | 
		void ArgParser::_terminate(ArgParserException::Reason reason) const  | 
|
| 24 | 
		  {
	 | 
|
| 25 | 
		if(_exit_on_problems)  | 
|
| 26 | 
		exit(1);  | 
|
| 27 | 
		else throw(ArgParserException(reason));  | 
|
| 28 | 
		}  | 
|
| 29 | 
		 | 
|
| 30 | 
		 | 
|
| 23 | 31 | 
		void ArgParser::_showHelp(void *p)  | 
| 24 | 32 | 
		  {
	 | 
| 25 | 33 | 
		(static_cast<ArgParser*>(p))->showHelp();  | 
| 26 | 
		
  | 
|
| 34 | 
		(static_cast<ArgParser*>(p))->_terminate(ArgParserException::HELP);  | 
|
| 27 | 35 | 
		}  | 
| 28 | 36 | 
		 | 
| 29 | 37 | 
		ArgParser::ArgParser(int argc, const char * const *argv)  | 
| 30 | 
		:_argc(argc), _argv(argv), _command_name(argv[0])  | 
|
| 38 | 
		:_argc(argc), _argv(argv), _command_name(argv[0]),  | 
|
| 39 | 
		    _exit_on_problems(true) {
	 | 
|
| 31 | 40 | 
		    funcOption("-help","Print a short help message",_showHelp,this);
	 | 
| 32 | 41 | 
		    synonym("help","-help");
	 | 
| 33 | 42 | 
		    synonym("h","-help");
	 | 
| 34 | 43 | 
		}  | 
| 35 | 44 | 
		 | 
| 36 | 45 | 
		ArgParser::~ArgParser()  | 
| 37 | 46 | 
		  {
	 | 
| 38 | 47 | 
		for(Opts::iterator i=_opts.begin();i!=_opts.end();++i)  | 
| 39 | 48 | 
		if(i->second.self_delete)  | 
| 40 | 49 | 
		        switch(i->second.type) {
	 | 
| 41 | 50 | 
		case BOOL:  | 
| 42 | 51 | 
		delete i->second.bool_p;  | 
| ... | ... | 
		@@ -333,34 +342,34 @@  | 
| 333 | 342 | 
		pos+=cstr.str().size();  | 
| 334 | 343 | 
		}  | 
| 335 | 344 | 
		std::cerr << std::endl;  | 
| 336 | 345 | 
		}  | 
| 337 | 346 | 
		 | 
| 338 | 347 | 
		void ArgParser::showHelp() const  | 
| 339 | 348 | 
		  {
	 | 
| 340 | 349 | 
		shortHelp();  | 
| 341 | 350 | 
		std::cerr << "Where:\n";  | 
| 342 | 351 | 
		for(std::vector<OtherArg>::const_iterator i=_others_help.begin();  | 
| 343 | 352 | 
		i!=_others_help.end();++i) showHelp(i);  | 
| 344 | 353 | 
		for(Opts::const_iterator i=_opts.begin();i!=_opts.end();++i) showHelp(i);  | 
| 345 | 
		
  | 
|
| 354 | 
		_terminate(ArgParserException::HELP);  | 
|
| 346 | 355 | 
		}  | 
| 347 | 356 | 
		 | 
| 348 | 357 | 
		 | 
| 349 | 358 | 
		void ArgParser::unknownOpt(std::string arg) const  | 
| 350 | 359 | 
		  {
	 | 
| 351 | 360 | 
		std::cerr << "\nUnknown option: " << arg << "\n";  | 
| 352 | 361 | 
		std::cerr << "\nType '" << _command_name <<  | 
| 353 | 362 | 
		" --help' to obtain a short summary on the usage.\n\n";  | 
| 354 | 
		
  | 
|
| 363 | 
		_terminate(ArgParserException::UNKNOWN_OPT);  | 
|
| 355 | 364 | 
		}  | 
| 356 | 365 | 
		 | 
| 357 | 366 | 
		void ArgParser::requiresValue(std::string arg, OptType t) const  | 
| 358 | 367 | 
		  {
	 | 
| 359 | 368 | 
		std::cerr << "Argument '" << arg << "' requires a";  | 
| 360 | 369 | 
		    switch(t) {
	 | 
| 361 | 370 | 
		case STRING:  | 
| 362 | 371 | 
		std::cerr << " string";  | 
| 363 | 372 | 
		break;  | 
| 364 | 373 | 
		case INTEGER:  | 
| 365 | 374 | 
		std::cerr << "n integer";  | 
| 366 | 375 | 
		break;  | 
| ... | ... | 
		@@ -405,25 +414,25 @@  | 
| 405 | 414 | 
		          if(i->second.only_one&&set>1) {
	 | 
| 406 | 415 | 
		std::cerr << _command_name <<  | 
| 407 | 416 | 
		": At most one of the following arguments can be given.\n";  | 
| 408 | 417 | 
		ok=false;  | 
| 409 | 418 | 
		for(GroupData::Opts::const_iterator o=i->second.opts.begin();  | 
| 410 | 419 | 
		o!=i->second.opts.end();++o)  | 
| 411 | 420 | 
		showHelp(_opts.find(*o));  | 
| 412 | 421 | 
		}  | 
| 413 | 422 | 
		}  | 
| 414 | 423 | 
		    if(!ok) {
	 | 
| 415 | 424 | 
		std::cerr << "\nType '" << _command_name <<  | 
| 416 | 425 | 
		" --help' to obtain a short summary on the usage.\n\n";  | 
| 417 | 
		
  | 
|
| 426 | 
		_terminate(ArgParserException::INVALID_OPT);  | 
|
| 418 | 427 | 
		}  | 
| 419 | 428 | 
		}  | 
| 420 | 429 | 
		 | 
| 421 | 430 | 
		ArgParser &ArgParser::parse()  | 
| 422 | 431 | 
		  {
	 | 
| 423 | 432 | 
		    for(int ar=1; ar<_argc; ++ar) {
	 | 
| 424 | 433 | 
		std::string arg(_argv[ar]);  | 
| 425 | 434 | 
		      if (arg[0] != '-' || arg.size() == 1) {
	 | 
| 426 | 435 | 
		_file_args.push_back(arg);  | 
| 427 | 436 | 
		}  | 
| 428 | 437 | 
		      else {
	 | 
| 429 | 438 | 
		Opts::iterator i = _opts.find(arg.substr(1));  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -25,24 +25,62 @@  | 
| 25 | 25 | 
		#include <string>  | 
| 26 | 26 | 
		#include <iostream>  | 
| 27 | 27 | 
		#include <sstream>  | 
| 28 | 28 | 
		#include <algorithm>  | 
| 29 | 29 | 
		#include <lemon/assert.h>  | 
| 30 | 30 | 
		 | 
| 31 | 31 | 
		///\ingroup misc  | 
| 32 | 32 | 
		///\file  | 
| 33 | 33 | 
		///\brief A tool to parse command line arguments.  | 
| 34 | 34 | 
		 | 
| 35 | 35 | 
		namespace lemon {
	 | 
| 36 | 36 | 
		 | 
| 37 | 
		///Exception used by ArgParser  | 
|
| 38 | 
		  class ArgParserException : public Exception {
	 | 
|
| 39 | 
		public:  | 
|
| 40 | 
		    enum Reason {
	 | 
|
| 41 | 
		HELP, /// <tt>--help</tt> option was given  | 
|
| 42 | 
		UNKNOWN_OPT, /// Unknown option was given  | 
|
| 43 | 
		INVALID_OPT /// Invalid combination of options  | 
|
| 44 | 
		};  | 
|
| 45 | 
		 | 
|
| 46 | 
		private:  | 
|
| 47 | 
		Reason _reason;  | 
|
| 48 | 
		 | 
|
| 49 | 
		public:  | 
|
| 50 | 
		///Constructor  | 
|
| 51 | 
		    ArgParserException(Reason r) throw() : _reason(r) {}
	 | 
|
| 52 | 
		///Virtual destructor  | 
|
| 53 | 
		    virtual ~ArgParserException() throw() {}
	 | 
|
| 54 | 
		///A short description of the exception  | 
|
| 55 | 
		    virtual const char* what() const throw() {
	 | 
|
| 56 | 
		switch(_reason)  | 
|
| 57 | 
		        {
	 | 
|
| 58 | 
		case HELP:  | 
|
| 59 | 
		return "lemon::ArgParseException: ask for help";  | 
|
| 60 | 
		break;  | 
|
| 61 | 
		case UNKNOWN_OPT:  | 
|
| 62 | 
		return "lemon::ArgParseException: unknown option";  | 
|
| 63 | 
		break;  | 
|
| 64 | 
		case INVALID_OPT:  | 
|
| 65 | 
		return "lemon::ArgParseException: invalid combination of options";  | 
|
| 66 | 
		break;  | 
|
| 67 | 
		}  | 
|
| 68 | 
		return "";  | 
|
| 69 | 
		}  | 
|
| 70 | 
		///Return the reason for the failure  | 
|
| 71 | 
		    Reason reason() const {return _reason; }
	 | 
|
| 72 | 
		};  | 
|
| 73 | 
		 | 
|
| 74 | 
		 | 
|
| 37 | 75 | 
		///Command line arguments parser  | 
| 38 | 76 | 
		 | 
| 39 | 77 | 
		///\ingroup misc  | 
| 40 | 78 | 
		///Command line arguments parser.  | 
| 41 | 79 | 
		///  | 
| 42 | 80 | 
		///For a complete example see the \ref arg_parser_demo.cc demo file.  | 
| 43 | 81 | 
		  class ArgParser {
	 | 
| 44 | 82 | 
		 | 
| 45 | 83 | 
		static void _showHelp(void *p);  | 
| 46 | 84 | 
		protected:  | 
| 47 | 85 | 
		 | 
| 48 | 86 | 
		int _argc;  | 
| ... | ... | 
		@@ -107,24 +145,28 @@  | 
| 107 | 145 | 
		private:  | 
| 108 | 146 | 
		//Bind a function to an option.  | 
| 109 | 147 | 
		 | 
| 110 | 148 | 
		//\param name The name of the option. The leading '-' must be omitted.  | 
| 111 | 149 | 
		//\param help A help string.  | 
| 112 | 150 | 
		//\retval func The function to be called when the option is given. It  | 
| 113 | 151 | 
		// must be of type "void f(void *)"  | 
| 114 | 152 | 
		//\param data Data to be passed to \c func  | 
| 115 | 153 | 
		ArgParser &funcOption(const std::string &name,  | 
| 116 | 154 | 
		const std::string &help,  | 
| 117 | 155 | 
		void (*func)(void *),void *data);  | 
| 118 | 156 | 
		 | 
| 157 | 
		bool _exit_on_problems;  | 
|
| 158 | 
		 | 
|
| 159 | 
		void _terminate(ArgParserException::Reason reason) const;  | 
|
| 160 | 
		 | 
|
| 119 | 161 | 
		public:  | 
| 120 | 162 | 
		 | 
| 121 | 163 | 
		///Constructor  | 
| 122 | 164 | 
		ArgParser(int argc, const char * const *argv);  | 
| 123 | 165 | 
		 | 
| 124 | 166 | 
		~ArgParser();  | 
| 125 | 167 | 
		 | 
| 126 | 168 | 
		///\name Options  | 
| 127 | 169 | 
		///  | 
| 128 | 170 | 
		 | 
| 129 | 171 | 
		    ///@{
	 | 
| 130 | 172 | 
		 | 
| ... | ... | 
		@@ -371,16 +413,21 @@  | 
| 371 | 413 | 
		///\sa RefType  | 
| 372 | 414 | 
		RefType operator[](const std::string &n) const  | 
| 373 | 415 | 
		    {
	 | 
| 374 | 416 | 
		return RefType(*this, n);  | 
| 375 | 417 | 
		}  | 
| 376 | 418 | 
		 | 
| 377 | 419 | 
		///Give back the non-option type arguments.  | 
| 378 | 420 | 
		 | 
| 379 | 421 | 
		///Give back a reference to a vector consisting of the program arguments  | 
| 380 | 422 | 
		///not starting with a '-' character.  | 
| 381 | 423 | 
		    const std::vector<std::string> &files() const { return _file_args; }
	 | 
| 382 | 424 | 
		 | 
| 425 | 
		///Throw instead of exit in case of problems  | 
|
| 426 | 
		void throwOnProblems()  | 
|
| 427 | 
		    {
	 | 
|
| 428 | 
		_exit_on_problems=false;  | 
|
| 429 | 
		}  | 
|
| 383 | 430 | 
		};  | 
| 384 | 431 | 
		}  | 
| 385 | 432 | 
		 | 
| 386 | 433 | 
		#endif // LEMON_ARG_PARSER_H  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -38,97 +38,104 @@  | 
| 38 | 38 | 
		///\tparam GR Digraph type.  | 
| 39 | 39 | 
		template<class GR>  | 
| 40 | 40 | 
		struct BfsDefaultTraits  | 
| 41 | 41 | 
		  {
	 | 
| 42 | 42 | 
		///The type of the digraph the algorithm runs on.  | 
| 43 | 43 | 
		typedef GR Digraph;  | 
| 44 | 44 | 
		 | 
| 45 | 45 | 
		///\brief The type of the map that stores the predecessor  | 
| 46 | 46 | 
		///arcs of the shortest paths.  | 
| 47 | 47 | 
		///  | 
| 48 | 48 | 
		///The type of the map that stores the predecessor  | 
| 49 | 49 | 
		///arcs of the shortest paths.  | 
| 50 | 
		///It must  | 
|
| 50 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 51 | 51 | 
		typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;  | 
| 52 | 52 | 
		///Instantiates a \c PredMap.  | 
| 53 | 53 | 
		 | 
| 54 | 54 | 
		///This function instantiates a \ref PredMap.  | 
| 55 | 55 | 
		///\param g is the digraph, to which we would like to define the  | 
| 56 | 56 | 
		///\ref PredMap.  | 
| 57 | 57 | 
		static PredMap *createPredMap(const Digraph &g)  | 
| 58 | 58 | 
		    {
	 | 
| 59 | 59 | 
		return new PredMap(g);  | 
| 60 | 60 | 
		}  | 
| 61 | 61 | 
		 | 
| 62 | 62 | 
		///The type of the map that indicates which nodes are processed.  | 
| 63 | 63 | 
		 | 
| 64 | 64 | 
		///The type of the map that indicates which nodes are processed.  | 
| 65 | 
		///It must  | 
|
| 65 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 66 | 
		///By default, it is a NullMap.  | 
|
| 66 | 67 | 
		typedef NullMap<typename Digraph::Node,bool> ProcessedMap;  | 
| 67 | 68 | 
		///Instantiates a \c ProcessedMap.  | 
| 68 | 69 | 
		 | 
| 69 | 70 | 
		///This function instantiates a \ref ProcessedMap.  | 
| 70 | 71 | 
		///\param g is the digraph, to which  | 
| 71 | 72 | 
		///we would like to define the \ref ProcessedMap  | 
| 72 | 73 | 
		#ifdef DOXYGEN  | 
| 73 | 74 | 
		static ProcessedMap *createProcessedMap(const Digraph &g)  | 
| 74 | 75 | 
		#else  | 
| 75 | 76 | 
		static ProcessedMap *createProcessedMap(const Digraph &)  | 
| 76 | 77 | 
		#endif  | 
| 77 | 78 | 
		    {
	 | 
| 78 | 79 | 
		return new ProcessedMap();  | 
| 79 | 80 | 
		}  | 
| 80 | 81 | 
		 | 
| 81 | 82 | 
		///The type of the map that indicates which nodes are reached.  | 
| 82 | 83 | 
		 | 
| 83 | 84 | 
		///The type of the map that indicates which nodes are reached.  | 
| 84 | 
		///It must  | 
|
| 85 | 
		///It must conform to  | 
|
| 86 | 
		///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.  | 
|
| 85 | 87 | 
		typedef typename Digraph::template NodeMap<bool> ReachedMap;  | 
| 86 | 88 | 
		///Instantiates a \c ReachedMap.  | 
| 87 | 89 | 
		 | 
| 88 | 90 | 
		///This function instantiates a \ref ReachedMap.  | 
| 89 | 91 | 
		///\param g is the digraph, to which  | 
| 90 | 92 | 
		///we would like to define the \ref ReachedMap.  | 
| 91 | 93 | 
		static ReachedMap *createReachedMap(const Digraph &g)  | 
| 92 | 94 | 
		    {
	 | 
| 93 | 95 | 
		return new ReachedMap(g);  | 
| 94 | 96 | 
		}  | 
| 95 | 97 | 
		 | 
| 96 | 98 | 
		///The type of the map that stores the distances of the nodes.  | 
| 97 | 99 | 
		 | 
| 98 | 100 | 
		///The type of the map that stores the distances of the nodes.  | 
| 99 | 
		///It must  | 
|
| 101 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 100 | 102 | 
		typedef typename Digraph::template NodeMap<int> DistMap;  | 
| 101 | 103 | 
		///Instantiates a \c DistMap.  | 
| 102 | 104 | 
		 | 
| 103 | 105 | 
		///This function instantiates a \ref DistMap.  | 
| 104 | 106 | 
		///\param g is the digraph, to which we would like to define the  | 
| 105 | 107 | 
		///\ref DistMap.  | 
| 106 | 108 | 
		static DistMap *createDistMap(const Digraph &g)  | 
| 107 | 109 | 
		    {
	 | 
| 108 | 110 | 
		return new DistMap(g);  | 
| 109 | 111 | 
		}  | 
| 110 | 112 | 
		};  | 
| 111 | 113 | 
		 | 
| 112 | 114 | 
		///%BFS algorithm class.  | 
| 113 | 115 | 
		 | 
| 114 | 116 | 
		///\ingroup search  | 
| 115 | 117 | 
		///This class provides an efficient implementation of the %BFS algorithm.  | 
| 116 | 118 | 
		///  | 
| 117 | 119 | 
		///There is also a \ref bfs() "function-type interface" for the BFS  | 
| 118 | 120 | 
		///algorithm, which is convenient in the simplier cases and it can be  | 
| 119 | 121 | 
		///used easier.  | 
| 120 | 122 | 
		///  | 
| 121 | 123 | 
		///\tparam GR The type of the digraph the algorithm runs on.  | 
| 122 | 124 | 
		///The default type is \ref ListDigraph.  | 
| 125 | 
		///\tparam TR The traits class that defines various types used by the  | 
|
| 126 | 
		///algorithm. By default, it is \ref BfsDefaultTraits  | 
|
| 127 | 
		///"BfsDefaultTraits<GR>".  | 
|
| 128 | 
		///In most cases, this parameter should not be set directly,  | 
|
| 129 | 
		///consider to use the named template parameters instead.  | 
|
| 123 | 130 | 
		#ifdef DOXYGEN  | 
| 124 | 131 | 
		template <typename GR,  | 
| 125 | 132 | 
		typename TR>  | 
| 126 | 133 | 
		#else  | 
| 127 | 134 | 
		template <typename GR=ListDigraph,  | 
| 128 | 135 | 
		typename TR=BfsDefaultTraits<GR> >  | 
| 129 | 136 | 
		#endif  | 
| 130 | 137 | 
		  class Bfs {
	 | 
| 131 | 138 | 
		public:  | 
| 132 | 139 | 
		 | 
| 133 | 140 | 
		///The type of the digraph the algorithm runs on.  | 
| 134 | 141 | 
		typedef typename TR::Digraph Digraph;  | 
| ... | ... | 
		@@ -216,85 +223,86 @@  | 
| 216 | 223 | 
		typedef T PredMap;  | 
| 217 | 224 | 
		static PredMap *createPredMap(const Digraph &)  | 
| 218 | 225 | 
		      {
	 | 
| 219 | 226 | 
		LEMON_ASSERT(false, "PredMap is not initialized");  | 
| 220 | 227 | 
		return 0; // ignore warnings  | 
| 221 | 228 | 
		}  | 
| 222 | 229 | 
		};  | 
| 223 | 230 | 
		///\brief \ref named-templ-param "Named parameter" for setting  | 
| 224 | 231 | 
		///\c PredMap type.  | 
| 225 | 232 | 
		///  | 
| 226 | 233 | 
		///\ref named-templ-param "Named parameter" for setting  | 
| 227 | 234 | 
		///\c PredMap type.  | 
| 228 | 
		///It must  | 
|
| 235 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 229 | 236 | 
		template <class T>  | 
| 230 | 237 | 
		    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
	 | 
| 231 | 238 | 
		typedef Bfs< Digraph, SetPredMapTraits<T> > Create;  | 
| 232 | 239 | 
		};  | 
| 233 | 240 | 
		 | 
| 234 | 241 | 
		template <class T>  | 
| 235 | 242 | 
		    struct SetDistMapTraits : public Traits {
	 | 
| 236 | 243 | 
		typedef T DistMap;  | 
| 237 | 244 | 
		static DistMap *createDistMap(const Digraph &)  | 
| 238 | 245 | 
		      {
	 | 
| 239 | 246 | 
		LEMON_ASSERT(false, "DistMap is not initialized");  | 
| 240 | 247 | 
		return 0; // ignore warnings  | 
| 241 | 248 | 
		}  | 
| 242 | 249 | 
		};  | 
| 243 | 250 | 
		///\brief \ref named-templ-param "Named parameter" for setting  | 
| 244 | 251 | 
		///\c DistMap type.  | 
| 245 | 252 | 
		///  | 
| 246 | 253 | 
		///\ref named-templ-param "Named parameter" for setting  | 
| 247 | 254 | 
		///\c DistMap type.  | 
| 248 | 
		///It must  | 
|
| 255 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 249 | 256 | 
		template <class T>  | 
| 250 | 257 | 
		    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
	 | 
| 251 | 258 | 
		typedef Bfs< Digraph, SetDistMapTraits<T> > Create;  | 
| 252 | 259 | 
		};  | 
| 253 | 260 | 
		 | 
| 254 | 261 | 
		template <class T>  | 
| 255 | 262 | 
		    struct SetReachedMapTraits : public Traits {
	 | 
| 256 | 263 | 
		typedef T ReachedMap;  | 
| 257 | 264 | 
		static ReachedMap *createReachedMap(const Digraph &)  | 
| 258 | 265 | 
		      {
	 | 
| 259 | 266 | 
		LEMON_ASSERT(false, "ReachedMap is not initialized");  | 
| 260 | 267 | 
		return 0; // ignore warnings  | 
| 261 | 268 | 
		}  | 
| 262 | 269 | 
		};  | 
| 263 | 270 | 
		///\brief \ref named-templ-param "Named parameter" for setting  | 
| 264 | 271 | 
		///\c ReachedMap type.  | 
| 265 | 272 | 
		///  | 
| 266 | 273 | 
		///\ref named-templ-param "Named parameter" for setting  | 
| 267 | 274 | 
		///\c ReachedMap type.  | 
| 268 | 
		///It must  | 
|
| 275 | 
		///It must conform to  | 
|
| 276 | 
		///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.  | 
|
| 269 | 277 | 
		template <class T>  | 
| 270 | 278 | 
		    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
	 | 
| 271 | 279 | 
		typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;  | 
| 272 | 280 | 
		};  | 
| 273 | 281 | 
		 | 
| 274 | 282 | 
		template <class T>  | 
| 275 | 283 | 
		    struct SetProcessedMapTraits : public Traits {
	 | 
| 276 | 284 | 
		typedef T ProcessedMap;  | 
| 277 | 285 | 
		static ProcessedMap *createProcessedMap(const Digraph &)  | 
| 278 | 286 | 
		      {
	 | 
| 279 | 287 | 
		LEMON_ASSERT(false, "ProcessedMap is not initialized");  | 
| 280 | 288 | 
		return 0; // ignore warnings  | 
| 281 | 289 | 
		}  | 
| 282 | 290 | 
		};  | 
| 283 | 291 | 
		///\brief \ref named-templ-param "Named parameter" for setting  | 
| 284 | 292 | 
		///\c ProcessedMap type.  | 
| 285 | 293 | 
		///  | 
| 286 | 294 | 
		///\ref named-templ-param "Named parameter" for setting  | 
| 287 | 295 | 
		///\c ProcessedMap type.  | 
| 288 | 
		///It must  | 
|
| 296 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 289 | 297 | 
		template <class T>  | 
| 290 | 298 | 
		    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
	 | 
| 291 | 299 | 
		typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;  | 
| 292 | 300 | 
		};  | 
| 293 | 301 | 
		 | 
| 294 | 302 | 
		    struct SetStandardProcessedMapTraits : public Traits {
	 | 
| 295 | 303 | 
		typedef typename Digraph::template NodeMap<bool> ProcessedMap;  | 
| 296 | 304 | 
		static ProcessedMap *createProcessedMap(const Digraph &g)  | 
| 297 | 305 | 
		      {
	 | 
| 298 | 306 | 
		return new ProcessedMap(g);  | 
| 299 | 307 | 
		return 0; // ignore warnings  | 
| 300 | 308 | 
		}  | 
| ... | ... | 
		@@ -404,26 +412,26 @@  | 
| 404 | 412 | 
		delete _dist;  | 
| 405 | 413 | 
		local_dist=false;  | 
| 406 | 414 | 
		}  | 
| 407 | 415 | 
		_dist = &m;  | 
| 408 | 416 | 
		return *this;  | 
| 409 | 417 | 
		}  | 
| 410 | 418 | 
		 | 
| 411 | 419 | 
		public:  | 
| 412 | 420 | 
		 | 
| 413 | 421 | 
		///\name Execution Control  | 
| 414 | 422 | 
		///The simplest way to execute the BFS algorithm is to use one of the  | 
| 415 | 423 | 
		///member functions called \ref run(Node) "run()".\n  | 
| 416 | 
		///If you need more control on the execution, first you have to call  | 
|
| 417 | 
		///\ref init(), then you can add several source nodes with  | 
|
| 424 | 
		///If you need better control on the execution, you have to call  | 
|
| 425 | 
		///\ref init() first, then you can add several source nodes with  | 
|
| 418 | 426 | 
		///\ref addSource(). Finally the actual path computation can be  | 
| 419 | 427 | 
		///performed with one of the \ref start() functions.  | 
| 420 | 428 | 
		 | 
| 421 | 429 | 
		    ///@{
	 | 
| 422 | 430 | 
		 | 
| 423 | 431 | 
		///\brief Initializes the internal data structures.  | 
| 424 | 432 | 
		///  | 
| 425 | 433 | 
		///Initializes the internal data structures.  | 
| 426 | 434 | 
		void init()  | 
| 427 | 435 | 
		    {
	 | 
| 428 | 436 | 
		create_maps();  | 
| 429 | 437 | 
		_queue.resize(countNodes(*G));  | 
| ... | ... | 
		@@ -691,30 +699,26 @@  | 
| 691 | 699 | 
		/// b.addSource(s);  | 
| 692 | 700 | 
		/// b.start(t);  | 
| 693 | 701 | 
		///\endcode  | 
| 694 | 702 | 
		    bool run(Node s,Node t) {
	 | 
| 695 | 703 | 
		init();  | 
| 696 | 704 | 
		addSource(s);  | 
| 697 | 705 | 
		start(t);  | 
| 698 | 706 | 
		return reached(t);  | 
| 699 | 707 | 
		}  | 
| 700 | 708 | 
		 | 
| 701 | 709 | 
		///Runs the algorithm to visit all nodes in the digraph.  | 
| 702 | 710 | 
		 | 
| 703 | 
		///This method runs the %BFS algorithm in order to  | 
|
| 704 | 
		///compute the shortest path to each node.  | 
|
| 705 | 
		///  | 
|
| 706 | 
		///The algorithm computes  | 
|
| 707 | 
		///- the shortest path tree (forest),  | 
|
| 708 | 
		///- the distance of each node from the root(s).  | 
|
| 711 | 
		///This method runs the %BFS algorithm in order to visit all nodes  | 
|
| 712 | 
		///in the digraph.  | 
|
| 709 | 713 | 
		///  | 
| 710 | 714 | 
		///\note <tt>b.run(s)</tt> is just a shortcut of the following code.  | 
| 711 | 715 | 
		///\code  | 
| 712 | 716 | 
		/// b.init();  | 
| 713 | 717 | 
		    ///  for (NodeIt n(gr); n != INVALID; ++n) {
	 | 
| 714 | 718 | 
		    ///    if (!b.reached(n)) {
	 | 
| 715 | 719 | 
		/// b.addSource(n);  | 
| 716 | 720 | 
		/// b.start();  | 
| 717 | 721 | 
		/// }  | 
| 718 | 722 | 
		/// }  | 
| 719 | 723 | 
		///\endcode  | 
| 720 | 724 | 
		    void run() {
	 | 
| ... | ... | 
		@@ -728,95 +732,97 @@  | 
| 728 | 732 | 
		}  | 
| 729 | 733 | 
		 | 
| 730 | 734 | 
		///@}  | 
| 731 | 735 | 
		 | 
| 732 | 736 | 
		///\name Query Functions  | 
| 733 | 737 | 
		///The results of the BFS algorithm can be obtained using these  | 
| 734 | 738 | 
		///functions.\n  | 
| 735 | 739 | 
		///Either \ref run(Node) "run()" or \ref start() should be called  | 
| 736 | 740 | 
		///before using them.  | 
| 737 | 741 | 
		 | 
| 738 | 742 | 
		    ///@{
	 | 
| 739 | 743 | 
		 | 
| 740 | 
		///The shortest path to  | 
|
| 744 | 
		///The shortest path to the given node.  | 
|
| 741 | 745 | 
		 | 
| 742 | 
		///Returns the shortest path to  | 
|
| 746 | 
		///Returns the shortest path to the given node from the root(s).  | 
|
| 743 | 747 | 
		///  | 
| 744 | 748 | 
		///\warning \c t should be reached from the root(s).  | 
| 745 | 749 | 
		///  | 
| 746 | 750 | 
		///\pre Either \ref run(Node) "run()" or \ref init()  | 
| 747 | 751 | 
		///must be called before using this function.  | 
| 748 | 752 | 
		    Path path(Node t) const { return Path(*G, *_pred, t); }
	 | 
| 749 | 753 | 
		 | 
| 750 | 
		///The distance of  | 
|
| 754 | 
		///The distance of the given node from the root(s).  | 
|
| 751 | 755 | 
		 | 
| 752 | 
		///Returns the distance of  | 
|
| 756 | 
		///Returns the distance of the given node from the root(s).  | 
|
| 753 | 757 | 
		///  | 
| 754 | 758 | 
		///\warning If node \c v is not reached from the root(s), then  | 
| 755 | 759 | 
		///the return value of this function is undefined.  | 
| 756 | 760 | 
		///  | 
| 757 | 761 | 
		///\pre Either \ref run(Node) "run()" or \ref init()  | 
| 758 | 762 | 
		///must be called before using this function.  | 
| 759 | 763 | 
		    int dist(Node v) const { return (*_dist)[v]; }
	 | 
| 760 | 764 | 
		 | 
| 761 | 
		///Returns the 'previous arc' of the shortest path tree for a node.  | 
|
| 762 | 
		 | 
|
| 765 | 
		///\brief Returns the 'previous arc' of the shortest path tree for  | 
|
| 766 | 
		///the given node.  | 
|
| 767 | 
		///  | 
|
| 763 | 768 | 
		///This function returns the 'previous arc' of the shortest path  | 
| 764 | 769 | 
		///tree for the node \c v, i.e. it returns the last arc of a  | 
| 765 | 770 | 
		///shortest path from a root to \c v. It is \c INVALID if \c v  | 
| 766 | 771 | 
		///is not reached from the root(s) or if \c v is a root.  | 
| 767 | 772 | 
		///  | 
| 768 | 773 | 
		///The shortest path tree used here is equal to the shortest path  | 
| 769 | 
		///tree used in \ref predNode().  | 
|
| 774 | 
		///tree used in \ref predNode() and \ref predMap().  | 
|
| 770 | 775 | 
		///  | 
| 771 | 776 | 
		///\pre Either \ref run(Node) "run()" or \ref init()  | 
| 772 | 777 | 
		///must be called before using this function.  | 
| 773 | 778 | 
		    Arc predArc(Node v) const { return (*_pred)[v];}
	 | 
| 774 | 779 | 
		 | 
| 775 | 
		///Returns the 'previous node' of the shortest path tree for a node.  | 
|
| 776 | 
		 | 
|
| 780 | 
		///\brief Returns the 'previous node' of the shortest path tree for  | 
|
| 781 | 
		///the given node.  | 
|
| 782 | 
		///  | 
|
| 777 | 783 | 
		///This function returns the 'previous node' of the shortest path  | 
| 778 | 784 | 
		///tree for the node \c v, i.e. it returns the last but one node  | 
| 779 | 
		///  | 
|
| 785 | 
		///of a shortest path from a root to \c v. It is \c INVALID  | 
|
| 780 | 786 | 
		///if \c v is not reached from the root(s) or if \c v is a root.  | 
| 781 | 787 | 
		///  | 
| 782 | 788 | 
		///The shortest path tree used here is equal to the shortest path  | 
| 783 | 
		///tree used in \ref predArc().  | 
|
| 789 | 
		///tree used in \ref predArc() and \ref predMap().  | 
|
| 784 | 790 | 
		///  | 
| 785 | 791 | 
		///\pre Either \ref run(Node) "run()" or \ref init()  | 
| 786 | 792 | 
		///must be called before using this function.  | 
| 787 | 793 | 
		    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
	 | 
| 788 | 794 | 
		G->source((*_pred)[v]); }  | 
| 789 | 795 | 
		 | 
| 790 | 796 | 
		///\brief Returns a const reference to the node map that stores the  | 
| 791 | 797 | 
		/// distances of the nodes.  | 
| 792 | 798 | 
		///  | 
| 793 | 799 | 
		///Returns a const reference to the node map that stores the distances  | 
| 794 | 800 | 
		///of the nodes calculated by the algorithm.  | 
| 795 | 801 | 
		///  | 
| 796 | 802 | 
		///\pre Either \ref run(Node) "run()" or \ref init()  | 
| 797 | 803 | 
		///must be called before using this function.  | 
| 798 | 804 | 
		    const DistMap &distMap() const { return *_dist;}
	 | 
| 799 | 805 | 
		 | 
| 800 | 806 | 
		///\brief Returns a const reference to the node map that stores the  | 
| 801 | 807 | 
		///predecessor arcs.  | 
| 802 | 808 | 
		///  | 
| 803 | 809 | 
		///Returns a const reference to the node map that stores the predecessor  | 
| 804 | 
		///arcs, which form the shortest path tree.  | 
|
| 810 | 
		///arcs, which form the shortest path tree (forest).  | 
|
| 805 | 811 | 
		///  | 
| 806 | 812 | 
		///\pre Either \ref run(Node) "run()" or \ref init()  | 
| 807 | 813 | 
		///must be called before using this function.  | 
| 808 | 814 | 
		    const PredMap &predMap() const { return *_pred;}
	 | 
| 809 | 815 | 
		 | 
| 810 | 
		///Checks if  | 
|
| 816 | 
		///Checks if the given node is reached from the root(s).  | 
|
| 811 | 817 | 
		 | 
| 812 | 818 | 
		///Returns \c true if \c v is reached from the root(s).  | 
| 813 | 819 | 
		///  | 
| 814 | 820 | 
		///\pre Either \ref run(Node) "run()" or \ref init()  | 
| 815 | 821 | 
		///must be called before using this function.  | 
| 816 | 822 | 
		    bool reached(Node v) const { return (*_reached)[v]; }
	 | 
| 817 | 823 | 
		 | 
| 818 | 824 | 
		///@}  | 
| 819 | 825 | 
		};  | 
| 820 | 826 | 
		 | 
| 821 | 827 | 
		///Default traits class of bfs() function.  | 
| 822 | 828 | 
		 | 
| ... | ... | 
		@@ -824,101 +830,98 @@  | 
| 824 | 830 | 
		///\tparam GR Digraph type.  | 
| 825 | 831 | 
		template<class GR>  | 
| 826 | 832 | 
		struct BfsWizardDefaultTraits  | 
| 827 | 833 | 
		  {
	 | 
| 828 | 834 | 
		///The type of the digraph the algorithm runs on.  | 
| 829 | 835 | 
		typedef GR Digraph;  | 
| 830 | 836 | 
		 | 
| 831 | 837 | 
		///\brief The type of the map that stores the predecessor  | 
| 832 | 838 | 
		///arcs of the shortest paths.  | 
| 833 | 839 | 
		///  | 
| 834 | 840 | 
		///The type of the map that stores the predecessor  | 
| 835 | 841 | 
		///arcs of the shortest paths.  | 
| 836 | 
		///It must  | 
|
| 842 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 837 | 843 | 
		typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;  | 
| 838 | 844 | 
		///Instantiates a PredMap.  | 
| 839 | 845 | 
		 | 
| 840 | 846 | 
		///This function instantiates a PredMap.  | 
| 841 | 847 | 
		///\param g is the digraph, to which we would like to define the  | 
| 842 | 848 | 
		///PredMap.  | 
| 843 | 849 | 
		static PredMap *createPredMap(const Digraph &g)  | 
| 844 | 850 | 
		    {
	 | 
| 845 | 851 | 
		return new PredMap(g);  | 
| 846 | 852 | 
		}  | 
| 847 | 853 | 
		 | 
| 848 | 854 | 
		///The type of the map that indicates which nodes are processed.  | 
| 849 | 855 | 
		 | 
| 850 | 856 | 
		///The type of the map that indicates which nodes are processed.  | 
| 851 | 
		///It must meet the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 852 | 
		///By default it is a NullMap.  | 
|
| 857 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 858 | 
		///By default, it is a NullMap.  | 
|
| 853 | 859 | 
		typedef NullMap<typename Digraph::Node,bool> ProcessedMap;  | 
| 854 | 860 | 
		///Instantiates a ProcessedMap.  | 
| 855 | 861 | 
		 | 
| 856 | 862 | 
		///This function instantiates a ProcessedMap.  | 
| 857 | 863 | 
		///\param g is the digraph, to which  | 
| 858 | 864 | 
		///we would like to define the ProcessedMap.  | 
| 859 | 865 | 
		#ifdef DOXYGEN  | 
| 860 | 866 | 
		static ProcessedMap *createProcessedMap(const Digraph &g)  | 
| 861 | 867 | 
		#else  | 
| 862 | 868 | 
		static ProcessedMap *createProcessedMap(const Digraph &)  | 
| 863 | 869 | 
		#endif  | 
| 864 | 870 | 
		    {
	 | 
| 865 | 871 | 
		return new ProcessedMap();  | 
| 866 | 872 | 
		}  | 
| 867 | 873 | 
		 | 
| 868 | 874 | 
		///The type of the map that indicates which nodes are reached.  | 
| 869 | 875 | 
		 | 
| 870 | 876 | 
		///The type of the map that indicates which nodes are reached.  | 
| 871 | 
		///It must  | 
|
| 877 | 
		///It must conform to  | 
|
| 878 | 
		///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.  | 
|
| 872 | 879 | 
		typedef typename Digraph::template NodeMap<bool> ReachedMap;  | 
| 873 | 880 | 
		///Instantiates a ReachedMap.  | 
| 874 | 881 | 
		 | 
| 875 | 882 | 
		///This function instantiates a ReachedMap.  | 
| 876 | 883 | 
		///\param g is the digraph, to which  | 
| 877 | 884 | 
		///we would like to define the ReachedMap.  | 
| 878 | 885 | 
		static ReachedMap *createReachedMap(const Digraph &g)  | 
| 879 | 886 | 
		    {
	 | 
| 880 | 887 | 
		return new ReachedMap(g);  | 
| 881 | 888 | 
		}  | 
| 882 | 889 | 
		 | 
| 883 | 890 | 
		///The type of the map that stores the distances of the nodes.  | 
| 884 | 891 | 
		 | 
| 885 | 892 | 
		///The type of the map that stores the distances of the nodes.  | 
| 886 | 
		///It must  | 
|
| 893 | 
		///It must conform to the \ref concepts::WriteMap "WriteMap" concept.  | 
|
| 887 | 894 | 
		typedef typename Digraph::template NodeMap<int> DistMap;  | 
| 888 | 895 | 
		///Instantiates a DistMap.  | 
| 889 | 896 | 
		 | 
| 890 | 897 | 
		///This function instantiates a DistMap.  | 
| 891 | 898 | 
		///\param g is the digraph, to which we would like to define  | 
| 892 | 899 | 
		///the DistMap  | 
| 893 | 900 | 
		static DistMap *createDistMap(const Digraph &g)  | 
| 894 | 901 | 
		    {
	 | 
| 895 | 902 | 
		return new DistMap(g);  | 
| 896 | 903 | 
		}  | 
| 897 | 904 | 
		 | 
| 898 | 905 | 
		///The type of the shortest paths.  | 
| 899 | 906 | 
		 | 
| 900 | 907 | 
		///The type of the shortest paths.  | 
| 901 | 
		///It must  | 
|
| 908 | 
		///It must conform to the \ref concepts::Path "Path" concept.  | 
|
| 902 | 909 | 
		typedef lemon::Path<Digraph> Path;  | 
| 903 | 910 | 
		};  | 
| 904 | 911 | 
		 | 
| 905 | 912 | 
		/// Default traits class used by BfsWizard  | 
| 906 | 913 | 
		 | 
| 907 | 
		/// To make it easier to use Bfs algorithm  | 
|
| 908 | 
		/// we have created a wizard class.  | 
|
| 909 | 
		/// This \ref BfsWizard class needs default traits,  | 
|
| 910 | 
		/// as well as the \ref Bfs class.  | 
|
| 911 | 
		/// The \ref BfsWizardBase is a class to be the default traits of the  | 
|
| 912 | 
		/// \ref BfsWizard class.  | 
|
| 914 | 
		/// Default traits class used by BfsWizard.  | 
|
| 915 | 
		/// \tparam GR The type of the digraph.  | 
|
| 913 | 916 | 
		template<class GR>  | 
| 914 | 917 | 
		class BfsWizardBase : public BfsWizardDefaultTraits<GR>  | 
| 915 | 918 | 
		  {
	 | 
| 916 | 919 | 
		 | 
| 917 | 920 | 
		typedef BfsWizardDefaultTraits<GR> Base;  | 
| 918 | 921 | 
		protected:  | 
| 919 | 922 | 
		//The type of the nodes in the digraph.  | 
| 920 | 923 | 
		typedef typename Base::Digraph::Node Node;  | 
| 921 | 924 | 
		 | 
| 922 | 925 | 
		//Pointer to the digraph the algorithm runs on.  | 
| 923 | 926 | 
		void *_g;  | 
| 924 | 927 | 
		//Pointer to the map of reached nodes.  | 
| ... | ... | 
		@@ -928,72 +931,68 @@  | 
| 928 | 931 | 
		//Pointer to the map of predecessors arcs.  | 
| 929 | 932 | 
		void *_pred;  | 
| 930 | 933 | 
		//Pointer to the map of distances.  | 
| 931 | 934 | 
		void *_dist;  | 
| 932 | 935 | 
		//Pointer to the shortest path to the target node.  | 
| 933 | 936 | 
		void *_path;  | 
| 934 | 937 | 
		//Pointer to the distance of the target node.  | 
| 935 | 938 | 
		int *_di;  | 
| 936 | 939 | 
		 | 
| 937 | 940 | 
		public:  | 
| 938 | 941 | 
		/// Constructor.  | 
| 939 | 942 | 
		 | 
| 940 | 
		/// This constructor does not require parameters,  | 
|
| 943 | 
		/// This constructor does not require parameters, it initiates  | 
|
| 941 | 944 | 
		/// all of the attributes to \c 0.  | 
| 942 | 945 | 
		BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),  | 
| 943 | 946 | 
		                      _dist(0), _path(0), _di(0) {}
	 | 
| 944 | 947 | 
		 | 
| 945 | 948 | 
		/// Constructor.  | 
| 946 | 949 | 
		 | 
| 947 | 950 | 
		/// This constructor requires one parameter,  | 
| 948 | 951 | 
		/// others are initiated to \c 0.  | 
| 949 | 952 | 
		/// \param g The digraph the algorithm runs on.  | 
| 950 | 953 | 
		BfsWizardBase(const GR &g) :  | 
| 951 | 954 | 
		_g(reinterpret_cast<void*>(const_cast<GR*>(&g))),  | 
| 952 | 955 | 
		      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
	 | 
| 953 | 956 | 
		 | 
| 954 | 957 | 
		};  | 
| 955 | 958 | 
		 | 
| 956 | 959 | 
		/// Auxiliary class for the function-type interface of BFS algorithm.  | 
| 957 | 960 | 
		 | 
| 958 | 961 | 
		/// This auxiliary class is created to implement the  | 
| 959 | 962 | 
		/// \ref bfs() "function-type interface" of \ref Bfs algorithm.  | 
| 960 | 963 | 
		/// It does not have own \ref run(Node) "run()" method, it uses the  | 
| 961 | 964 | 
		/// functions and features of the plain \ref Bfs.  | 
| 962 | 965 | 
		///  | 
| 963 | 966 | 
		/// This class should only be used through the \ref bfs() function,  | 
| 964 | 967 | 
		/// which makes it easier to use the algorithm.  | 
| 968 | 
		///  | 
|
| 969 | 
		/// \tparam TR The traits class that defines various types used by the  | 
|
| 970 | 
		/// algorithm.  | 
|
| 965 | 971 | 
		template<class TR>  | 
| 966 | 972 | 
		class BfsWizard : public TR  | 
| 967 | 973 | 
		  {
	 | 
| 968 | 974 | 
		typedef TR Base;  | 
| 969 | 975 | 
		 | 
| 970 | 
		///The type of the digraph the algorithm runs on.  | 
|
| 971 | 976 | 
		typedef typename TR::Digraph Digraph;  | 
| 972 | 977 | 
		 | 
| 973 | 978 | 
		typedef typename Digraph::Node Node;  | 
| 974 | 979 | 
		typedef typename Digraph::NodeIt NodeIt;  | 
| 975 | 980 | 
		typedef typename Digraph::Arc Arc;  | 
| 976 | 981 | 
		typedef typename Digraph::OutArcIt OutArcIt;  | 
| 977 | 982 | 
		 | 
| 978 | 
		///\brief The type of the map that stores the predecessor  | 
|
| 979 | 
		///arcs of the shortest paths.  | 
|
| 980 | 983 | 
		typedef typename TR::PredMap PredMap;  | 
| 981 | 
		///\brief The type of the map that stores the distances of the nodes.  | 
|
| 982 | 984 | 
		typedef typename TR::DistMap DistMap;  | 
| 983 | 
		///\brief The type of the map that indicates which nodes are reached.  | 
|
| 984 | 985 | 
		typedef typename TR::ReachedMap ReachedMap;  | 
| 985 | 
		///\brief The type of the map that indicates which nodes are processed.  | 
|
| 986 | 986 | 
		typedef typename TR::ProcessedMap ProcessedMap;  | 
| 987 | 
		///The type of the shortest paths  | 
|
| 988 | 987 | 
		typedef typename TR::Path Path;  | 
| 989 | 988 | 
		 | 
| 990 | 989 | 
		public:  | 
| 991 | 990 | 
		 | 
| 992 | 991 | 
		/// Constructor.  | 
| 993 | 992 | 
		    BfsWizard() : TR() {}
	 | 
| 994 | 993 | 
		 | 
| 995 | 994 | 
		/// Constructor that requires parameters.  | 
| 996 | 995 | 
		 | 
| 997 | 996 | 
		/// Constructor that requires parameters.  | 
| 998 | 997 | 
		/// These parameters will be the default values for the traits class.  | 
| 999 | 998 | 
		/// \param g The digraph the algorithm runs on.  | 
| ... | ... | 
		@@ -1045,96 +1044,101 @@  | 
| 1045 | 1044 | 
		if (Base::_processed)  | 
| 1046 | 1045 | 
		alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));  | 
| 1047 | 1046 | 
		alg.run(s,t);  | 
| 1048 | 1047 | 
		if (Base::_path)  | 
| 1049 | 1048 | 
		*reinterpret_cast<Path*>(Base::_path) = alg.path(t);  | 
| 1050 | 1049 | 
		if (Base::_di)  | 
| 1051 | 1050 | 
		*Base::_di = alg.dist(t);  | 
| 1052 | 1051 | 
		return alg.reached(t);  | 
| 1053 | 1052 | 
		}  | 
| 1054 | 1053 | 
		 | 
| 1055 | 1054 | 
		///Runs BFS algorithm to visit all nodes in the digraph.  | 
| 1056 | 1055 | 
		 | 
| 1057 | 
		///This method runs BFS algorithm in order to compute  | 
|
| 1058 | 
		///the shortest path to each node.  | 
|
| 1056 | 
		///This method runs BFS algorithm in order to visit all nodes  | 
|
| 1057 | 
		///in the digraph.  | 
|
| 1059 | 1058 | 
		void run()  | 
| 1060 | 1059 | 
		    {
	 | 
| 1061 | 1060 | 
		run(INVALID);  | 
| 1062 | 1061 | 
		}  | 
| 1063 | 1062 | 
		 | 
| 1064 | 1063 | 
		template<class T>  | 
| 1065 | 1064 | 
		    struct SetPredMapBase : public Base {
	 | 
| 1066 | 1065 | 
		typedef T PredMap;  | 
| 1067 | 1066 | 
		      static PredMap *createPredMap(const Digraph &) { return 0; };
	 | 
| 1068 | 1067 | 
		      SetPredMapBase(const TR &b) : TR(b) {}
	 | 
| 1069 | 1068 | 
		};  | 
| 1070 | 
		///\brief \ref named-func-param "Named parameter"  | 
|
| 1071 | 
		///for setting PredMap object.  | 
|
| 1069 | 
		 | 
|
| 1070 | 
		///\brief \ref named-templ-param "Named parameter" for setting  | 
|
| 1071 | 
		///the predecessor map.  | 
|
| 1072 | 1072 | 
		///  | 
| 1073 | 
		///\ref named-func-param "Named parameter"  | 
|
| 1074 | 
		///for setting PredMap object.  | 
|
| 1073 | 
		///\ref named-templ-param "Named parameter" function for setting  | 
|
| 1074 | 
		///the map that stores the predecessor arcs of the nodes.  | 
|
| 1075 | 1075 | 
		template<class T>  | 
| 1076 | 1076 | 
		BfsWizard<SetPredMapBase<T> > predMap(const T &t)  | 
| 1077 | 1077 | 
		    {
	 | 
| 1078 | 1078 | 
		Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));  | 
| 1079 | 1079 | 
		return BfsWizard<SetPredMapBase<T> >(*this);  | 
| 1080 | 1080 | 
		}  | 
| 1081 | 1081 | 
		 | 
| 1082 | 1082 | 
		template<class T>  | 
| 1083 | 1083 | 
		    struct SetReachedMapBase : public Base {
	 | 
| 1084 | 1084 | 
		typedef T ReachedMap;  | 
| 1085 | 1085 | 
		      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
	 | 
| 1086 | 1086 | 
		      SetReachedMapBase(const TR &b) : TR(b) {}
	 | 
| 1087 | 1087 | 
		};  | 
| 1088 | 
		///\brief \ref named-func-param "Named parameter"  | 
|
| 1089 | 
		///for setting ReachedMap object.  | 
|
| 1088 | 
		 | 
|
| 1089 | 
		///\brief \ref named-templ-param "Named parameter" for setting  | 
|
| 1090 | 
		///the reached map.  | 
|
| 1090 | 1091 | 
		///  | 
| 1091 | 
		/// \ref named-func-param "Named parameter"  | 
|
| 1092 | 
		///for setting ReachedMap object.  | 
|
| 1092 | 
		///\ref named-templ-param "Named parameter" function for setting  | 
|
| 1093 | 
		///the map that indicates which nodes are reached.  | 
|
| 1093 | 1094 | 
		template<class T>  | 
| 1094 | 1095 | 
		BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)  | 
| 1095 | 1096 | 
		    {
	 | 
| 1096 | 1097 | 
		Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));  | 
| 1097 | 1098 | 
		return BfsWizard<SetReachedMapBase<T> >(*this);  | 
| 1098 | 1099 | 
		}  | 
| 1099 | 1100 | 
		 | 
| 1100 | 1101 | 
		template<class T>  | 
| 1101 | 1102 | 
		    struct SetDistMapBase : public Base {
	 | 
| 1102 | 1103 | 
		typedef T DistMap;  | 
| 1103 | 1104 | 
		      static DistMap *createDistMap(const Digraph &) { return 0; };
	 | 
| 1104 | 1105 | 
		      SetDistMapBase(const TR &b) : TR(b) {}
	 | 
| 1105 | 1106 | 
		};  | 
| 1106 | 
		///\brief \ref named-func-param "Named parameter"  | 
|
| 1107 | 
		///for setting DistMap object.  | 
|
| 1107 | 
		 | 
|
| 1108 | 
		///\brief \ref named-templ-param "Named parameter" for setting  | 
|
| 1109 | 
		///the distance map.  | 
|
| 1108 | 1110 | 
		///  | 
| 1109 | 
		/// \ref named-func-param "Named parameter"  | 
|
| 1110 | 
		///for setting DistMap object.  | 
|
| 1111 | 
		///\ref named-templ-param "Named parameter" function for setting  | 
|
| 1112 | 
		///the map that stores the distances of the nodes calculated  | 
|
| 1113 | 
		///by the algorithm.  | 
|
| 1111 | 1114 | 
		template<class T>  | 
| 1112 | 1115 | 
		BfsWizard<SetDistMapBase<T> > distMap(const T &t)  | 
| 1113 | 1116 | 
		    {
	 | 
| 1114 | 1117 | 
		Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));  | 
| 1115 | 1118 | 
		return BfsWizard<SetDistMapBase<T> >(*this);  | 
| 1116 | 1119 | 
		}  | 
| 1117 | 1120 | 
		 | 
| 1118 | 1121 | 
		template<class T>  | 
| 1119 | 1122 | 
		    struct SetProcessedMapBase : public Base {
	 | 
| 1120 | 1123 | 
		typedef T ProcessedMap;  | 
| 1121 | 1124 | 
		      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
	 | 
| 1122 | 1125 | 
		      SetProcessedMapBase(const TR &b) : TR(b) {}
	 | 
| 1123 | 1126 | 
		};  | 
| 1124 | 
		///\brief \ref named-func-param "Named parameter"  | 
|
| 1125 | 
		///for setting ProcessedMap object.  | 
|
| 1127 | 
		 | 
|
| 1128 | 
		///\brief \ref named-func-param "Named parameter" for setting  | 
|
| 1129 | 
		///the processed map.  | 
|
| 1126 | 1130 | 
		///  | 
| 1127 | 
		/// \ref named-func-param "Named parameter"  | 
|
| 1128 | 
		///for setting ProcessedMap object.  | 
|
| 1131 | 
		///\ref named-templ-param "Named parameter" function for setting  | 
|
| 1132 | 
		///the map that indicates which nodes are processed.  | 
|
| 1129 | 1133 | 
		template<class T>  | 
| 1130 | 1134 | 
		BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)  | 
| 1131 | 1135 | 
		    {
	 | 
| 1132 | 1136 | 
		Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));  | 
| 1133 | 1137 | 
		return BfsWizard<SetProcessedMapBase<T> >(*this);  | 
| 1134 | 1138 | 
		}  | 
| 1135 | 1139 | 
		 | 
| 1136 | 1140 | 
		template<class T>  | 
| 1137 | 1141 | 
		    struct SetPathBase : public Base {
	 | 
| 1138 | 1142 | 
		typedef T Path;  | 
| 1139 | 1143 | 
		      SetPathBase(const TR &b) : TR(b) {}
	 | 
| 1140 | 1144 | 
		};  | 
| ... | ... | 
		@@ -1255,25 +1259,26 @@  | 
| 1255 | 1259 | 
		///  | 
| 1256 | 1260 | 
		/// Default traits class of BfsVisit class.  | 
| 1257 | 1261 | 
		/// \tparam GR The type of the digraph the algorithm runs on.  | 
| 1258 | 1262 | 
		template<class GR>  | 
| 1259 | 1263 | 
		  struct BfsVisitDefaultTraits {
	 | 
| 1260 | 1264 | 
		 | 
| 1261 | 1265 | 
		/// \brief The type of the digraph the algorithm runs on.  | 
| 1262 | 1266 | 
		typedef GR Digraph;  | 
| 1263 | 1267 | 
		 | 
| 1264 | 1268 | 
		/// \brief The type of the map that indicates which nodes are reached.  | 
| 1265 | 1269 | 
		///  | 
| 1266 | 1270 | 
		/// The type of the map that indicates which nodes are reached.  | 
| 1267 | 
		/// It must  | 
|
| 1271 | 
		/// It must conform to  | 
|
| 1272 | 
		///the \ref concepts::ReadWriteMap "ReadWriteMap" concept.  | 
|
| 1268 | 1273 | 
		typedef typename Digraph::template NodeMap<bool> ReachedMap;  | 
| 1269 | 1274 | 
		 | 
| 1270 | 1275 | 
		/// \brief Instantiates a ReachedMap.  | 
| 1271 | 1276 | 
		///  | 
| 1272 | 1277 | 
		/// This function instantiates a ReachedMap.  | 
| 1273 | 1278 | 
		/// \param digraph is the digraph, to which  | 
| 1274 | 1279 | 
		/// we would like to define the ReachedMap.  | 
| 1275 | 1280 | 
		    static ReachedMap *createReachedMap(const Digraph &digraph) {
	 | 
| 1276 | 1281 | 
		return new ReachedMap(digraph);  | 
| 1277 | 1282 | 
		}  | 
| 1278 | 1283 | 
		 | 
| 1279 | 1284 | 
		};  | 
| ... | ... | 
		@@ -1293,29 +1298,29 @@  | 
| 1293 | 1298 | 
		/// when extra actions have to be performed in connection with certain  | 
| 1294 | 1299 | 
		/// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()  | 
| 1295 | 1300 | 
		/// instead.  | 
| 1296 | 1301 | 
		///  | 
| 1297 | 1302 | 
		/// \tparam GR The type of the digraph the algorithm runs on.  | 
| 1298 | 1303 | 
		/// The default type is \ref ListDigraph.  | 
| 1299 | 1304 | 
		/// The value of GR is not used directly by \ref BfsVisit,  | 
| 1300 | 1305 | 
		/// it is only passed to \ref BfsVisitDefaultTraits.  | 
| 1301 | 1306 | 
		/// \tparam VS The Visitor type that is used by the algorithm.  | 
| 1302 | 1307 | 
		/// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which  | 
| 1303 | 1308 | 
		/// does not observe the BFS events. If you want to observe the BFS  | 
| 1304 | 1309 | 
		/// events, you should implement your own visitor class.  | 
| 1305 | 
		/// \tparam TR Traits class to set various data types used by the  | 
|
| 1306 | 
		/// algorithm. The default traits class is  | 
|
| 1307 | 
		/// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".  | 
|
| 1308 | 
		/// See \ref BfsVisitDefaultTraits for the documentation of  | 
|
| 1309 | 
		///  | 
|
| 1310 | 
		/// \tparam TR The traits class that defines various types used by the  | 
|
| 1311 | 
		/// algorithm. By default, it is \ref BfsVisitDefaultTraits  | 
|
| 1312 | 
		/// "BfsVisitDefaultTraits<GR>".  | 
|
| 1313 | 
		/// In most cases, this parameter should not be set directly,  | 
|
| 1314 | 
		/// consider to use the named template parameters instead.  | 
|
| 1310 | 1315 | 
		#ifdef DOXYGEN  | 
| 1311 | 1316 | 
		template <typename GR, typename VS, typename TR>  | 
| 1312 | 1317 | 
		#else  | 
| 1313 | 1318 | 
		template <typename GR = ListDigraph,  | 
| 1314 | 1319 | 
		typename VS = BfsVisitor<GR>,  | 
| 1315 | 1320 | 
		typename TR = BfsVisitDefaultTraits<GR> >  | 
| 1316 | 1321 | 
		#endif  | 
| 1317 | 1322 | 
		  class BfsVisit {
	 | 
| 1318 | 1323 | 
		public:  | 
| 1319 | 1324 | 
		 | 
| 1320 | 1325 | 
		///The traits class.  | 
| 1321 | 1326 | 
		typedef TR Traits;  | 
| ... | ... | 
		@@ -1416,26 +1421,26 @@  | 
| 1416 | 1421 | 
		delete _reached;  | 
| 1417 | 1422 | 
		local_reached = false;  | 
| 1418 | 1423 | 
		}  | 
| 1419 | 1424 | 
		_reached = &m;  | 
| 1420 | 1425 | 
		return *this;  | 
| 1421 | 1426 | 
		}  | 
| 1422 | 1427 | 
		 | 
| 1423 | 1428 | 
		public:  | 
| 1424 | 1429 | 
		 | 
| 1425 | 1430 | 
		/// \name Execution Control  | 
| 1426 | 1431 | 
		/// The simplest way to execute the BFS algorithm is to use one of the  | 
| 1427 | 1432 | 
		/// member functions called \ref run(Node) "run()".\n  | 
| 1428 | 
		/// If you need more control on the execution, first you have to call  | 
|
| 1429 | 
		/// \ref init(), then you can add several source nodes with  | 
|
| 1433 | 
		/// If you need better control on the execution, you have to call  | 
|
| 1434 | 
		/// \ref init() first, then you can add several source nodes with  | 
|
| 1430 | 1435 | 
		/// \ref addSource(). Finally the actual path computation can be  | 
| 1431 | 1436 | 
		/// performed with one of the \ref start() functions.  | 
| 1432 | 1437 | 
		 | 
| 1433 | 1438 | 
		    /// @{
	 | 
| 1434 | 1439 | 
		 | 
| 1435 | 1440 | 
		/// \brief Initializes the internal data structures.  | 
| 1436 | 1441 | 
		///  | 
| 1437 | 1442 | 
		/// Initializes the internal data structures.  | 
| 1438 | 1443 | 
		    void init() {
	 | 
| 1439 | 1444 | 
		create_maps();  | 
| 1440 | 1445 | 
		_list.resize(countNodes(*_digraph));  | 
| 1441 | 1446 | 
		_list_front = _list_back = -1;  | 
| ... | ... | 
		@@ -1689,30 +1694,26 @@  | 
| 1689 | 1694 | 
		/// b.addSource(s);  | 
| 1690 | 1695 | 
		/// b.start(t);  | 
| 1691 | 1696 | 
		///\endcode  | 
| 1692 | 1697 | 
		    bool run(Node s,Node t) {
	 | 
| 1693 | 1698 | 
		init();  | 
| 1694 | 1699 | 
		addSource(s);  | 
| 1695 | 1700 | 
		start(t);  | 
| 1696 | 1701 | 
		return reached(t);  | 
| 1697 | 1702 | 
		}  | 
| 1698 | 1703 | 
		 | 
| 1699 | 1704 | 
		/// \brief Runs the algorithm to visit all nodes in the digraph.  | 
| 1700 | 1705 | 
		///  | 
| 1701 | 
		/// This method runs the %BFS algorithm in order to  | 
|
| 1702 | 
		/// compute the shortest path to each node.  | 
|
| 1703 | 
		///  | 
|
| 1704 | 
		/// The algorithm computes  | 
|
| 1705 | 
		/// - the shortest path tree (forest),  | 
|
| 1706 | 
		/// - the distance of each node from the root(s).  | 
|
| 1706 | 
		/// This method runs the %BFS algorithm in order to visit all nodes  | 
|
| 1707 | 
		/// in the digraph.  | 
|
| 1707 | 1708 | 
		///  | 
| 1708 | 1709 | 
		/// \note <tt>b.run(s)</tt> is just a shortcut of the following code.  | 
| 1709 | 1710 | 
		///\code  | 
| 1710 | 1711 | 
		/// b.init();  | 
| 1711 | 1712 | 
		    ///  for (NodeIt n(gr); n != INVALID; ++n) {
	 | 
| 1712 | 1713 | 
		    ///    if (!b.reached(n)) {
	 | 
| 1713 | 1714 | 
		/// b.addSource(n);  | 
| 1714 | 1715 | 
		/// b.start();  | 
| 1715 | 1716 | 
		/// }  | 
| 1716 | 1717 | 
		/// }  | 
| 1717 | 1718 | 
		///\endcode  | 
| 1718 | 1719 | 
		    void run() {
	 | 
| ... | ... | 
		@@ -1726,25 +1727,25 @@  | 
| 1726 | 1727 | 
		}  | 
| 1727 | 1728 | 
		 | 
| 1728 | 1729 | 
		///@}  | 
| 1729 | 1730 | 
		 | 
| 1730 | 1731 | 
		/// \name Query Functions  | 
| 1731 | 1732 | 
		/// The results of the BFS algorithm can be obtained using these  | 
| 1732 | 1733 | 
		/// functions.\n  | 
| 1733 | 1734 | 
		/// Either \ref run(Node) "run()" or \ref start() should be called  | 
| 1734 | 1735 | 
		/// before using them.  | 
| 1735 | 1736 | 
		 | 
| 1736 | 1737 | 
		    ///@{
	 | 
| 1737 | 1738 | 
		 | 
| 1738 | 
		/// \brief Checks if  | 
|
| 1739 | 
		/// \brief Checks if the given node is reached from the root(s).  | 
|
| 1739 | 1740 | 
		///  | 
| 1740 | 1741 | 
		/// Returns \c true if \c v is reached from the root(s).  | 
| 1741 | 1742 | 
		///  | 
| 1742 | 1743 | 
		/// \pre Either \ref run(Node) "run()" or \ref init()  | 
| 1743 | 1744 | 
		/// must be called before using this function.  | 
| 1744 | 1745 | 
		    bool reached(Node v) const { return (*_reached)[v]; }
	 | 
| 1745 | 1746 | 
		 | 
| 1746 | 1747 | 
		///@}  | 
| 1747 | 1748 | 
		 | 
| 1748 | 1749 | 
		};  | 
| 1749 | 1750 | 
		 | 
| 1750 | 1751 | 
		} //END OF NAMESPACE LEMON  | 
| ... | ... | 
		@@ -10,338 +10,338 @@  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| 18 | 18 | 
		 | 
| 19 | 19 | 
		#ifndef LEMON_BIN_HEAP_H  | 
| 20 | 20 | 
		#define LEMON_BIN_HEAP_H  | 
| 21 | 21 | 
		 | 
| 22 | 
		///\ingroup  | 
|
| 22 | 
		///\ingroup heaps  | 
|
| 23 | 23 | 
		///\file  | 
| 24 | 
		///\brief Binary  | 
|
| 24 | 
		///\brief Binary heap implementation.  | 
|
| 25 | 25 | 
		 | 
| 26 | 26 | 
		#include <vector>  | 
| 27 | 27 | 
		#include <utility>  | 
| 28 | 28 | 
		#include <functional>  | 
| 29 | 29 | 
		 | 
| 30 | 30 | 
		namespace lemon {
	 | 
| 31 | 31 | 
		 | 
| 32 | 
		///\ingroup  | 
|
| 32 | 
		/// \ingroup heaps  | 
|
| 33 | 33 | 
		///  | 
| 34 | 
		///\brief  | 
|
| 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 | 
		///  | 
|
| 54 | 
		/// Type of the priorities.  | 
|
| 59 | 55 | 
		typedef PR Prio;  | 
| 60 | 
		///  | 
|
| 56 | 
		/// Type of the items stored in the heap.  | 
|
| 61 | 57 | 
		typedef typename ItemIntMap::Key Item;  | 
| 62 | 
		///  | 
|
| 58 | 
		/// Type of the item-priority pairs.  | 
|
| 63 | 59 | 
		typedef std::pair<Item,Prio> Pair;  | 
| 64 | 
		///  | 
|
| 60 | 
		/// Functor type for comparing the priorities.  | 
|
| 65 | 61 | 
		typedef CMP Compare;  | 
| 66 | 62 | 
		 | 
| 67 | 
		/// \brief Type to represent the  | 
|
| 63 | 
		/// \brief Type to represent the states of the items.  | 
|
| 68 | 64 | 
		///  | 
| 69 | 
		/// Each Item element have a state associated to it. It may be "in heap",  | 
|
| 70 | 
		/// "pre heap" or "post heap". The latter two are indifferent from the  | 
|
| 65 | 
		/// Each item has a state associated to it. It can be "in heap",  | 
|
| 66 | 
		/// "pre-heap" or "post-heap". The latter two are indifferent from the  | 
|
| 71 | 67 | 
		/// heap's point of view, but may be useful to the user.  | 
| 72 | 68 | 
		///  | 
| 73 | 69 | 
		/// The item-int map must be initialized in such way that it assigns  | 
| 74 | 70 | 
		/// \c PRE_HEAP (<tt>-1</tt>) to any element to be put in the heap.  | 
| 75 | 71 | 
		    enum State {
	 | 
| 76 | 72 | 
		IN_HEAP = 0, ///< = 0.  | 
| 77 | 73 | 
		PRE_HEAP = -1, ///< = -1.  | 
| 78 | 74 | 
		POST_HEAP = -2 ///< = -2.  | 
| 79 | 75 | 
		};  | 
| 80 | 76 | 
		 | 
| 81 | 77 | 
		private:  | 
| 82 | 78 | 
		std::vector<Pair> _data;  | 
| 83 | 79 | 
		Compare _comp;  | 
| 84 | 80 | 
		ItemIntMap &_iim;  | 
| 85 | 81 | 
		 | 
| 86 | 82 | 
		public:  | 
| 87 | 
		
  | 
|
| 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  | 
|
| 92 | 
		/// \brief Constructor.  | 
|
| 96 | 93 | 
		///  | 
| 97 | 
		/// The constructor.  | 
|
| 98 | 
		/// \param map should be given to the constructor, since it is used  | 
|
| 99 | 
		/// internally to handle the cross references. The value of the map  | 
|
| 100 | 
		/// should be PRE_HEAP (-1) for each element.  | 
|
| 101 | 
		///  | 
|
| 102 | 
		/// \param comp The comparator function object.  | 
|
| 94 | 
		/// Constructor.  | 
|
| 95 | 
		/// \param map A map that assigns \c int values to the items.  | 
|
| 96 | 
		/// It is used internally to handle the cross references.  | 
|
| 97 | 
		/// The assigned value must be \c PRE_HEAP (<tt>-1</tt>) for each item.  | 
|
| 98 | 
		/// \param comp The function object used for comparing the priorities.  | 
|
| 103 | 99 | 
		BinHeap(ItemIntMap &map, const Compare &comp)  | 
| 104 | 100 | 
		      : _iim(map), _comp(comp) {}
	 | 
| 105 | 101 | 
		 | 
| 106 | 102 | 
		 | 
| 107 | 
		/// The number of items stored in the heap.  | 
|
| 103 | 
		/// \brief The number of items stored in the heap.  | 
|
| 108 | 104 | 
		///  | 
| 109 | 
		///  | 
|
| 105 | 
		/// This function returns the number of items stored in the heap.  | 
|
| 110 | 106 | 
		    int size() const { return _data.size(); }
	 | 
| 111 | 107 | 
		 | 
| 112 | 
		/// \brief  | 
|
| 108 | 
		/// \brief Check if the heap is empty.  | 
|
| 113 | 109 | 
		///  | 
| 114 | 
		///  | 
|
| 110 | 
		/// This function returns \c true if the heap is empty.  | 
|
| 115 | 111 | 
		    bool empty() const { return _data.empty(); }
	 | 
| 116 | 112 | 
		 | 
| 117 | 
		/// \brief Make  | 
|
| 113 | 
		/// \brief Make the heap empty.  | 
|
| 118 | 114 | 
		///  | 
| 119 | 
		/// Make empty this heap. It does not change the cross reference map.  | 
|
| 120 | 
		/// If you want to reuse what is not surely empty you should first clear  | 
|
| 121 | 
		/// the heap and after that you should set the cross reference map for  | 
|
| 122 | 
		/// each item to \c PRE_HEAP.  | 
|
| 115 | 
		/// This functon makes the heap empty.  | 
|
| 116 | 
		/// It does not change the cross reference map. If you want to reuse  | 
|
| 117 | 
		/// a heap that is not surely empty, you should first clear it and  | 
|
| 118 | 
		/// then you should set the cross reference map to \c PRE_HEAP  | 
|
| 119 | 
		/// for each item.  | 
|
| 123 | 120 | 
		    void clear() {
	 | 
| 124 | 121 | 
		_data.clear();  | 
| 125 | 122 | 
		}  | 
| 126 | 123 | 
		 | 
| 127 | 124 | 
		private:  | 
| 128 | 125 | 
		    static int parent(int i) { return (i-1)/2; }
	 | 
| 129 | 126 | 
		 | 
| 130 | 
		static int  | 
|
| 127 | 
		    static int secondChild(int i) { return 2*i+2; }
	 | 
|
| 131 | 128 | 
		    bool less(const Pair &p1, const Pair &p2) const {
	 | 
| 132 | 129 | 
		return _comp(p1.second, p2.second);  | 
| 133 | 130 | 
		}  | 
| 134 | 131 | 
		 | 
| 135 | 
		int  | 
|
| 132 | 
		    int bubbleUp(int hole, Pair p) {
	 | 
|
| 136 | 133 | 
		int par = parent(hole);  | 
| 137 | 134 | 
		      while( hole>0 && less(p,_data[par]) ) {
	 | 
| 138 | 135 | 
		move(_data[par],hole);  | 
| 139 | 136 | 
		hole = par;  | 
| 140 | 137 | 
		par = parent(hole);  | 
| 141 | 138 | 
		}  | 
| 142 | 139 | 
		move(p, hole);  | 
| 143 | 140 | 
		return hole;  | 
| 144 | 141 | 
		}  | 
| 145 | 142 | 
		 | 
| 146 | 
		    int bubble_down(int hole, Pair p, int length) {
	 | 
|
| 147 | 
		int child = second_child(hole);  | 
|
| 143 | 
		    int bubbleDown(int hole, Pair p, int length) {
	 | 
|
| 144 | 
		int child = secondChild(hole);  | 
|
| 148 | 145 | 
		      while(child < length) {
	 | 
| 149 | 146 | 
		        if( less(_data[child-1], _data[child]) ) {
	 | 
| 150 | 147 | 
		--child;  | 
| 151 | 148 | 
		}  | 
| 152 | 149 | 
		if( !less(_data[child], p) )  | 
| 153 | 150 | 
		goto ok;  | 
| 154 | 151 | 
		move(_data[child], hole);  | 
| 155 | 152 | 
		hole = child;  | 
| 156 | 
		child =  | 
|
| 153 | 
		child = secondChild(hole);  | 
|
| 157 | 154 | 
		}  | 
| 158 | 155 | 
		child--;  | 
| 159 | 156 | 
		      if( child<length && less(_data[child], p) ) {
	 | 
| 160 | 157 | 
		move(_data[child], hole);  | 
| 161 | 158 | 
		hole=child;  | 
| 162 | 159 | 
		}  | 
| 163 | 160 | 
		ok:  | 
| 164 | 161 | 
		move(p, hole);  | 
| 165 | 162 | 
		return hole;  | 
| 166 | 163 | 
		}  | 
| 167 | 164 | 
		 | 
| 168 | 165 | 
		    void move(const Pair &p, int i) {
	 | 
| 169 | 166 | 
		_data[i] = p;  | 
| 170 | 167 | 
		_iim.set(p.first, i);  | 
| 171 | 168 | 
		}  | 
| 172 | 169 | 
		 | 
| 173 | 170 | 
		public:  | 
| 171 | 
		 | 
|
| 174 | 172 | 
		/// \brief Insert a pair of item and priority into the heap.  | 
| 175 | 173 | 
		///  | 
| 176 | 
		///  | 
|
| 174 | 
		/// This function inserts \c p.first to the heap with priority  | 
|
| 175 | 
		/// \c p.second.  | 
|
| 177 | 176 | 
		/// \param p The pair to insert.  | 
| 177 | 
		/// \pre \c p.first must not be stored in the heap.  | 
|
| 178 | 178 | 
		    void push(const Pair &p) {
	 | 
| 179 | 179 | 
		int n = _data.size();  | 
| 180 | 180 | 
		_data.resize(n+1);  | 
| 181 | 
		
  | 
|
| 181 | 
		bubbleUp(n, p);  | 
|
| 182 | 182 | 
		}  | 
| 183 | 183 | 
		 | 
| 184 | 
		/// \brief Insert an item into the heap with the given  | 
|
| 184 | 
		/// \brief Insert an item into the heap with the given priority.  | 
|
| 185 | 185 | 
		///  | 
| 186 | 
		///  | 
|
| 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  | 
|
| 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 | 
		///  | 
|
| 195 | 
		/// This function returns the item having minimum priority.  | 
|
| 196 | 
		/// \pre The heap must be non-empty.  | 
|
| 196 | 197 | 
		    Item top() const {
	 | 
| 197 | 198 | 
		return _data[0].first;  | 
| 198 | 199 | 
		}  | 
| 199 | 200 | 
		 | 
| 200 | 
		/// \brief  | 
|
| 201 | 
		/// \brief The minimum priority.  | 
|
| 201 | 202 | 
		///  | 
| 202 | 
		/// It returns the minimum priority relative to \c Compare.  | 
|
| 203 | 
		/// \pre The heap must be nonempty.  | 
|
| 203 | 
		/// This function returns the minimum priority.  | 
|
| 204 | 
		/// \pre The heap must be non-empty.  | 
|
| 204 | 205 | 
		    Prio prio() const {
	 | 
| 205 | 206 | 
		return _data[0].second;  | 
| 206 | 207 | 
		}  | 
| 207 | 208 | 
		 | 
| 208 | 
		/// \brief  | 
|
| 209 | 
		/// \brief Remove the item having minimum priority.  | 
|
| 209 | 210 | 
		///  | 
| 210 | 
		/// This method deletes the item with minimum priority relative to \c  | 
|
| 211 | 
		/// Compare from the heap.  | 
|
| 211 | 
		/// This function removes the item having minimum priority.  | 
|
| 212 | 212 | 
		/// \pre The heap must be non-empty.  | 
| 213 | 213 | 
		    void pop() {
	 | 
| 214 | 214 | 
		int n = _data.size()-1;  | 
| 215 | 215 | 
		_iim.set(_data[0].first, POST_HEAP);  | 
| 216 | 216 | 
		      if (n > 0) {
	 | 
| 217 | 
		
  | 
|
| 217 | 
		bubbleDown(0, _data[n], n);  | 
|
| 218 | 218 | 
		}  | 
| 219 | 219 | 
		_data.pop_back();  | 
| 220 | 220 | 
		}  | 
| 221 | 221 | 
		 | 
| 222 | 
		/// \brief  | 
|
| 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 | 
		///  | 
|
| 224 | 
		/// This function removes the given item from the heap if it is  | 
|
| 225 | 
		/// already stored.  | 
|
| 226 | 
		/// \param i The item to delete.  | 
|
| 227 | 
		/// \pre \e i must be in the heap.  | 
|
| 227 | 228 | 
		    void erase(const Item &i) {
	 | 
| 228 | 229 | 
		int h = _iim[i];  | 
| 229 | 230 | 
		int n = _data.size()-1;  | 
| 230 | 231 | 
		_iim.set(_data[h].first, POST_HEAP);  | 
| 231 | 232 | 
		      if( h < n ) {
	 | 
| 232 | 
		        if ( bubble_up(h, _data[n]) == h) {
	 | 
|
| 233 | 
		bubble_down(h, _data[n], n);  | 
|
| 233 | 
		        if ( bubbleUp(h, _data[n]) == h) {
	 | 
|
| 234 | 
		bubbleDown(h, _data[n], n);  | 
|
| 234 | 235 | 
		}  | 
| 235 | 236 | 
		}  | 
| 236 | 237 | 
		_data.pop_back();  | 
| 237 | 238 | 
		}  | 
| 238 | 239 | 
		 | 
| 239 | 
		 | 
|
| 240 | 
		/// \brief Returns the priority of \c i.  | 
|
| 240 | 
		/// \brief The priority of the given item.  | 
|
| 241 | 241 | 
		///  | 
| 242 | 
		/// This function returns the priority of  | 
|
| 242 | 
		/// This function returns the priority of the given item.  | 
|
| 243 | 243 | 
		/// \param i The item.  | 
| 244 | 
		/// \pre \  | 
|
| 244 | 
		/// \pre \e i must be in the heap.  | 
|
| 245 | 245 | 
		    Prio operator[](const Item &i) const {
	 | 
| 246 | 246 | 
		int idx = _iim[i];  | 
| 247 | 247 | 
		return _data[idx].second;  | 
| 248 | 248 | 
		}  | 
| 249 | 249 | 
		 | 
| 250 | 
		/// \brief \c i gets to the heap with priority \c p independently  | 
|
| 251 | 
		/// if \c i was already there.  | 
|
| 250 | 
		/// \brief Set the priority of an item or insert it, if it is  | 
|
| 251 | 
		/// not stored in the heap.  | 
|
| 252 | 252 | 
		///  | 
| 253 | 
		/// This method calls \ref push(\c i, \c p) if \c i is not stored  | 
|
| 254 | 
		/// in the heap and sets the priority of \c i to \c p otherwise.  | 
|
| 253 | 
		/// This method sets the priority of the given item if it is  | 
|
| 254 | 
		/// already stored in the heap. Otherwise it inserts the given  | 
|
| 255 | 
		/// item into the heap with the given priority.  | 
|
| 255 | 256 | 
		/// \param i The item.  | 
| 256 | 257 | 
		/// \param p The priority.  | 
| 257 | 258 | 
		    void set(const Item &i, const Prio &p) {
	 | 
| 258 | 259 | 
		int idx = _iim[i];  | 
| 259 | 260 | 
		      if( idx < 0 ) {
	 | 
| 260 | 261 | 
		push(i,p);  | 
| 261 | 262 | 
		}  | 
| 262 | 263 | 
		      else if( _comp(p, _data[idx].second) ) {
	 | 
| 263 | 
		
  | 
|
| 264 | 
		bubbleUp(idx, Pair(i,p));  | 
|
| 264 | 265 | 
		}  | 
| 265 | 266 | 
		      else {
	 | 
| 266 | 
		
  | 
|
| 267 | 
		bubbleDown(idx, Pair(i,p), _data.size());  | 
|
| 267 | 268 | 
		}  | 
| 268 | 269 | 
		}  | 
| 269 | 270 | 
		 | 
| 270 | 
		/// \brief  | 
|
| 271 | 
		/// \brief Decrease the priority of an item to the given value.  | 
|
| 271 | 272 | 
		///  | 
| 272 | 
		/// This  | 
|
| 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 | 
		
  | 
|
| 279 | 
		bubbleUp(idx, Pair(i,p));  | 
|
| 280 | 280 | 
		}  | 
| 281 | 281 | 
		 | 
| 282 | 
		/// \brief  | 
|
| 282 | 
		/// \brief Increase the priority of an item to the given value.  | 
|
| 283 | 283 | 
		///  | 
| 284 | 
		/// This  | 
|
| 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 | 
		
  | 
|
| 290 | 
		bubbleDown(idx, Pair(i,p), _data.size());  | 
|
| 292 | 291 | 
		}  | 
| 293 | 292 | 
		 | 
| 294 | 
		/// \brief Returns if \c item is in, has already been in, or has  | 
|
| 295 | 
		/// never been in the heap.  | 
|
| 293 | 
		/// \brief Return the state of an item.  | 
|
| 296 | 294 | 
		///  | 
| 297 | 
		/// This method returns PRE_HEAP if \c item has never been in the  | 
|
| 298 | 
		/// heap, IN_HEAP if it is in the heap at the moment, and POST_HEAP  | 
|
| 299 | 
		/// otherwise. In the latter case it is possible that \c item will  | 
|
| 300 | 
		/// get back to the heap again.  | 
|
| 295 | 
		/// This method returns \c PRE_HEAP if the given item has never  | 
|
| 296 | 
		/// been in the heap, \c IN_HEAP if it is in the heap at the moment,  | 
|
| 297 | 
		/// and \c POST_HEAP otherwise.  | 
|
| 298 | 
		/// In the latter case it is possible that the item will get back  | 
|
| 299 | 
		/// to the heap again.  | 
|
| 301 | 300 | 
		/// \param i The item.  | 
| 302 | 301 | 
		    State state(const Item &i) const {
	 | 
| 303 | 302 | 
		int s = _iim[i];  | 
| 304 | 303 | 
		if( s>=0 )  | 
| 305 | 304 | 
		s=0;  | 
| 306 | 305 | 
		return State(s);  | 
| 307 | 306 | 
		}  | 
| 308 | 307 | 
		 | 
| 309 | 
		/// \brief  | 
|
| 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 | 
		///  | 
|
| 310 | 
		/// This function sets the state of the given item in the heap.  | 
|
| 311 | 
		/// It can be used to manually clear the heap when it is important  | 
|
| 312 | 
		/// to achive better time complexity.  | 
|
| 314 | 313 | 
		/// \param i The item.  | 
| 315 | 314 | 
		/// \param st The state. It should not be \c IN_HEAP.  | 
| 316 | 315 | 
		    void state(const Item& i, State st) {
	 | 
| 317 | 316 | 
		      switch (st) {
	 | 
| 318 | 317 | 
		case POST_HEAP:  | 
| 319 | 318 | 
		case PRE_HEAP:  | 
| 320 | 319 | 
		        if (state(i) == IN_HEAP) {
	 | 
| 321 | 320 | 
		erase(i);  | 
| 322 | 321 | 
		}  | 
| 323 | 322 | 
		_iim[i] = st;  | 
| 324 | 323 | 
		break;  | 
| 325 | 324 | 
		case IN_HEAP:  | 
| 326 | 325 | 
		break;  | 
| 327 | 326 | 
		}  | 
| 328 | 327 | 
		}  | 
| 329 | 328 | 
		 | 
| 330 | 
		/// \brief  | 
|
| 329 | 
		/// \brief Replace an item in the heap.  | 
|
| 331 | 330 | 
		///  | 
| 332 | 
		/// The \c i item is replaced with \c j item. The \c i item should  | 
|
| 333 | 
		/// be in the heap, while the \c j should be out of the heap. The  | 
|
| 334 | 
		/// \c i item will out of the heap and \c j will be in the heap  | 
|
| 335 | 
		/// with the same prioriority as prevoiusly the \c i item.  | 
|
| 331 | 
		/// This function replaces item \c i with item \c j.  | 
|
| 332 | 
		/// Item \c i must be in the heap, while \c j must be out of the heap.  | 
|
| 333 | 
		/// After calling this method, item \c i will be out of the  | 
|
| 334 | 
		/// heap and \c j will be in the heap with the same prioriority  | 
|
| 335 | 
		/// as item \c i had before.  | 
|
| 336 | 336 | 
		    void replace(const Item& i, const Item& j) {
	 | 
| 337 | 337 | 
		int idx = _iim[i];  | 
| 338 | 338 | 
		_iim.set(i, _iim[j]);  | 
| 339 | 339 | 
		_iim.set(j, idx);  | 
| 340 | 340 | 
		_data[idx].first = j;  | 
| 341 | 341 | 
		}  | 
| 342 | 342 | 
		 | 
| 343 | 343 | 
		}; // class BinHeap  | 
| 344 | 344 | 
		 | 
| 345 | 345 | 
		} // namespace lemon  | 
| 346 | 346 | 
		 | 
| 347 | 347 | 
		#endif // LEMON_BIN_HEAP_H  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -61,25 +61,25 @@  | 
| 61 | 61 | 
		// The const reference type of the map.  | 
| 62 | 62 | 
		typedef const _Value& ConstReference;  | 
| 63 | 63 | 
		// The reference type of the map.  | 
| 64 | 64 | 
		typedef _Value& Reference;  | 
| 65 | 65 | 
		 | 
| 66 | 66 | 
		// The map type.  | 
| 67 | 67 | 
		typedef ArrayMap Map;  | 
| 68 | 68 | 
		 | 
| 69 | 69 | 
		// The notifier type.  | 
| 70 | 70 | 
		typedef typename ItemSetTraits<_Graph, _Item>::ItemNotifier Notifier;  | 
| 71 | 71 | 
		 | 
| 72 | 72 | 
		private:  | 
| 73 | 
		 | 
|
| 73 | 
		 | 
|
| 74 | 74 | 
		// The MapBase of the Map which imlements the core regisitry function.  | 
| 75 | 75 | 
		typedef typename Notifier::ObserverBase Parent;  | 
| 76 | 76 | 
		 | 
| 77 | 77 | 
		typedef std::allocator<Value> Allocator;  | 
| 78 | 78 | 
		 | 
| 79 | 79 | 
		public:  | 
| 80 | 80 | 
		 | 
| 81 | 81 | 
		// \brief Graph initialized map constructor.  | 
| 82 | 82 | 
		//  | 
| 83 | 83 | 
		// Graph initialized map constructor.  | 
| 84 | 84 | 
		    explicit ArrayMap(const GraphType& graph) {
	 | 
| 85 | 85 | 
		Parent::attach(graph.notifier(Item()));  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -148,25 +148,25 @@  | 
| 148 | 148 | 
		// };  | 
| 149 | 149 | 
		 | 
| 150 | 150 | 
		// #endif  | 
| 151 | 151 | 
		 | 
| 152 | 152 | 
		// DefaultMap class  | 
| 153 | 153 | 
		template <typename _Graph, typename _Item, typename _Value>  | 
| 154 | 154 | 
		class DefaultMap  | 
| 155 | 155 | 
		    : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
	 | 
| 156 | 156 | 
		typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;  | 
| 157 | 157 | 
		 | 
| 158 | 158 | 
		public:  | 
| 159 | 159 | 
		typedef DefaultMap<_Graph, _Item, _Value> Map;  | 
| 160 | 
		 | 
|
| 160 | 
		 | 
|
| 161 | 161 | 
		typedef typename Parent::GraphType GraphType;  | 
| 162 | 162 | 
		typedef typename Parent::Value Value;  | 
| 163 | 163 | 
		 | 
| 164 | 164 | 
		    explicit DefaultMap(const GraphType& graph) : Parent(graph) {}
	 | 
| 165 | 165 | 
		DefaultMap(const GraphType& graph, const Value& value)  | 
| 166 | 166 | 
		      : Parent(graph, value) {}
	 | 
| 167 | 167 | 
		 | 
| 168 | 168 | 
		    DefaultMap& operator=(const DefaultMap& cmap) {
	 | 
| 169 | 169 | 
		return operator=<DefaultMap>(cmap);  | 
| 170 | 170 | 
		}  | 
| 171 | 171 | 
		 | 
| 172 | 172 | 
		template <typename CMap>  | 
| 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-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -54,141 +54,141 @@  | 
| 54 | 54 | 
		}  | 
| 55 | 55 | 
		 | 
| 56 | 56 | 
		    Node fromId(int id, Node) const {
	 | 
| 57 | 57 | 
		return Parent::nodeFromId(id);  | 
| 58 | 58 | 
		}  | 
| 59 | 59 | 
		 | 
| 60 | 60 | 
		    Arc fromId(int id, Arc) const {
	 | 
| 61 | 61 | 
		return Parent::arcFromId(id);  | 
| 62 | 62 | 
		}  | 
| 63 | 63 | 
		 | 
| 64 | 64 | 
		    Node oppositeNode(const Node &n, const Arc &e) const {
	 | 
| 65 | 65 | 
		if (n == Parent::source(e))  | 
| 66 | 
		
  | 
|
| 66 | 
		return Parent::target(e);  | 
|
| 67 | 67 | 
		else if(n==Parent::target(e))  | 
| 68 | 
		
  | 
|
| 68 | 
		return Parent::source(e);  | 
|
| 69 | 69 | 
		else  | 
| 70 | 
		
  | 
|
| 70 | 
		return INVALID;  | 
|
| 71 | 71 | 
		}  | 
| 72 | 72 | 
		 | 
| 73 | 73 | 
		 | 
| 74 | 74 | 
		// Alteration notifier extensions  | 
| 75 | 75 | 
		 | 
| 76 | 76 | 
		// The arc observer registry.  | 
| 77 | 77 | 
		typedef AlterationNotifier<ArcSetExtender, Arc> ArcNotifier;  | 
| 78 | 78 | 
		 | 
| 79 | 79 | 
		protected:  | 
| 80 | 80 | 
		 | 
| 81 | 81 | 
		mutable ArcNotifier arc_notifier;  | 
| 82 | 82 | 
		 | 
| 83 | 83 | 
		public:  | 
| 84 | 84 | 
		 | 
| 85 | 85 | 
		using Parent::notifier;  | 
| 86 | 86 | 
		 | 
| 87 | 87 | 
		// Gives back the arc alteration notifier.  | 
| 88 | 88 | 
		    ArcNotifier& notifier(Arc) const {
	 | 
| 89 | 89 | 
		return arc_notifier;  | 
| 90 | 90 | 
		}  | 
| 91 | 91 | 
		 | 
| 92 | 92 | 
		// Iterable extensions  | 
| 93 | 93 | 
		 | 
| 94 | 
		    class NodeIt : public Node {
	 | 
|
| 94 | 
		    class NodeIt : public Node {
	 | 
|
| 95 | 95 | 
		const Digraph* digraph;  | 
| 96 | 96 | 
		public:  | 
| 97 | 97 | 
		 | 
| 98 | 98 | 
		      NodeIt() {}
	 | 
| 99 | 99 | 
		 | 
| 100 | 100 | 
		      NodeIt(Invalid i) : Node(i) { }
	 | 
| 101 | 101 | 
		 | 
| 102 | 102 | 
		      explicit NodeIt(const Digraph& _graph) : digraph(&_graph) {
	 | 
| 103 | 
		
  | 
|
| 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 | 
		
  | 
|
| 109 | 
		      NodeIt& operator++() {
	 | 
|
| 110 | 
		digraph->next(*this);  | 
|
| 111 | 
		return *this;  | 
|
| 112 | 112 | 
		}  | 
| 113 | 113 | 
		 | 
| 114 | 114 | 
		};  | 
| 115 | 115 | 
		 | 
| 116 | 116 | 
		 | 
| 117 | 
		    class ArcIt : public Arc {
	 | 
|
| 117 | 
		    class ArcIt : public Arc {
	 | 
|
| 118 | 118 | 
		const Digraph* digraph;  | 
| 119 | 119 | 
		public:  | 
| 120 | 120 | 
		 | 
| 121 | 121 | 
		      ArcIt() { }
	 | 
| 122 | 122 | 
		 | 
| 123 | 123 | 
		      ArcIt(Invalid i) : Arc(i) { }
	 | 
| 124 | 124 | 
		 | 
| 125 | 125 | 
		      explicit ArcIt(const Digraph& _graph) : digraph(&_graph) {
	 | 
| 126 | 
		
  | 
|
| 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 | 
		
  | 
|
| 132 | 
		      ArcIt& operator++() {
	 | 
|
| 133 | 
		digraph->next(*this);  | 
|
| 134 | 
		return *this;  | 
|
| 135 | 135 | 
		}  | 
| 136 | 136 | 
		 | 
| 137 | 137 | 
		};  | 
| 138 | 138 | 
		 | 
| 139 | 139 | 
		 | 
| 140 | 
		    class OutArcIt : public Arc {
	 | 
|
| 140 | 
		    class OutArcIt : public Arc {
	 | 
|
| 141 | 141 | 
		const Digraph* digraph;  | 
| 142 | 142 | 
		public:  | 
| 143 | 143 | 
		 | 
| 144 | 144 | 
		      OutArcIt() { }
	 | 
| 145 | 145 | 
		 | 
| 146 | 146 | 
		      OutArcIt(Invalid i) : Arc(i) { }
	 | 
| 147 | 147 | 
		 | 
| 148 | 
		OutArcIt(const Digraph& _graph, const Node& node)  | 
|
| 149 | 
			: digraph(&_graph) {
	 | 
|
| 150 | 
		
  | 
|
| 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 | 
		
  | 
|
| 156 | 
		      OutArcIt& operator++() {
	 | 
|
| 157 | 
		digraph->nextOut(*this);  | 
|
| 158 | 
		return *this;  | 
|
| 159 | 159 | 
		}  | 
| 160 | 160 | 
		 | 
| 161 | 161 | 
		};  | 
| 162 | 162 | 
		 | 
| 163 | 163 | 
		 | 
| 164 | 
		    class InArcIt : public Arc {
	 | 
|
| 164 | 
		    class InArcIt : public Arc {
	 | 
|
| 165 | 165 | 
		const Digraph* digraph;  | 
| 166 | 166 | 
		public:  | 
| 167 | 167 | 
		 | 
| 168 | 168 | 
		      InArcIt() { }
	 | 
| 169 | 169 | 
		 | 
| 170 | 170 | 
		      InArcIt(Invalid i) : Arc(i) { }
	 | 
| 171 | 171 | 
		 | 
| 172 | 
		InArcIt(const Digraph& _graph, const Node& node)  | 
|
| 173 | 
			: digraph(&_graph) {
	 | 
|
| 174 | 
		
  | 
|
| 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 | 
		
  | 
|
| 180 | 
		      InArcIt& operator++() {
	 | 
|
| 181 | 
		digraph->nextIn(*this);  | 
|
| 182 | 
		return *this;  | 
|
| 183 | 183 | 
		}  | 
| 184 | 184 | 
		 | 
| 185 | 185 | 
		};  | 
| 186 | 186 | 
		 | 
| 187 | 187 | 
		// \brief Base node of the iterator  | 
| 188 | 188 | 
		//  | 
| 189 | 189 | 
		// Returns the base node (ie. the source in this case) of the iterator  | 
| 190 | 190 | 
		    Node baseNode(const OutArcIt &e) const {
	 | 
| 191 | 191 | 
		return Parent::source(static_cast<const Arc&>(e));  | 
| 192 | 192 | 
		}  | 
| 193 | 193 | 
		// \brief Running node of the iterator  | 
| 194 | 194 | 
		//  | 
| ... | ... | 
		@@ -206,57 +206,57 @@  | 
| 206 | 206 | 
		}  | 
| 207 | 207 | 
		// \brief Running node of the iterator  | 
| 208 | 208 | 
		//  | 
| 209 | 209 | 
		// Returns the running node (ie. the source in this case) of the  | 
| 210 | 210 | 
		// iterator  | 
| 211 | 211 | 
		    Node runningNode(const InArcIt &e) const {
	 | 
| 212 | 212 | 
		return Parent::source(static_cast<const Arc&>(e));  | 
| 213 | 213 | 
		}  | 
| 214 | 214 | 
		 | 
| 215 | 215 | 
		using Parent::first;  | 
| 216 | 216 | 
		 | 
| 217 | 217 | 
		// Mappable extension  | 
| 218 | 
		 | 
|
| 218 | 
		 | 
|
| 219 | 219 | 
		template <typename _Value>  | 
| 220 | 
		class ArcMap  | 
|
| 220 | 
		class ArcMap  | 
|
| 221 | 221 | 
		      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
	 | 
| 222 | 222 | 
		typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;  | 
| 223 | 223 | 
		 | 
| 224 | 224 | 
		public:  | 
| 225 | 
		explicit ArcMap(const Digraph& _g)  | 
|
| 226 | 
			: Parent(_g) {}
	 | 
|
| 227 | 
		ArcMap(const Digraph& _g, const _Value& _v)  | 
|
| 228 | 
			: Parent(_g, _v) {}
	 | 
|
| 225 | 
		explicit ArcMap(const Digraph& _g)  | 
|
| 226 | 
		        : Parent(_g) {}
	 | 
|
| 227 | 
		ArcMap(const Digraph& _g, const _Value& _v)  | 
|
| 228 | 
		        : Parent(_g, _v) {}
	 | 
|
| 229 | 229 | 
		 | 
| 230 | 230 | 
		      ArcMap& operator=(const ArcMap& cmap) {
	 | 
| 231 | 
		
  | 
|
| 231 | 
		return operator=<ArcMap>(cmap);  | 
|
| 232 | 232 | 
		}  | 
| 233 | 233 | 
		 | 
| 234 | 234 | 
		template <typename CMap>  | 
| 235 | 235 | 
		      ArcMap& operator=(const CMap& cmap) {
	 | 
| 236 | 236 | 
		Parent::operator=(cmap);  | 
| 237 | 
		
  | 
|
| 237 | 
		return *this;  | 
|
| 238 | 238 | 
		}  | 
| 239 | 239 | 
		 | 
| 240 | 240 | 
		};  | 
| 241 | 241 | 
		 | 
| 242 | 242 | 
		 | 
| 243 | 243 | 
		// Alteration extension  | 
| 244 | 244 | 
		 | 
| 245 | 245 | 
		    Arc addArc(const Node& from, const Node& to) {
	 | 
| 246 | 246 | 
		Arc arc = Parent::addArc(from, to);  | 
| 247 | 247 | 
		notifier(Arc()).add(arc);  | 
| 248 | 248 | 
		return arc;  | 
| 249 | 249 | 
		}  | 
| 250 | 
		 | 
|
| 250 | 
		 | 
|
| 251 | 251 | 
		    void clear() {
	 | 
| 252 | 252 | 
		notifier(Arc()).clear();  | 
| 253 | 253 | 
		Parent::clear();  | 
| 254 | 254 | 
		}  | 
| 255 | 255 | 
		 | 
| 256 | 256 | 
		    void erase(const Arc& arc) {
	 | 
| 257 | 257 | 
		notifier(Arc()).erase(arc);  | 
| 258 | 258 | 
		Parent::erase(arc);  | 
| 259 | 259 | 
		}  | 
| 260 | 260 | 
		 | 
| 261 | 261 | 
		    ArcSetExtender() {
	 | 
| 262 | 262 | 
		arc_notifier.setContainer(*this);  | 
| ... | ... | 
		@@ -303,200 +303,200 @@  | 
| 303 | 303 | 
		}  | 
| 304 | 304 | 
		 | 
| 305 | 305 | 
		    Arc fromId(int id, Arc) const {
	 | 
| 306 | 306 | 
		return Parent::arcFromId(id);  | 
| 307 | 307 | 
		}  | 
| 308 | 308 | 
		 | 
| 309 | 309 | 
		    Edge fromId(int id, Edge) const {
	 | 
| 310 | 310 | 
		return Parent::edgeFromId(id);  | 
| 311 | 311 | 
		}  | 
| 312 | 312 | 
		 | 
| 313 | 313 | 
		    Node oppositeNode(const Node &n, const Edge &e) const {
	 | 
| 314 | 314 | 
		if( n == Parent::u(e))  | 
| 315 | 
		
  | 
|
| 315 | 
		return Parent::v(e);  | 
|
| 316 | 316 | 
		else if( n == Parent::v(e))  | 
| 317 | 
		
  | 
|
| 317 | 
		return Parent::u(e);  | 
|
| 318 | 318 | 
		else  | 
| 319 | 
		
  | 
|
| 319 | 
		return INVALID;  | 
|
| 320 | 320 | 
		}  | 
| 321 | 321 | 
		 | 
| 322 | 322 | 
		    Arc oppositeArc(const Arc &e) const {
	 | 
| 323 | 323 | 
		return Parent::direct(e, !Parent::direction(e));  | 
| 324 | 324 | 
		}  | 
| 325 | 325 | 
		 | 
| 326 | 326 | 
		using Parent::direct;  | 
| 327 | 327 | 
		    Arc direct(const Edge &e, const Node &s) const {
	 | 
| 328 | 328 | 
		return Parent::direct(e, Parent::u(e) == s);  | 
| 329 | 329 | 
		}  | 
| 330 | 330 | 
		 | 
| 331 | 331 | 
		typedef AlterationNotifier<EdgeSetExtender, Arc> ArcNotifier;  | 
| 332 | 332 | 
		typedef AlterationNotifier<EdgeSetExtender, Edge> EdgeNotifier;  | 
| 333 | 333 | 
		 | 
| 334 | 334 | 
		 | 
| 335 | 335 | 
		protected:  | 
| 336 | 336 | 
		 | 
| 337 | 337 | 
		mutable ArcNotifier arc_notifier;  | 
| 338 | 338 | 
		mutable EdgeNotifier edge_notifier;  | 
| 339 | 339 | 
		 | 
| 340 | 340 | 
		public:  | 
| 341 | 341 | 
		 | 
| 342 | 342 | 
		using Parent::notifier;  | 
| 343 | 
		 | 
|
| 343 | 
		 | 
|
| 344 | 344 | 
		    ArcNotifier& notifier(Arc) const {
	 | 
| 345 | 345 | 
		return arc_notifier;  | 
| 346 | 346 | 
		}  | 
| 347 | 347 | 
		 | 
| 348 | 348 | 
		    EdgeNotifier& notifier(Edge) const {
	 | 
| 349 | 349 | 
		return edge_notifier;  | 
| 350 | 350 | 
		}  | 
| 351 | 351 | 
		 | 
| 352 | 352 | 
		 | 
| 353 | 
		    class NodeIt : public Node {
	 | 
|
| 353 | 
		    class NodeIt : public Node {
	 | 
|
| 354 | 354 | 
		const Graph* graph;  | 
| 355 | 355 | 
		public:  | 
| 356 | 356 | 
		 | 
| 357 | 357 | 
		      NodeIt() {}
	 | 
| 358 | 358 | 
		 | 
| 359 | 359 | 
		      NodeIt(Invalid i) : Node(i) { }
	 | 
| 360 | 360 | 
		 | 
| 361 | 361 | 
		      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
	 | 
| 362 | 
		
  | 
|
| 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 | 
		
  | 
|
| 368 | 
		      NodeIt& operator++() {
	 | 
|
| 369 | 
		graph->next(*this);  | 
|
| 370 | 
		return *this;  | 
|
| 371 | 371 | 
		}  | 
| 372 | 372 | 
		 | 
| 373 | 373 | 
		};  | 
| 374 | 374 | 
		 | 
| 375 | 375 | 
		 | 
| 376 | 
		    class ArcIt : public Arc {
	 | 
|
| 376 | 
		    class ArcIt : public Arc {
	 | 
|
| 377 | 377 | 
		const Graph* graph;  | 
| 378 | 378 | 
		public:  | 
| 379 | 379 | 
		 | 
| 380 | 380 | 
		      ArcIt() { }
	 | 
| 381 | 381 | 
		 | 
| 382 | 382 | 
		      ArcIt(Invalid i) : Arc(i) { }
	 | 
| 383 | 383 | 
		 | 
| 384 | 384 | 
		      explicit ArcIt(const Graph& _graph) : graph(&_graph) {
	 | 
| 385 | 
		
  | 
|
| 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 | 
		
  | 
|
| 391 | 
		      ArcIt& operator++() {
	 | 
|
| 392 | 
		graph->next(*this);  | 
|
| 393 | 
		return *this;  | 
|
| 394 | 394 | 
		}  | 
| 395 | 395 | 
		 | 
| 396 | 396 | 
		};  | 
| 397 | 397 | 
		 | 
| 398 | 398 | 
		 | 
| 399 | 
		    class OutArcIt : public Arc {
	 | 
|
| 399 | 
		    class OutArcIt : public Arc {
	 | 
|
| 400 | 400 | 
		const Graph* graph;  | 
| 401 | 401 | 
		public:  | 
| 402 | 402 | 
		 | 
| 403 | 403 | 
		      OutArcIt() { }
	 | 
| 404 | 404 | 
		 | 
| 405 | 405 | 
		      OutArcIt(Invalid i) : Arc(i) { }
	 | 
| 406 | 406 | 
		 | 
| 407 | 
		OutArcIt(const Graph& _graph, const Node& node)  | 
|
| 408 | 
			: graph(&_graph) {
	 | 
|
| 409 | 
		
  | 
|
| 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 | 
		
  | 
|
| 415 | 
		      OutArcIt& operator++() {
	 | 
|
| 416 | 
		graph->nextOut(*this);  | 
|
| 417 | 
		return *this;  | 
|
| 418 | 418 | 
		}  | 
| 419 | 419 | 
		 | 
| 420 | 420 | 
		};  | 
| 421 | 421 | 
		 | 
| 422 | 422 | 
		 | 
| 423 | 
		    class InArcIt : public Arc {
	 | 
|
| 423 | 
		    class InArcIt : public Arc {
	 | 
|
| 424 | 424 | 
		const Graph* graph;  | 
| 425 | 425 | 
		public:  | 
| 426 | 426 | 
		 | 
| 427 | 427 | 
		      InArcIt() { }
	 | 
| 428 | 428 | 
		 | 
| 429 | 429 | 
		      InArcIt(Invalid i) : Arc(i) { }
	 | 
| 430 | 430 | 
		 | 
| 431 | 
		InArcIt(const Graph& _graph, const Node& node)  | 
|
| 432 | 
			: graph(&_graph) {
	 | 
|
| 433 | 
		
  | 
|
| 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 | 
		
  | 
|
| 439 | 
		      InArcIt& operator++() {
	 | 
|
| 440 | 
		graph->nextIn(*this);  | 
|
| 441 | 
		return *this;  | 
|
| 442 | 442 | 
		}  | 
| 443 | 443 | 
		 | 
| 444 | 444 | 
		};  | 
| 445 | 445 | 
		 | 
| 446 | 446 | 
		 | 
| 447 | 
		    class EdgeIt : public Parent::Edge {
	 | 
|
| 447 | 
		    class EdgeIt : public Parent::Edge {
	 | 
|
| 448 | 448 | 
		const Graph* graph;  | 
| 449 | 449 | 
		public:  | 
| 450 | 450 | 
		 | 
| 451 | 451 | 
		      EdgeIt() { }
	 | 
| 452 | 452 | 
		 | 
| 453 | 453 | 
		      EdgeIt(Invalid i) : Edge(i) { }
	 | 
| 454 | 454 | 
		 | 
| 455 | 455 | 
		      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
	 | 
| 456 | 
		
  | 
|
| 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 | 
		
  | 
|
| 462 | 
		      EdgeIt& operator++() {
	 | 
|
| 463 | 
		graph->next(*this);  | 
|
| 464 | 
		return *this;  | 
|
| 465 | 465 | 
		}  | 
| 466 | 466 | 
		 | 
| 467 | 467 | 
		};  | 
| 468 | 468 | 
		 | 
| 469 | 469 | 
		    class IncEdgeIt : public Parent::Edge {
	 | 
| 470 | 470 | 
		friend class EdgeSetExtender;  | 
| 471 | 471 | 
		const Graph* graph;  | 
| 472 | 472 | 
		bool direction;  | 
| 473 | 473 | 
		public:  | 
| 474 | 474 | 
		 | 
| 475 | 475 | 
		      IncEdgeIt() { }
	 | 
| 476 | 476 | 
		 | 
| 477 | 477 | 
		      IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
	 | 
| 478 | 478 | 
		 | 
| 479 | 479 | 
		      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
	 | 
| 480 | 
		
  | 
|
| 480 | 
		_graph.firstInc(*this, direction, n);  | 
|
| 481 | 481 | 
		}  | 
| 482 | 482 | 
		 | 
| 483 | 483 | 
		IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n)  | 
| 484 | 
			: graph(&_graph), Edge(ue) {
	 | 
|
| 485 | 
		direction = (_graph.source(ue) == n);  | 
|
| 484 | 
		        : graph(&_graph), Edge(ue) {
	 | 
|
| 485 | 
		direction = (_graph.source(ue) == n);  | 
|
| 486 | 486 | 
		}  | 
| 487 | 487 | 
		 | 
| 488 | 488 | 
		      IncEdgeIt& operator++() {
	 | 
| 489 | 
		graph->nextInc(*this, direction);  | 
|
| 490 | 
		return *this;  | 
|
| 489 | 
		graph->nextInc(*this, direction);  | 
|
| 490 | 
		return *this;  | 
|
| 491 | 491 | 
		}  | 
| 492 | 492 | 
		};  | 
| 493 | 493 | 
		 | 
| 494 | 494 | 
		// \brief Base node of the iterator  | 
| 495 | 495 | 
		//  | 
| 496 | 496 | 
		// Returns the base node (ie. the source in this case) of the iterator  | 
| 497 | 497 | 
		    Node baseNode(const OutArcIt &e) const {
	 | 
| 498 | 498 | 
		return Parent::source(static_cast<const Arc&>(e));  | 
| 499 | 499 | 
		}  | 
| 500 | 500 | 
		// \brief Running node of the iterator  | 
| 501 | 501 | 
		//  | 
| 502 | 502 | 
		// Returns the running node (ie. the target in this case) of the  | 
| ... | ... | 
		@@ -525,84 +525,84 @@  | 
| 525 | 525 | 
		    Node baseNode(const IncEdgeIt &e) const {
	 | 
| 526 | 526 | 
		return e.direction ? u(e) : v(e);  | 
| 527 | 527 | 
		}  | 
| 528 | 528 | 
		// Running node of the iterator  | 
| 529 | 529 | 
		//  | 
| 530 | 530 | 
		// Returns the running node of the iterator  | 
| 531 | 531 | 
		    Node runningNode(const IncEdgeIt &e) const {
	 | 
| 532 | 532 | 
		return e.direction ? v(e) : u(e);  | 
| 533 | 533 | 
		}  | 
| 534 | 534 | 
		 | 
| 535 | 535 | 
		 | 
| 536 | 536 | 
		template <typename _Value>  | 
| 537 | 
		class ArcMap  | 
|
| 537 | 
		class ArcMap  | 
|
| 538 | 538 | 
		      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
	 | 
| 539 | 539 | 
		typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;  | 
| 540 | 540 | 
		 | 
| 541 | 541 | 
		public:  | 
| 542 | 
		explicit ArcMap(const Graph& _g)  | 
|
| 543 | 
			: Parent(_g) {}
	 | 
|
| 544 | 
		ArcMap(const Graph& _g, const _Value& _v)  | 
|
| 545 | 
			: Parent(_g, _v) {}
	 | 
|
| 542 | 
		explicit ArcMap(const Graph& _g)  | 
|
| 543 | 
		        : Parent(_g) {}
	 | 
|
| 544 | 
		ArcMap(const Graph& _g, const _Value& _v)  | 
|
| 545 | 
		        : Parent(_g, _v) {}
	 | 
|
| 546 | 546 | 
		 | 
| 547 | 547 | 
		      ArcMap& operator=(const ArcMap& cmap) {
	 | 
| 548 | 
		
  | 
|
| 548 | 
		return operator=<ArcMap>(cmap);  | 
|
| 549 | 549 | 
		}  | 
| 550 | 550 | 
		 | 
| 551 | 551 | 
		template <typename CMap>  | 
| 552 | 552 | 
		      ArcMap& operator=(const CMap& cmap) {
	 | 
| 553 | 553 | 
		Parent::operator=(cmap);  | 
| 554 | 
		
  | 
|
| 554 | 
		return *this;  | 
|
| 555 | 555 | 
		}  | 
| 556 | 556 | 
		 | 
| 557 | 557 | 
		};  | 
| 558 | 558 | 
		 | 
| 559 | 559 | 
		 | 
| 560 | 560 | 
		template <typename _Value>  | 
| 561 | 
		class EdgeMap  | 
|
| 561 | 
		class EdgeMap  | 
|
| 562 | 562 | 
		      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
	 | 
| 563 | 563 | 
		typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;  | 
| 564 | 564 | 
		 | 
| 565 | 565 | 
		public:  | 
| 566 | 
		explicit EdgeMap(const Graph& _g)  | 
|
| 567 | 
			: Parent(_g) {}
	 | 
|
| 566 | 
		explicit EdgeMap(const Graph& _g)  | 
|
| 567 | 
		        : Parent(_g) {}
	 | 
|
| 568 | 568 | 
		 | 
| 569 | 
		EdgeMap(const Graph& _g, const _Value& _v)  | 
|
| 570 | 
			: Parent(_g, _v) {}
	 | 
|
| 569 | 
		EdgeMap(const Graph& _g, const _Value& _v)  | 
|
| 570 | 
		        : Parent(_g, _v) {}
	 | 
|
| 571 | 571 | 
		 | 
| 572 | 572 | 
		      EdgeMap& operator=(const EdgeMap& cmap) {
	 | 
| 573 | 
		
  | 
|
| 573 | 
		return operator=<EdgeMap>(cmap);  | 
|
| 574 | 574 | 
		}  | 
| 575 | 575 | 
		 | 
| 576 | 576 | 
		template <typename CMap>  | 
| 577 | 577 | 
		      EdgeMap& operator=(const CMap& cmap) {
	 | 
| 578 | 578 | 
		Parent::operator=(cmap);  | 
| 579 | 
		
  | 
|
| 579 | 
		return *this;  | 
|
| 580 | 580 | 
		}  | 
| 581 | 581 | 
		 | 
| 582 | 582 | 
		};  | 
| 583 | 583 | 
		 | 
| 584 | 584 | 
		 | 
| 585 | 585 | 
		// Alteration extension  | 
| 586 | 586 | 
		 | 
| 587 | 587 | 
		    Edge addEdge(const Node& from, const Node& to) {
	 | 
| 588 | 588 | 
		Edge edge = Parent::addEdge(from, to);  | 
| 589 | 589 | 
		notifier(Edge()).add(edge);  | 
| 590 | 590 | 
		std::vector<Arc> arcs;  | 
| 591 | 591 | 
		arcs.push_back(Parent::direct(edge, true));  | 
| 592 | 592 | 
		arcs.push_back(Parent::direct(edge, false));  | 
| 593 | 593 | 
		notifier(Arc()).add(arcs);  | 
| 594 | 594 | 
		return edge;  | 
| 595 | 595 | 
		}  | 
| 596 | 
		 | 
|
| 596 | 
		 | 
|
| 597 | 597 | 
		    void clear() {
	 | 
| 598 | 598 | 
		notifier(Arc()).clear();  | 
| 599 | 599 | 
		notifier(Edge()).clear();  | 
| 600 | 600 | 
		Parent::clear();  | 
| 601 | 601 | 
		}  | 
| 602 | 602 | 
		 | 
| 603 | 603 | 
		    void erase(const Edge& edge) {
	 | 
| 604 | 604 | 
		std::vector<Arc> arcs;  | 
| 605 | 605 | 
		arcs.push_back(Parent::direct(edge, true));  | 
| 606 | 606 | 
		arcs.push_back(Parent::direct(edge, false));  | 
| 607 | 607 | 
		notifier(Arc()).erase(arcs);  | 
| 608 | 608 | 
		notifier(Edge()).erase(edge);  | 
| ... | ... | 
		@@ -610,18 +610,18 @@  | 
| 610 | 610 | 
		}  | 
| 611 | 611 | 
		 | 
| 612 | 612 | 
		 | 
| 613 | 613 | 
		    EdgeSetExtender() {
	 | 
| 614 | 614 | 
		arc_notifier.setContainer(*this);  | 
| 615 | 615 | 
		edge_notifier.setContainer(*this);  | 
| 616 | 616 | 
		}  | 
| 617 | 617 | 
		 | 
| 618 | 618 | 
		    ~EdgeSetExtender() {
	 | 
| 619 | 619 | 
		edge_notifier.clear();  | 
| 620 | 620 | 
		arc_notifier.clear();  | 
| 621 | 621 | 
		}  | 
| 622 | 
		 | 
|
| 622 | 
		 | 
|
| 623 | 623 | 
		};  | 
| 624 | 624 | 
		 | 
| 625 | 625 | 
		}  | 
| 626 | 626 | 
		 | 
| 627 | 627 | 
		#endif  | 
| ... | ... | 
		@@ -47,29 +47,29 @@  | 
| 47 | 47 | 
		 | 
| 48 | 48 | 
		typedef typename Parent::Node Node;  | 
| 49 | 49 | 
		typedef typename Parent::Arc Arc;  | 
| 50 | 50 | 
		 | 
| 51 | 51 | 
		    int maxId(Node) const {
	 | 
| 52 | 52 | 
		return Parent::maxNodeId();  | 
| 53 | 53 | 
		}  | 
| 54 | 54 | 
		 | 
| 55 | 55 | 
		    int maxId(Arc) const {
	 | 
| 56 | 56 | 
		return Parent::maxArcId();  | 
| 57 | 57 | 
		}  | 
| 58 | 58 | 
		 | 
| 59 | 
		Node fromId(int id, Node)  | 
|
| 59 | 
		    static Node fromId(int id, Node) {
	 | 
|
| 60 | 60 | 
		return Parent::nodeFromId(id);  | 
| 61 | 61 | 
		}  | 
| 62 | 62 | 
		 | 
| 63 | 
		Arc fromId(int id, Arc)  | 
|
| 63 | 
		    static Arc fromId(int id, Arc) {
	 | 
|
| 64 | 64 | 
		return Parent::arcFromId(id);  | 
| 65 | 65 | 
		}  | 
| 66 | 66 | 
		 | 
| 67 | 67 | 
		    Node oppositeNode(const Node &node, const Arc &arc) const {
	 | 
| 68 | 68 | 
		if (node == Parent::source(arc))  | 
| 69 | 69 | 
		return Parent::target(arc);  | 
| 70 | 70 | 
		else if(node == Parent::target(arc))  | 
| 71 | 71 | 
		return Parent::source(arc);  | 
| 72 | 72 | 
		else  | 
| 73 | 73 | 
		return INVALID;  | 
| 74 | 74 | 
		}  | 
| 75 | 75 | 
		 | 
| ... | ... | 
		@@ -346,33 +346,33 @@  | 
| 346 | 346 | 
		    int maxId(Node) const {
	 | 
| 347 | 347 | 
		return Parent::maxNodeId();  | 
| 348 | 348 | 
		}  | 
| 349 | 349 | 
		 | 
| 350 | 350 | 
		    int maxId(Arc) const {
	 | 
| 351 | 351 | 
		return Parent::maxArcId();  | 
| 352 | 352 | 
		}  | 
| 353 | 353 | 
		 | 
| 354 | 354 | 
		    int maxId(Edge) const {
	 | 
| 355 | 355 | 
		return Parent::maxEdgeId();  | 
| 356 | 356 | 
		}  | 
| 357 | 357 | 
		 | 
| 358 | 
		Node fromId(int id, Node)  | 
|
| 358 | 
		    static Node fromId(int id, Node) {
	 | 
|
| 359 | 359 | 
		return Parent::nodeFromId(id);  | 
| 360 | 360 | 
		}  | 
| 361 | 361 | 
		 | 
| 362 | 
		Arc fromId(int id, Arc)  | 
|
| 362 | 
		    static Arc fromId(int id, Arc) {
	 | 
|
| 363 | 363 | 
		return Parent::arcFromId(id);  | 
| 364 | 364 | 
		}  | 
| 365 | 365 | 
		 | 
| 366 | 
		Edge fromId(int id, Edge)  | 
|
| 366 | 
		    static Edge fromId(int id, Edge) {
	 | 
|
| 367 | 367 | 
		return Parent::edgeFromId(id);  | 
| 368 | 368 | 
		}  | 
| 369 | 369 | 
		 | 
| 370 | 370 | 
		    Node oppositeNode(const Node &n, const Edge &e) const {
	 | 
| 371 | 371 | 
		if( n == Parent::u(e))  | 
| 372 | 372 | 
		return Parent::v(e);  | 
| 373 | 373 | 
		else if( n == Parent::v(e))  | 
| 374 | 374 | 
		return Parent::u(e);  | 
| 375 | 375 | 
		else  | 
| 376 | 376 | 
		return INVALID;  | 
| 377 | 377 | 
		}  | 
| 378 | 378 | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| 1 | 1 | 
		/* -*- mode: C++; indent-tabs-mode: nil; -*-  | 
| 2 | 2 | 
		*  | 
| 3 | 3 | 
		* This file is a part of LEMON, a generic C++ optimization library.  | 
| 4 | 4 | 
		*  | 
| 5 | 
		* Copyright (C) 2003-  | 
|
| 5 | 
		* Copyright (C) 2003-2010  | 
|
| 6 | 6 | 
		* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport  | 
| 7 | 7 | 
		* (Egervary Research Group on Combinatorial Optimization, EGRES).  | 
| 8 | 8 | 
		*  | 
| 9 | 9 | 
		* Permission to use, modify and distribute this software is granted  | 
| 10 | 10 | 
		* provided that this copyright notice appears in all copies. For  | 
| 11 | 11 | 
		* precise terms see the accompanying LICENSE file.  | 
| 12 | 12 | 
		*  | 
| 13 | 13 | 
		* This software is provided "AS IS" with no warranty of any kind,  | 
| 14 | 14 | 
		* express or implied, and with no claim as to its suitability for any  | 
| 15 | 15 | 
		* purpose.  | 
| 16 | 16 | 
		*  | 
| 17 | 17 | 
		*/  | 
| ... | ... | 
		@@ -89,25 +89,25 @@  | 
| 89 | 89 | 
		cutime=ts.tms_cutime/tck;  | 
| 90 | 90 | 
		cstime=ts.tms_cstime/tck;  | 
| 91 | 91 | 
		#endif  | 
| 92 | 92 | 
		}  | 
| 93 | 93 | 
		 | 
| 94 | 94 | 
		std::string getWinFormattedDate()  | 
| 95 | 95 | 
		    {
	 | 
| 96 | 96 | 
		std::ostringstream os;  | 
| 97 | 97 | 
		#ifdef WIN32  | 
| 98 | 98 | 
		SYSTEMTIME time;  | 
| 99 | 99 | 
		GetSystemTime(&time);  | 
| 100 | 100 | 
		char buf1[11], buf2[9], buf3[5];  | 
| 101 | 
		
  | 
|
| 101 | 
		if (GetDateFormat(MY_LOCALE, 0, &time,  | 
|
| 102 | 102 | 
		                        ("ddd MMM dd"), buf1, 11) &&
	 | 
| 103 | 103 | 
		GetTimeFormat(MY_LOCALE, 0, &time,  | 
| 104 | 104 | 
		                        ("HH':'mm':'ss"), buf2, 9) &&
	 | 
| 105 | 105 | 
		GetDateFormat(MY_LOCALE, 0, &time,  | 
| 106 | 106 | 
		                        ("yyyy"), buf3, 5)) {
	 | 
| 107 | 107 | 
		os << buf1 << ' ' << buf2 << ' ' << buf3;  | 
| 108 | 108 | 
		}  | 
| 109 | 109 | 
		else os << "unknown";  | 
| 110 | 110 | 
		#else  | 
| 111 | 111 | 
		timeval tv;  | 
| 112 | 112 | 
		gettimeofday(&tv, 0);  | 
| 113 | 113 | 
Changeset was too big and was cut off... Show full diff
0 comments (0 inline)