@@ -61,6 +61,17 @@ impl<V, E> Graph<V, E> where V: Clone {
61
61
} ) ;
62
62
self . verts [ b] . first = Some ( self . edges . len ( ) - 1 ) ;
63
63
}
64
+
65
+ pub fn adj_list ( & self , u : usize ) -> Vec < ( usize , usize ) > {
66
+ let mut adj = Vec :: new ( ) ;
67
+ let mut next_e = self . verts [ u] . first ;
68
+ while let Some ( e) = next_e {
69
+ let v = self . edges [ e ^ 1 ] . endp ;
70
+ next_e = self . edges [ e] . next ;
71
+ adj. push ( ( e, v) ) ;
72
+ }
73
+ adj
74
+ }
64
75
}
65
76
66
77
#[ derive( Clone ) ]
@@ -100,16 +111,12 @@ impl FlowGraph {
100
111
g. verts [ s] . data . lev = Some ( 0 ) ;
101
112
while let Some ( u) = q. pop_front ( ) {
102
113
g. verts [ u] . data . cur = g. verts [ u] . first ;
103
- let mut e = g. verts [ u] . first ;
104
- while let Some ( edge_id) = e {
105
- let edge = & g. edges [ edge_id] ;
106
- let rev_edge = & g. edges [ edge_id ^ 1 ] ;
107
- let v = rev_edge. endp ;
114
+ for ( e, v) in g. adj_list ( u) {
115
+ let edge = & g. edges [ e] ;
108
116
if g. verts [ v] . data . lev == None && edge. data . flow < edge. data . cap {
109
117
q. push_back ( v) ;
110
118
g. verts [ v] . data . lev = Some ( g. verts [ u] . data . lev . unwrap ( ) + 1 ) ;
111
119
}
112
- e = g. edges [ edge_id] . next ;
113
120
}
114
121
}
115
122
return g. verts [ t] . data . lev != None ;
@@ -119,20 +126,20 @@ impl FlowGraph {
119
126
if u == t { return f; }
120
127
let mut df = 0 ;
121
128
122
- while let Some ( edge_id ) = self . graph . verts [ u] . data . cur {
123
- let v = self . graph . edges [ edge_id ^ 1 ] . endp ;
129
+ while let Some ( e ) = self . graph . verts [ u] . data . cur {
130
+ let v = self . graph . edges [ e ^ 1 ] . endp ;
124
131
if let ( Some ( lu) , Some ( lv) ) = ( self . graph . verts [ u] . data . lev , self . graph . verts [ v] . data . lev ) {
125
- let rem_cap = self . graph . edges [ edge_id ] . data . cap
126
- - self . graph . edges [ edge_id ] . data . flow ;
132
+ let rem_cap = self . graph . edges [ e ] . data . cap
133
+ - self . graph . edges [ e ] . data . flow ;
127
134
if rem_cap > 0 && lv == lu + 1 {
128
135
let cf = self . dfs ( v, t, :: std:: cmp:: min ( rem_cap, f - df) ) ;
129
- self . graph . edges [ edge_id ] . data . flow += cf;
130
- self . graph . edges [ edge_id ^ 1 ] . data . flow -= cf;
136
+ self . graph . edges [ e ] . data . flow += cf;
137
+ self . graph . edges [ e ^ 1 ] . data . flow -= cf;
131
138
df += cf;
132
139
if df == f { break ; }
133
140
}
134
141
}
135
- self . graph . verts [ u] . data . cur = self . graph . edges [ edge_id ] . next ;
142
+ self . graph . verts [ u] . data . cur = self . graph . edges [ e ] . next ;
136
143
}
137
144
return df;
138
145
}
0 commit comments