icentral_graph/
get_shortest_path.rs1crate::ix!();
2
3impl<GH> GetShortestPath for Graph<GH> {
4
5 fn get_shortest_path(&mut self,
6 src: NodeId,
7 dst: NodeId)
8 -> Result<Vec<NodeId>,BetweennessCentralityError>
9 {
10 debug!("finding the shortest path between src={} and dst={}", src, dst);
11
12 let len = self.num_nodes();
13
14 let distances_name = name![self.name(), "get_shortest_path::distances"];
15 let parent_vec_name = name![self.name(), "get_shortest_path::parent_vec"];
16
17 let mut distances = DistanceMap::new(len, distances_name);
20 let mut parent_vec = PredecessorMap::new(len, parent_vec_name);
21
22 let queue_name = name![self.name(), "get_shortest_path::queue"];
23
24 let mut queue = NodeIdQueue::empty(queue_name);
25
26 distances.set_zero_distance(dst);
27
28 queue.enqueue(dst);
29
30 while let Some(node) = queue.dequeue() {
31
32 if node == src {
33 break;
34 }
35
36 let nbr_vec = self.neighbors(node);
37
38 for &nbr_id in nbr_vec.iter() {
39
40 if distances.is_infinite(nbr_id) {
41
42 distances.set_distance_for_node(
43 nbr_id,
44 distances.distance(node) + 1.0
45 );
46
47 parent_vec.set_predecessor_for_node(nbr_id, node);
48
49 queue.enqueue(nbr_id);
50 }
51 }
52 }
53
54 let mut node_path = vec![];
56
57 let mut nd: NodeId = src;
58
59 while parent_vec.has_predecessor(nd) {
60
61 node_path.push(nd);
62
63 nd = parent_vec.predecessor_for_node(nd);
64 }
65
66 node_path.push(nd);
68
69 Ok(node_path)
70 }
71}