//图对象import edu.princeton.cs.algs4.Bag;
publicclassGraph {privatefinalint V;
privateint E;
private Bag<Integer>[] adj;
publicGraph(int V) {
this.V = V;
this.E = 0;
adj = (Bag<Integer>) new Bag(V);
for (int i = 0; i < V;i++) {
adj[i] = new Bag<>();
}
}
publicintV() {
return V;
}
publicintE() {
return E;
}
publicvoidaddE(int v, int w) {
adj[v].add(w);
adj[w].add(v);
E++;
}
public Iterable<Integer> adj(int v) {
return adj[v];
}
}
//DFSimport java.util.Stack;
publicclassDFS {privateboolean[] marked;
privateint count;
privateint [] edgeTo;
privatefinalint s;
publicDFS(Graph G, int s) {
marked = newboolean[G.V()];
edgeTo = newint [G.V()];
this.s = s;
dfs(G, s);
}
privatevoiddfs(Graph G, int s) {
marked[s] = true;
count++;
for (int w : G.adj(s)) {
if (!isMarked(w)) {
edgeTo[w] = s;
dfs(G,w);
}
}
}
publicbooleanisMarked(int w) {
return marked[w];
}
public Iterable<Integer> pathTo(int v) {
if (!isMarked(v)) {
returnnull;
}
Stack<Integer> path = new Stack<>();
for (int x = v; v != s; x = edgeTo[x]) {
path.push(v);
}
path.push(s);
return path;
}
}
//BFSimport edu.princeton.cs.algs4.*;
publicclassBFS {privateboolean[] marked;
privateint count;
privateint [] edgeTo;
privatefinalint s;
publicBFS(Graph G, int s) {
this.s = s;
marked = newboolean[G.V()];
edgeTo = newint [G.V()];
bfs(G, s);
}
privatevoidbfs(Graph G, int s) {
Queue<Integer> queue = new Queue<>() ;
queue.enqueue(s);
marked[s] = true;
while (!queue.isEmpty()) {
int temp = queue.dequeue();
for (int w : G.adj(temp)) {
if (!isMarked(w)) {
queue.enqueue(w);
marked[w] = true;
edgeTo[w] = temp;
}
}
}
}
publicbooleanisMarked(int w) {
return marked[w];
}
public Iterable<Integer> pathTo(int v) {
if (!isMarked(v)) {
returnnull;
}
java.util.Stack<Integer> path = new java.util.Stack<>();
for (int x = v; v != s; x = edgeTo[x]) {
path.push(v);
}
path.push(s);
return path;
}
}
//连通性问题import edu.princeton.cs.algs4.Bag;
publicclassCC {privateint[] id;
privateint count;
privateboolean[] marked;
publicCC(Graph G) {
marked = newboolean[G.V()];
id = newint[G.V()];
for (int s = 0; s < G.V(); s++) {
if (!isMarked(s)) {
dfs(G,s);
count++;
}
}
}
privatevoiddfs(Graph G, int s) {
marked[s] =true;
id[s] = count;
for (int w : G.adj(s)) {
if (!isMarked(w)) {
dfs(w);
}
}
}
privatebooleanisMarked(int v) {
return marked[v];
}
publicintid(int v) {
return id[v];
}
publicbooleanisConnected(int w, int v) {
return id[v] == id[w];
}
}
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.ST;
publicclass SymbolGraph {
private ST<String, Integer> st;
privateString[] keys;
private Graph G;
public SymbolGraph(String stream, Stringsplit) {
st = new ST<String, Integer>();
Inin = newIn(stream);
while (in.hasNextLine()) {
String[] a = in.readLine().split(split);
for (int i = 0;i< a.length; i++) {
if (!st.contains(a[i])) {
st.put(a[i], st.size());
}
}
}
keys = newString[st.size()];
for (String t : st.keys()) {
keys[st.get(t)] = t;
}
G = new Graph(st.size());
in = newIn(stream);
while (in.hasNextLine()) {
String[] a = in.readLine().split(split);
int v = st.get(a[0]);
for (int i =1;i<a.length;i++) {
G.addE(v, st.get(a[i]));
}
}
}
}