Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。アルゴリズムクイックリファレンス 第2版を読んで各種アルゴリズムをGoで実装して行きます。
前回: Goでのアルゴリズムクイックリファレンス第2版(深さ優先探索)
今回は幅優先探索
幅優先探索(はばゆうせんたんさく、英: breadth first search)はグラフ理論(Graph theory)において木構造(tree structure)やグラフ(graph)の探索に用いられるアルゴリズム。アルゴリズムは根ノードで始まり隣接した全てのノードを探索する。それからこれらの最も近いノードのそれぞれに対して同様のことを繰り返して探索対象ノードをみつける。「横型探索」とも言われる。
package main
import (
	"container/list"
	"fmt"
)
type Graph struct {
	List []int
}
func BreadthFirstSearch(g *[]*Graph, n int, visited *[]int) {
	(*visited)[n] = 1
	q := list.New()
	q.PushBack(n)
	for {
		if q.Len() == 0 {
			break
		}
		n := q.Remove(q.Front())
		fmt.Printf("n:%d\n", n)
		fmt.Println(*visited)
		for _, v := range (*g)[n.(int)].List {
			if (*visited)[v] == 0 {
				(*visited)[v] = 1
				fmt.Printf("\tn:%d->%d\n", n, v)
				q.PushBack(v)
			}
		}
	}
}
func main() {
	g := make([]*Graph, 0)
	g = append(g, &Graph{[]int{5, 6}}) // 0
	g = append(g, &Graph{[]int{3, 4}}) // 1
	g = append(g, &Graph{[]int{1}})    // 2
	g = append(g, &Graph{[]int{4}})    // 3
	g = append(g, &Graph{[]int{3}})    // 4
	g = append(g, &Graph{[]int{0}})    // 5
	g = append(g, &Graph{[]int{7}})    // 6
	g = append(g, &Graph{[]int{2}})    // 7
	visited := make([]int, len(g))
	BreadthFirstSearch(&g, 0, &visited)
}
次回はダイクストラ法です。