1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use cargo_snippet::snippet;
#[snippet("graph")]
pub trait Graph<'a> {
type NodeId: Copy;
type Iter: Iterator<Item = Self::NodeId>;
fn len(&self) -> usize;
fn is_empty(&self) -> bool;
fn index(&self, a: Self::NodeId) -> usize;
fn neighbors(&'a self, a: Self::NodeId) -> Self::Iter;
}
#[snippet("graph")]
pub type UnweightedGraph = Vec<Vec<usize>>;
#[snippet("graph")]
impl<'a> Graph<'a> for UnweightedGraph {
type NodeId = usize;
type Iter = std::iter::Cloned<std::slice::Iter<'a, Self::NodeId>>;
fn len(&self) -> usize {
self.len()
}
fn is_empty(&self) -> bool {
self.len() == 0
}
fn index(&self, a: Self::NodeId) -> usize {
a
}
fn neighbors(&'a self, a: Self::NodeId) -> Self::Iter {
self[a].iter().cloned()
}
}
#[snippet("graph")]
pub type WeightedVertexGraph<W> = Vec<Vec<(usize, W)>>;
#[snippet("graph")]
impl<'a, W> Graph<'a> for WeightedVertexGraph<W>
where
W: std::marker::Copy + Clone + 'a,
{
type NodeId = (usize, W);
type Iter = std::iter::Cloned<std::slice::Iter<'a, Self::NodeId>>;
fn len(&self) -> usize {
self.len()
}
fn is_empty(&self) -> bool {
self.len() == 0
}
fn index(&self, a: Self::NodeId) -> usize {
a.0
}
fn neighbors(&'a self, a: Self::NodeId) -> Self::Iter {
self[a.0].iter().cloned()
}
}