Skip to content

Commit a23f78b

Browse files
committed
fix wrong file name
1 parent 43cc3d6 commit a23f78b

File tree

1 file changed

+152
-0
lines changed

1 file changed

+152
-0
lines changed

go/31_graph/graph_search.go

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package graph
2+
3+
import (
4+
"container/list"
5+
"fmt"
6+
)
7+
8+
//adjacency table, 无向图
9+
type Graph struct {
10+
adj []*list.List
11+
v int
12+
}
13+
14+
//init graphh according to capacity
15+
func newGraph(v int) *Graph {
16+
graphh := &Graph{}
17+
graphh.v = v
18+
graphh.adj = make([]*list.List, v)
19+
for i := range graphh.adj {
20+
graphh.adj[i] = list.New()
21+
}
22+
return graphh
23+
}
24+
25+
//insert as add edge,一条边存2次
26+
func (self *Graph) addEdge(s int, t int) {
27+
self.adj[s].PushBack(t)
28+
self.adj[t].PushBack(s)
29+
}
30+
31+
//search path by BFS
32+
func (self *Graph) BFS(s int, t int) {
33+
34+
//todo
35+
if s == t {
36+
return
37+
}
38+
39+
//init prev
40+
prev := make([]int, self.v)
41+
for index := range prev {
42+
prev[index] = -1
43+
}
44+
45+
//search by queue
46+
var queue []int
47+
visited := make([]bool, self.v)
48+
queue = append(queue, s)
49+
visited[s] = true
50+
isFound := false
51+
for len(queue) > 0 && !isFound {
52+
top := queue[0]
53+
queue = queue[1:]
54+
linkedlist := self.adj[top]
55+
for e := linkedlist.Front(); e != nil; e = e.Next() {
56+
k := e.Value.(int)
57+
if !visited[k] {
58+
prev[k] = top
59+
if k == t {
60+
isFound = true
61+
break
62+
}
63+
queue = append(queue, k)
64+
visited[k] = true
65+
}
66+
}
67+
}
68+
69+
if isFound {
70+
printPrev(prev, s, t)
71+
} else {
72+
fmt.Printf("no path found from %d to %d\n", s, t)
73+
}
74+
75+
}
76+
77+
//search by DFS
78+
func (self *Graph) DFS(s int, t int) {
79+
80+
prev := make([]int, self.v)
81+
for i := range prev {
82+
prev[i] = -1
83+
}
84+
85+
visited := make([]bool, self.v)
86+
visited[s] = true
87+
88+
isFound := false
89+
self.recurse(s, t, prev, visited, isFound)
90+
91+
printPrev(prev, s, t)
92+
}
93+
94+
//recursivly find path
95+
func (self *Graph) recurse(s int, t int, prev []int, visited []bool, isFound bool) {
96+
97+
if isFound {
98+
return
99+
}
100+
101+
visited[s] = true
102+
103+
if s == t {
104+
isFound = true
105+
return
106+
}
107+
108+
linkedlist := self.adj[s]
109+
for e := linkedlist.Front(); e != nil; e = e.Next() {
110+
k := e.Value.(int)
111+
if !visited[k] {
112+
prev[k] = s
113+
self.recurse(k, t, prev, visited, false)
114+
}
115+
}
116+
117+
}
118+
119+
//print path recursively
120+
func printPrev(prev []int, s int, t int) {
121+
122+
if t == s || prev[t] == -1 {
123+
fmt.Printf("%d ", t)
124+
} else {
125+
printPrev(prev, s, prev[t])
126+
fmt.Printf("%d ", t)
127+
}
128+
129+
}
130+
131+
//func main() {
132+
// graph := newGraph(8)
133+
// graph.addEdge(0, 1)
134+
// graph.addEdge(0, 3)
135+
// graph.addEdge(1, 2)
136+
// graph.addEdge(1, 4)
137+
// graph.addEdge(2, 5)
138+
// graph.addEdge(3, 4)
139+
// graph.addEdge(4, 5)
140+
// graph.addEdge(4, 6)
141+
// graph.addEdge(5, 7)
142+
// graph.addEdge(6, 7)
143+
//
144+
// graph.BFS(0, 7)
145+
// fmt.Println()
146+
// graph.BFS(1, 3)
147+
// fmt.Println()
148+
// graph.DFS(0, 7)
149+
// fmt.Println()
150+
// graph.DFS(1, 3)
151+
// fmt.Println()
152+
//}

0 commit comments

Comments
 (0)