mirror of
https://github.com/0xAX/go-algorithms
synced 2024-11-13 13:10:30 +00:00
72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
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)
|
|
} |