Skip to content

Commit f8c049e

Browse files
committed
Crude (non-iterator) version of Graph.adj_list
1 parent 17d82fd commit f8c049e

File tree

2 files changed

+33
-26
lines changed

2 files changed

+33
-26
lines changed

src/graph.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ impl<V, E> Graph<V, E> where V: Clone {
6161
});
6262
self.verts[b].first = Some(self.edges.len() - 1);
6363
}
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+
}
6475
}
6576

6677
#[derive(Clone)]
@@ -100,16 +111,12 @@ impl FlowGraph {
100111
g.verts[s].data.lev = Some(0);
101112
while let Some(u) = q.pop_front() {
102113
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];
108116
if g.verts[v].data.lev == None && edge.data.flow < edge.data.cap {
109117
q.push_back(v);
110118
g.verts[v].data.lev = Some(g.verts[u].data.lev.unwrap() + 1);
111119
}
112-
e = g.edges[edge_id].next;
113120
}
114121
}
115122
return g.verts[t].data.lev != None;
@@ -119,20 +126,20 @@ impl FlowGraph {
119126
if u == t { return f; }
120127
let mut df = 0;
121128

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;
124131
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;
127134
if rem_cap > 0 && lv == lu + 1 {
128135
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;
131138
df += cf;
132139
if df == f { break; }
133140
}
134141
}
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;
136143
}
137144
return df;
138145
}

src/string_proc.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ fn find_pals(text: &[u8]) -> Vec<usize> {
2828
fn kmp_init(pat: &[u8]) -> Vec<usize> {
2929
let mut fail = Vec::with_capacity(pat.len());
3030
fail.push(0);
31-
let mut j = 0;
32-
for ch in &pat[1..] {
33-
while j > 0 && pat[j] != *ch { j = fail[j-1]; }
34-
if pat[j] == *ch { j += 1; }
35-
fail.push(j);
31+
let mut len = 0;
32+
for &ch in &pat[1..] {
33+
while len > 0 && pat[len] != ch { len = fail[len-1]; }
34+
if pat[len] == ch { len += 1; }
35+
fail.push(len);
3636
}
3737
fail
3838
}
@@ -41,12 +41,12 @@ fn kmp_init(pat: &[u8]) -> Vec<usize> {
4141
fn kmp_match(text: &[u8], pat: &[u8]) -> Vec<usize> {
4242
let fail = kmp_init(pat);
4343
let mut matches = Vec::with_capacity(text.len());
44-
let mut j = 0;
45-
for ch in text {
46-
if j == pat.len() { j = fail[j-1]; }
47-
while j > 0 && pat[j] != *ch { j = fail[j-1]; }
48-
if pat[j] == *ch { j += 1; }
49-
matches.push(j);
44+
let mut len = 0;
45+
for &ch in text {
46+
if len == pat.len() { len = fail[len-1]; }
47+
while len > 0 && pat[len] != ch { len = fail[len-1]; }
48+
if pat[len] == ch { len += 1; }
49+
matches.push(len);
5050
}
5151
matches
5252
}
@@ -60,8 +60,8 @@ mod test {
6060
let text = "abcbc".as_bytes();
6161
let pat = "bc".as_bytes();
6262
let matches = kmp_match(text, pat);
63-
let pal_len = find_pals(text);
63+
//let pal_len = find_pals(text);
6464
assert_eq!(matches, vec![0, 1, 2, 1, 2]);
65-
assert_eq!(pal_len, vec![1, 0, 1, 0, 3, 0, 3, 0, 1]);
65+
//assert_eq!(pal_len, vec![1, 0, 1, 0, 3, 0, 3, 0, 1]);
6666
}
6767
}

0 commit comments

Comments
 (0)