Skip to content

Commit b3a8fef

Browse files
committed
[Function add]
1. Add the reacheable method for directed graph using depth first search.
1 parent 98833c0 commit b3a8fef

File tree

5 files changed

+239
-0
lines changed

5 files changed

+239
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.FileNotFoundException;
6+
7+
import ca.mcmaster.chapter.one.bag.Bag;
8+
import ca.mcmaster.chapter.one.bag.ListBag;
9+
10+
public class DirectedDFS {
11+
private final boolean[] marked;
12+
public DirectedDFS(Digraph g, int s){
13+
this.marked = new boolean[g.V()];
14+
dfs(g, s);
15+
}
16+
public DirectedDFS(Digraph g, Iterable<Integer> sources){
17+
marked = new boolean[g.V()];
18+
for(int s : sources)
19+
if(!marked[s]) dfs(g, s);
20+
}
21+
private void dfs(Digraph g, int s) {
22+
marked[s] = true;
23+
for(int w : g.adj(s))
24+
if(!marked[w]) dfs(g, w);
25+
}
26+
public boolean mark(int v){
27+
return marked[v];
28+
}
29+
public static void main(String[] args) throws FileNotFoundException {
30+
Digraph g = new DigraphImpl(new FileInputStream(new File("src/ca/mcmaster/chapter/four/graph/tinyDG.txt")));
31+
Bag<Integer> bag = new ListBag<Integer>();
32+
bag.add(1);
33+
bag.add(2);
34+
bag.add(6);
35+
DirectedDFS d = new DirectedDFS(g, bag);
36+
StringBuilder sb = new StringBuilder();
37+
for(int v = 0; v < g.V(); v++){
38+
if(d.mark(v)) sb.append(v + " ");
39+
}
40+
System.out.println(sb.toString());
41+
}
42+
}

Diff for: DataStructrue/Graph/Digraph.java

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
public interface Digraph {
4+
/**
5+
* @Description: Number of vertex.
6+
* @return
7+
*/
8+
public int V();
9+
/**
10+
* @Description: Number of edge.
11+
* @return
12+
*/
13+
public int E();
14+
/**
15+
* @Description: Add an edge between two vertex. v->w.
16+
* @param v
17+
* @param w
18+
*/
19+
public void addEdge(int v, int w);
20+
/**
21+
* @Description: Return vertex point out from v.
22+
* @param v
23+
* @return
24+
*/
25+
public Iterable<Integer> adj(int v);
26+
/**
27+
* @Description: Get the reverse graph of current graph.
28+
* @return
29+
*/
30+
public Digraph reverse();
31+
/**
32+
* @Description: Print current graph.
33+
*/
34+
public void display();
35+
}

Diff for: DataStructrue/Graph/DigraphImpl.java

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.IOException;
6+
import java.util.Scanner;
7+
8+
import ca.mcmaster.chapter.one.bag.ListBag;
9+
10+
public class DigraphImpl implements Digraph {
11+
private final int V; //Number of vertex in current digraph
12+
private int E; //Number of edges.
13+
private ListBag<Integer>[] adj;
14+
@SuppressWarnings("unchecked")
15+
public DigraphImpl(int V){
16+
this.V = V;
17+
adj = (ListBag<Integer>[])new ListBag[V];
18+
for (int i = 0; i < V; i++) {
19+
adj[i] = new ListBag<Integer>();
20+
}
21+
this.E = 0;
22+
}
23+
24+
@SuppressWarnings("unchecked")
25+
26+
public DigraphImpl(FileInputStream in) {
27+
Scanner s = null;
28+
s = new Scanner(in);
29+
this.V = s.nextInt();
30+
this.E = s.nextInt();
31+
adj = new ListBag[V];
32+
for (int i = 0; i < V; i++) {
33+
adj[i] = new ListBag<Integer>();
34+
}
35+
for(int i = 0; i < E; i ++){
36+
int v = s.nextInt();
37+
int w = s.nextInt();
38+
adj[v].add(w);
39+
}
40+
s.close();
41+
}
42+
@Override
43+
public int V() { return this.V; }
44+
@Override
45+
public void addEdge(int v, int w) {
46+
adj[v].add(w);
47+
E++;
48+
}
49+
@Override
50+
public int E() { return E; }
51+
@Override
52+
public Iterable<Integer> adj(int v) {
53+
return adj[v];
54+
}
55+
@Override
56+
public Digraph reverse() {
57+
DigraphImpl g = new DigraphImpl(V);
58+
for(int v = 0; v < V; v++)
59+
for(int w : adj(v))
60+
addEdge(w, v);
61+
return g;
62+
}
63+
@Override
64+
public void display() {
65+
for(int i = 0; i < V; i++){
66+
StringBuilder sb = new StringBuilder(i + ": ");
67+
for(int w : adj[i]){
68+
sb.append(w + "|");
69+
}
70+
System.out.println(sb.toString());
71+
}
72+
}
73+
public static void main(String[] args) throws IOException {
74+
FileInputStream in = new FileInputStream(new File("src/ca/mcmaster/chapter/four/graph/tinyDG.txt"));
75+
Digraph graph = new DigraphImpl(in);
76+
in.close();
77+
graph.display();
78+
}
79+
}

Diff for: DataStructrue/Graph/DirectedDFS.java

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.FileNotFoundException;
6+
7+
import ca.mcmaster.chapter.one.bag.Bag;
8+
import ca.mcmaster.chapter.one.bag.ListBag;
9+
10+
public class DirectedDFS {
11+
private final boolean[] marked;
12+
public DirectedDFS(Digraph g, int s){
13+
this.marked = new boolean[g.V()];
14+
dfs(g, s);
15+
}
16+
public DirectedDFS(Digraph g, Iterable<Integer> sources){
17+
marked = new boolean[g.V()];
18+
for(int s : sources)
19+
if(!marked[s]) dfs(g, s);
20+
}
21+
private void dfs(Digraph g, int s) {
22+
marked[s] = true;
23+
for(int w : g.adj(s))
24+
if(!marked[w]) dfs(g, w);
25+
}
26+
public boolean mark(int v){
27+
return marked[v];
28+
}
29+
public static void main(String[] args) throws FileNotFoundException {
30+
Digraph g = new DigraphImpl(new FileInputStream(new File("src/ca/mcmaster/chapter/four/graph/tinyDG.txt")));
31+
Bag<Integer> bag = new ListBag<Integer>();
32+
bag.add(1);
33+
bag.add(2);
34+
bag.add(6);
35+
DirectedDFS d = new DirectedDFS(g, bag);
36+
StringBuilder sb = new StringBuilder();
37+
for(int v = 0; v < g.V(); v++){
38+
if(d.mark(v)) sb.append(v + " ");
39+
}
40+
System.out.println(sb.toString());
41+
}
42+
}

Diff for: DataStructrue/Graph/DirectedGraph.md

+41
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,44 @@ public class DigraphImpl implements Digraph {
134134
>10: 12|
135135
>11: 4|12|
136136
>12: 9|
137+
138+
### 有向图的可达性
139+
```Java
140+
public class DirectedDFS {
141+
private final boolean[] marked;
142+
public DirectedDFS(Digraph g, int s){
143+
this.marked = new boolean[g.V()];
144+
dfs(g, s);
145+
}
146+
public DirectedDFS(Digraph g, Iterable<Integer> sources){
147+
marked = new boolean[g.V()];
148+
for(int s : sources)
149+
if(!marked[s]) dfs(g, s);
150+
}
151+
private void dfs(Digraph g, int s) {
152+
marked[s] = true;
153+
for(int w : g.adj(s))
154+
if(!marked[w]) dfs(g, w);
155+
}
156+
public boolean mark(int v){
157+
return marked[v];
158+
}
159+
}
160+
```
161+
* 测试
162+
```Java
163+
public static void main(String[] args) throws FileNotFoundException {
164+
Digraph g = new DigraphImpl(new FileInputStream(new File("src/ca/mcmaster/chapter/four/graph/tinyDG.txt")));
165+
Bag<Integer> bag = new ListBag<Integer>();
166+
bag.add(1);
167+
bag.add(2);
168+
bag.add(6);
169+
DirectedDFS d = new DirectedDFS(g, bag);
170+
StringBuilder sb = new StringBuilder();
171+
for(int v = 0; v < g.V(); v++){
172+
if(d.mark(v)) sb.append(v + " ");
173+
}
174+
System.out.println(sb.toString());
175+
}
176+
```
177+
> 0 1 2 3 4 5 6 8 9 10 11 12

0 commit comments

Comments
 (0)