-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBreadthFirstPaths.java
70 lines (65 loc) · 1.72 KB
/
BreadthFirstPaths.java
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
public class BreadthFirstPaths
{
private boolean[] marked;
private int[] edgeTo;
private int s;
public BreadthFirstPaths(Graph G, int s)
{
marked = new boolean[G.V()];
edgeTo = new int[G.V()];
this.s = s;
Queue<Integer> q = new Queue<Integer>();
q.enqueue(s);
marked[s] = true;
bfs(G, s);
}
private void bfs(Graph G, int s)
{
Queue<Integer> q = new Queue<Integer>();
marked[s] = true;
q.enqueue(s);
while (!q.isEmpty())
{
int v = q.dequeue();
for (int a: G.adj(v))
{
if (!marked[a])
{
marked[a] = true;
edgeTo[a] = v;
q.enqueue(a);
}
}
}
}
public boolean hasPathTo(int v)
{ return marked[v]; }
public Iterable<Integer> pathTo(int v)
{
if (!hasPathTo(v)) return null;
Stack<Integer> path = new Stack<Integer>();
for (int x = v; x != s; x = edgeTo[x])
{ path.push(x); }
path.push(s);
return path;
}
public static void main(String[] args)
{
Graph G = new Graph(new In(args[0]));
int s = Integer.parseInt(args[1]);
BreadthFirstPaths search = new BreadthFirstPaths(G, s);
for (int v = 0; v < G.V(); v++)
{
StdOut.print(s + " to " + v + ": ");
if (search.hasPathTo(v))
{
for (int x: search.pathTo(v))
{
if (x == s) StdOut.print(x);
else StdOut.print("-" + x);
}
}
StdOut.println();
}
}
}