From 05408ca87f5a5e4a1f2be4149d15f9a0b253c43f Mon Sep 17 00:00:00 2001 From: dwij2812 Date: Fri, 25 Sep 2020 22:05:34 +0530 Subject: [PATCH] Added Depth First Serach --- README.md | 1 + searching/depthFirstSearch.go | 72 +++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 searching/depthFirstSearch.go diff --git a/README.md b/README.md index a261c2d..0ed7ff4 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Algorithms * [binary search](https://en.wikipedia.org/wiki/Binary_search_algorithm) * [linear search](https://en.wikipedia.org/wiki/Linear_search) * [jump search](https://en.wikipedia.org/wiki/Jump_search) + * [depth first search](https://en.wikipedia.org/wiki/Depth-first_search) #### Collections diff --git a/searching/depthFirstSearch.go b/searching/depthFirstSearch.go new file mode 100644 index 0000000..1342d2c --- /dev/null +++ b/searching/depthFirstSearch.go @@ -0,0 +1,72 @@ +package main + +import "fmt" + +func getIdx(target int, nodes []int) int { + for i := 0; i < len(nodes); i++ { + if nodes[i] == target { + return i + } + } + return -1 +} + +func notExist(target int, slice []int) bool { + for i := 0; i < len(slice); i++ { + if slice[i] == target { + return false + } + } + return true +} + +func dfs(start, end int, nodes []int, edges [][]bool) ([]int, bool) { + var route []int + var stack []int + startIdx := getIdx(start, nodes) + stack = append(stack, startIdx) + for len(stack) > 0 { + now := stack[len(stack)-1] + route = append(route, nodes[now]) + if len(stack) > 1 { + stack = stack[:len(stack)-1] + } else { + stack = stack[:len(stack)-1] + } + for i := 0; i < len(edges[now]); i++ { + if edges[now][i] && notExist(i, stack) { + stack = append(stack, i) + } + edges[now][i] = false + edges[i][now] = false + } + if route[len(route)-1] == end { + return route, true + } + } + return nil, false +} + +func main() { + nodes := []int{ + 1, 2, 3, 4, 5, 6, + } + /* + sample graph + ①-② + | | + ③-④-⑤-⑥ + */ + edges := [][]bool{ + {false, true, true, false, false, false}, + {true, false, false, true, false, false}, + {true, false, false, true, false, false}, + {false, true, true, false, true, false}, + {false, false, false, true, false, true}, + {false, false, false, false, true, false}, + } + start := 1 + end := 6 + route, _ := dfs(start, end, nodes, edges) + fmt.Println(route) +} \ No newline at end of file