-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfind_in_graph.go
76 lines (73 loc) · 2.13 KB
/
find_in_graph.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package problem1971
/*
There is a bi-directional graph with n vertices, where each vertex is labeled from 0 to n - 1 (inclusive).
The edges in the graph are represented as a 2D integer array edges, where each edges[i] = [ui, vi] denotes a bi-directional edge between vertex ui and vertex vi.
Every vertex pair is connected by at most one edge, and no vertex has an edge to itself.
You want to determine if there is a valid path that exists from vertex source to vertex destination.
Given edges and the integers n, source, and destination, return true if there is a valid path from source to destination, or false otherwise.
*/
func validPath(n int, edges [][]int, source int, destination int) bool {
if source == destination {
return true
}
var seen = make([]bool, n)
var adj [][]int = make([][]int, n)
var cur, next []int
cur = []int{source}
// Making an adjacency list
for i := range edges {
// remember it's bi-directional
adj[edges[i][0]] = append(adj[edges[i][0]], edges[i][1])
adj[edges[i][1]] = append(adj[edges[i][1]], edges[i][0])
}
// While current layer is not empty
for len(cur) > 0 {
next = []int{}
// Populate the next layer
for _, curN := range cur {
for _, nextN := range adj[curN] {
// Ignore visited
if !seen[nextN] {
seen[nextN] = true
// Check for destination
if nextN == destination {
return true
}
next = append(next, nextN)
}
}
}
// Switch layers
cur = next
}
return false
}
func validPathQueue(n int, edges [][]int, source int, destination int) bool {
if source == destination {
return true
}
var seen = make([]bool, n)
var adj [][]int = make([][]int, n)
var bfs = make(chan int, n)
// Making an adjacency list
for i := range edges {
// remember it's bi-directional
adj[edges[i][0]] = append(adj[edges[i][0]], edges[i][1])
adj[edges[i][1]] = append(adj[edges[i][1]], edges[i][0])
}
bfs <- source
// While were not out of options
for len(bfs) > 0 {
cur := <-bfs
for i := range adj[cur] {
if !seen[adj[cur][i]] {
seen[adj[cur][i]] = true
if adj[cur][i] == destination {
return true
}
bfs <- adj[cur][i]
}
}
}
return false
}