Skip to content

Commit d05d091

Browse files
Merge pull request wangzheng0822#376 from caitlingao/feat-rust-31-graph
Feat rust 31 graph
2 parents 3e0fdb7 + 975a61f commit d05d091

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

rust/31_graph/graph_search.rs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
use std::collections::LinkedList;
2+
use std::collections::VecDeque;
3+
4+
// 无向图
5+
#[derive(Debug)]
6+
struct Graph {
7+
v: i32,
8+
linked_vec: Vec<LinkedList<i32>>, // 邻接表
9+
}
10+
11+
impl Graph {
12+
fn new(v: i32) -> Self {
13+
Graph {
14+
v: v,
15+
linked_vec: vec![LinkedList::new(); v as usize],
16+
}
17+
}
18+
19+
// 无向图的每条边存两次
20+
fn add_edge(&mut self, s: i32, t: i32) {
21+
self.linked_vec[s as usize].push_back(t);
22+
self.linked_vec[t as usize].push_back(s);
23+
}
24+
25+
fn bfs(&self, s: i32, t: i32) {
26+
if s == t { return; }
27+
28+
let mut prev = vec![-1; self.v as usize];
29+
let mut visited = vec![false; self.v as usize];
30+
let mut queue = VecDeque::new();
31+
32+
visited[s as usize] = true;
33+
queue.push_back(s);
34+
35+
while !queue.is_empty() {
36+
let w = queue.pop_front().unwrap();
37+
for item in self.linked_vec[w as usize].iter() {
38+
if visited[*item as usize] { continue; }
39+
prev[*item as usize] = w;
40+
if *item == t {
41+
self.draw(&prev, s, t);
42+
return;
43+
}
44+
visited[*item as usize] = true;
45+
queue.push_back(*item);
46+
}
47+
}
48+
}
49+
50+
fn dfs(&self, s: i32, t: i32) {
51+
let mut found = false;
52+
let mut prev = vec![-1; self.v as usize];
53+
let mut visited = vec![false; self.v as usize];
54+
55+
self.recur_dfs(s, t, &mut visited, &mut prev, &mut found);
56+
self.draw(&prev, s, t);
57+
}
58+
59+
fn recur_dfs(&self,
60+
s: i32,
61+
t: i32,
62+
visited: &mut Vec<bool>,
63+
prev: &mut Vec<i32>,
64+
found: &mut bool) {
65+
if *found == true { return; }
66+
visited[s as usize] = true;
67+
if s == t {
68+
*found = true;
69+
return;
70+
}
71+
for item in self.linked_vec[s as usize].iter() {
72+
if visited[*item as usize] { continue; }
73+
prev[*item as usize] = s;
74+
self.recur_dfs(*item, t, visited, prev, found);
75+
}
76+
}
77+
78+
// 递归打印路径
79+
fn draw(&self, prev: &Vec<i32>, s: i32, t: i32) {
80+
if prev[t as usize] != -1 && s != t {
81+
self.draw(prev, s, prev[t as usize]);
82+
}
83+
84+
println!("{} ->", t);
85+
}
86+
}
87+
88+
fn main() {
89+
let mut graph = Graph::new(8);
90+
graph.add_edge(0, 1);
91+
graph.add_edge(0, 3);
92+
graph.add_edge(1, 2);
93+
graph.add_edge(1, 4);
94+
graph.add_edge(2, 5);
95+
graph.add_edge(3, 4);
96+
graph.add_edge(4, 5);
97+
graph.add_edge(4, 6);
98+
graph.add_edge(5, 7);
99+
graph.add_edge(6, 7);
100+
101+
// Graph { v: 8, linked_vec: [[1, 3], [0, 2, 4], [1, 5], [0, 4], [1, 3, 5, 6], [2, 4, 7], [4, 7], [5, 6]] }
102+
println!("{:?}", graph);
103+
graph.bfs(0, 7);
104+
println!("bfs=============");
105+
graph.bfs(1, 3);
106+
println!("bfs=============");
107+
108+
graph.dfs(0, 7);
109+
println!("dfs=============");
110+
graph.dfs(1, 3);
111+
println!("dfs=============");
112+
}

0 commit comments

Comments
 (0)