package 重复;
public class Graph {
private final int V;
private int E;
private bag<Integer>[] adj;
public Graph(int v) {
this.V = v;
this.E = 0;
adj = (bag<Integer>[]) new bag[V];
for(int x = 0;x<V;x++)
adj[x] = new bag<Integer>();
}
public int E() {return E;}
public int V() {return V;}
public void addEdge(int v, int w) {
adj[v].add(w);
adj[w].add(v);
E++;
}
public Iterable<Integer> adj(int v){return adj[v];}
}
depthfirstsearch
package 重复;
import java.util.Stack;
public class depthFirstPath {
private int[] edgeTo;
private boolean[] marked;
private final int s;
public depthFirstPath(Graph G, int s) {
edgeTo = new int[G.V()];
marked = new boolean[G.V()];
this.s = s;
dfs(G,s);
}
public void dfs(Graph G, int v) {
marked[v] = true;
for(int i:G.adj(v)) {
if(!marked[i]) dfs(G,i);edgeTo[i] = v;
}
}
public boolean hasPathTo(int v) {
return marked[v];
}
public Iterable<Integer> pathTo(int v){
Stack<Integer> path = new Stack();
for(int i = v;i != s;i = edgeTo[i])
path.push(i);
path.push(s);
return path;
}
}
breathfirstsearch
package 重复;
import java.util.Stack;
public class depthFirstPath {
private int[] edgeTo;
private boolean[] marked;
private final int s;
public depthFirstPath(Graph G, int s) {
edgeTo = new int[G.V()];
marked = new boolean[G.V()];
this.s = s;
dfs(G,s);
}
public void dfs(Graph G, int v) {
marked[v] = true;
for(int i:G.adj(v)) {
if(!marked[i]) dfs(G,i);edgeTo[i] = v;
}
}
public boolean hasPathTo(int v) {
return marked[v];
}
public Iterable<Integer> pathTo(int v){
Stack<Integer> path = new Stack();
for(int i = v;i != s;i = edgeTo[i])
path.push(i);
path.push(s);
return path;
}
}