Skip to content

Commit c5bb51e

Browse files
committed
implemented dfs, bfs
1 parent 2cb5f1e commit c5bb51e

File tree

2 files changed

+153
-0
lines changed

2 files changed

+153
-0
lines changed

searches/breadth_first_search.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package main
2+
3+
import "fmt"
4+
5+
// getIdx return target node index
6+
func getIdx(target int, nodes []int) int {
7+
for i := 0; i < len(nodes); i++ {
8+
if nodes[i] == target {
9+
return i
10+
}
11+
}
12+
return -1
13+
}
14+
15+
func notExist(target int, slice []int) bool {
16+
for i := 0; i < len(slice); i++ {
17+
if slice[i] == target {
18+
return false
19+
}
20+
}
21+
return true
22+
}
23+
24+
// bfs return whether start reach end or not.
25+
func bfs(start, end int, nodes []int, edges [][]bool) bool {
26+
var route []int
27+
var queue []int
28+
startIdx := getIdx(start, nodes)
29+
queue = append(queue, startIdx)
30+
for len(queue) > 0 {
31+
now := queue[0]
32+
route = append(route, nodes[now])
33+
// update queue
34+
if len(queue) > 1 {
35+
queue = queue[1:]
36+
} else {
37+
queue = queue[0:]
38+
}
39+
for i := 0; i < len(edges[now]); i++ {
40+
if edges[now][i] && notExist(i, queue) {
41+
queue = append(queue, i)
42+
}
43+
edges[now][i] = false
44+
edges[i][now] = false
45+
}
46+
if route[len(route)-1] == end {
47+
return true
48+
}
49+
}
50+
return false
51+
}
52+
53+
func main() {
54+
// show graph as node 1-demensional matrix, edge 2-demensional matrix
55+
nodes := []int{
56+
1, 2, 3, 4, 5, 6,
57+
}
58+
/*
59+
sample graph
60+
①-②
61+
| |
62+
③-④-⑤-⑥
63+
*/
64+
edges := [][]bool{
65+
{false, true, true, false, false, false},
66+
{true, false, false, true, false, false},
67+
{true, false, false, true, false, false},
68+
{false, true, true, false, true, false},
69+
{false, false, false, true, false, true},
70+
{false, false, false, false, true, false},
71+
}
72+
start := 1
73+
end := 6
74+
result := bfs(start, end, nodes, edges)
75+
fmt.Println(result)
76+
}

searches/depth_first_search.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package main
2+
3+
import "fmt"
4+
5+
// getIdx return target node index
6+
func getIdx(target int, nodes []int) int {
7+
for i := 0; i < len(nodes); i++ {
8+
if nodes[i] == target {
9+
return i
10+
}
11+
}
12+
return -1
13+
}
14+
15+
func notExist(target int, slice []int) bool {
16+
for i := 0; i < len(slice); i++ {
17+
if slice[i] == target {
18+
return false
19+
}
20+
}
21+
return true
22+
}
23+
24+
// dfs return route, whether reach end or not
25+
func dfs(start, end int, nodes []int, edges [][]bool) ([]int, bool) {
26+
var route []int
27+
var stack []int
28+
startIdx := getIdx(start, nodes)
29+
stack = append(stack, startIdx)
30+
for len(stack) > 0 {
31+
now := stack[len(stack)-1]
32+
route = append(route, nodes[now])
33+
// update stack
34+
if len(stack) > 1 {
35+
stack = stack[:len(stack)-1]
36+
} else {
37+
stack = stack[:len(stack)-1]
38+
}
39+
for i := 0; i < len(edges[now]); i++ {
40+
// exist edge
41+
if edges[now][i] && notExist(i, stack) {
42+
stack = append(stack, i)
43+
}
44+
edges[now][i] = false
45+
edges[i][now] = false
46+
}
47+
if route[len(route)-1] == end {
48+
return route, true
49+
}
50+
}
51+
return nil, false
52+
}
53+
54+
func main() {
55+
// show graph as node 1-demensional matrix, edge 2-demensional matrix
56+
nodes := []int{
57+
1, 2, 3, 4, 5, 6,
58+
}
59+
/*
60+
sample graph
61+
①-②
62+
| |
63+
③-④-⑤-⑥
64+
*/
65+
edges := [][]bool{
66+
{false, true, true, false, false, false},
67+
{true, false, false, true, false, false},
68+
{true, false, false, true, false, false},
69+
{false, true, true, false, true, false},
70+
{false, false, false, true, false, true},
71+
{false, false, false, false, true, false},
72+
}
73+
start := 1
74+
end := 6
75+
route, _ := dfs(start, end, nodes, edges)
76+
fmt.Println(route)
77+
}

0 commit comments

Comments
 (0)