Skip to content

Commit 9de9298

Browse files
committed
[Function add]
1.Add undirected graph. 2.Add a union find implementation of Search:UFSearch.
1 parent 5db7aff commit 9de9298

File tree

12 files changed

+541
-0
lines changed

12 files changed

+541
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
public abstract class AbstractSearch implements Search {
4+
protected final Graph g;
5+
protected final int s;
6+
public AbstractSearch(Graph g, int s) {
7+
this.g = g;
8+
this.s = s;
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
public interface Search {
4+
/**
5+
* @Description: If s and v are connected.
6+
* @param v
7+
* @return
8+
*/
9+
public boolean mark(int v);
10+
/**
11+
* @Description: Number of vertex connected to source.
12+
* @return
13+
*/
14+
public int count();
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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+
public class UFSearch extends AbstractSearch {
8+
private final UF uf;
9+
public UFSearch(Graph g, int s) {
10+
super(g, s);
11+
this.uf = new UF(g.V());
12+
//Insert connections into the UF.
13+
for(int v = 0; v < g.V(); v++){
14+
for(int w : g.adj(v)){
15+
if(uf.connected(v, w)) continue;
16+
else uf.union(v, w);
17+
}
18+
}
19+
}
20+
21+
@Override
22+
public boolean mark(int v) {
23+
return uf.connected(super.s, v);
24+
}
25+
26+
@Override
27+
public int count() {
28+
return uf.size[super.s];
29+
}
30+
private final class UF{
31+
private final int N;
32+
private final int[] a;
33+
private final int[] size;
34+
public UF(int N){
35+
this.N = N;
36+
a = new int[N];
37+
for(int i = 0; i < N; i++) a[i] = i;
38+
size = new int[N];
39+
for(int i = 0; i < N; i++) size[i] = 1;
40+
}
41+
public int find(int v){
42+
if(a[v] == v) return v;
43+
else return find(a[v]);
44+
}
45+
public void union(int p, int q){
46+
int qRoot = find(q);
47+
int pRoot = find(p);
48+
if(pRoot == qRoot) return;
49+
if(size[qRoot] < size[pRoot]){
50+
a[qRoot] = pRoot;
51+
size[pRoot] += size[qRoot];
52+
}else{ //size[qRoot] >= size[pRoot]
53+
a[pRoot] = qRoot;
54+
size[qRoot] += size[pRoot];
55+
}
56+
}
57+
public boolean connected(int p, int q){
58+
return find(q) == find(p);
59+
}
60+
}
61+
62+
public static void main(String[] args) throws FileNotFoundException {
63+
Graph g = new UndirectedGraph(new FileInputStream(new File("src/ca/mcmaster/chapter/four/graph/tinyG.txt")));
64+
Search search = new UFSearch(g, 9);
65+
System.out.println(search.mark(4));
66+
}
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
import java.io.FileInputStream;
4+
import java.util.Scanner;
5+
6+
import ca.mcmaster.chapter.one.bag.Bag;
7+
import ca.mcmaster.chapter.one.bag.ListBag;
8+
9+
public class UndirectedGraph implements Graph {
10+
private final int V; //vertex
11+
private int E; //edge
12+
private Bag<Integer>[] adj; //adjacency table.
13+
@SuppressWarnings("unchecked")
14+
public UndirectedGraph(int V) {
15+
this.V = V;
16+
adj = new ListBag[V];
17+
for(int v = 0; v < V; v++)
18+
adj[v] = new ListBag<>();
19+
}
20+
@SuppressWarnings("unchecked")
21+
public UndirectedGraph(FileInputStream in){
22+
Scanner scanner = new Scanner(in);
23+
this.V = scanner.nextInt();
24+
adj = new ListBag[V];
25+
for(int v = 0; v < V; v++)
26+
adj[v] = new ListBag<>();
27+
int E = scanner.nextInt();
28+
for(int e = 0; e < E; e++){
29+
int v = scanner.nextInt();
30+
int w = scanner.nextInt();
31+
addEdge(v, w);
32+
}
33+
scanner.close();
34+
}
35+
@Override
36+
public int V() { return V; }
37+
@Override
38+
public int E() { return 0; }
39+
@Override
40+
public void addEdge(int v, int w) {
41+
adj[v].add(w);
42+
adj[w].add(v);
43+
this.E++;
44+
}
45+
46+
@Override
47+
public Iterable<Integer> adj(int v) {
48+
return adj[v];
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
13
2+
13
3+
0 5
4+
4 3
5+
0 1
6+
9 12
7+
6 4
8+
5 4
9+
0 2
10+
11 12
11+
9 10
12+
0 6
13+
7 8
14+
9 11
15+
5 3
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
public abstract class AbstractSearch implements Search {
4+
protected final Graph g;
5+
protected final int s;
6+
public AbstractSearch(Graph g, int s) {
7+
this.g = g;
8+
this.s = s;
9+
}
10+
}

DataStructrue/Graph/Graph.java

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
import java.awt.DisplayMode;
4+
5+
public interface Graph {
6+
/**
7+
* @Description: Get the vertex number.
8+
* @return
9+
*/
10+
public int V();
11+
12+
/**
13+
* @Description: Get the edge number.
14+
* @return
15+
*/
16+
public int E();
17+
/**
18+
* @Description: Create an edge between w and v.
19+
* @param v
20+
* @param w
21+
*/
22+
public void addEdge(int v, int w);
23+
/**
24+
* @Description: Get all vertex adjacent to v.
25+
* @param v
26+
* @return
27+
*/
28+
public Iterable<Integer> adj(int v);
29+
30+
/**
31+
* @Description: Return degree of given vertex.
32+
* @param G
33+
* @param V
34+
* @return
35+
*/
36+
static Integer degree(Graph G, int V){
37+
Integer degree = new Integer(0);
38+
for(int w : G.adj(V)) degree++;
39+
return degree;
40+
}
41+
42+
/**
43+
* @Description: Find the largest degree in the graph
44+
* @param G
45+
* @param V
46+
* @return
47+
*/
48+
static int maxDegree(Graph G, int V){
49+
int max = 0;
50+
for(int w : G.adj(V) )
51+
if(w > max)
52+
max = w;
53+
return max;
54+
}
55+
56+
/**
57+
* @Description: Calculate the average degree for all vertex.
58+
* @param G
59+
* @return
60+
*/
61+
static double avgDegree(Graph G){
62+
return 2 * G.E() / G.V();
63+
}
64+
65+
/**
66+
* @Description: Get the number of selt loop.
67+
* @param G
68+
* @param V
69+
* @return
70+
*/
71+
static int numOfSelfLoop(Graph G, int V){
72+
int num = 0;
73+
int vNum = G.V();
74+
for(int v = 0; v < vNum; v++ )
75+
for(int w : G.adj(v))
76+
if(w == v)
77+
num ++;
78+
return num/2; //w,v and v,w will both be counted.
79+
}
80+
81+
/**
82+
* @Description: Print a graph.
83+
*/
84+
default void display(){
85+
int vertexNum = this.V();
86+
for(int v = 0; v < vertexNum; v++){
87+
StringBuilder sb = new StringBuilder(v + " -> ");
88+
for(int w : adj(v))
89+
sb.append(w + "");
90+
System.out.println(sb.toString());
91+
}
92+
}
93+
}

DataStructrue/Graph/Search.java

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package ca.mcmaster.chapter.four.graph;
2+
3+
public interface Search {
4+
/**
5+
* @Description: If s and v are connected.
6+
* @param v
7+
* @return
8+
*/
9+
public boolean mark(int v);
10+
/**
11+
* @Description: Number of vertex connected to source.
12+
* @return
13+
*/
14+
public int count();
15+
}

DataStructrue/Graph/UFSearch.java

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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+
public class UFSearch extends AbstractSearch {
8+
private final UF uf;
9+
public UFSearch(Graph g, int s) {
10+
super(g, s);
11+
this.uf = new UF(g.V());
12+
//Insert connections into the UF.
13+
for(int v = 0; v < g.V(); v++){
14+
for(int w : g.adj(v)){
15+
if(uf.connected(v, w)) continue;
16+
else uf.union(v, w);
17+
}
18+
}
19+
}
20+
21+
@Override
22+
public boolean mark(int v) {
23+
return uf.connected(super.s, v);
24+
}
25+
26+
@Override
27+
public int count() {
28+
return uf.size[super.s];
29+
}
30+
private final class UF{
31+
private final int N;
32+
private final int[] a;
33+
private final int[] size;
34+
public UF(int N){
35+
this.N = N;
36+
a = new int[N];
37+
for(int i = 0; i < N; i++) a[i] = i;
38+
size = new int[N];
39+
for(int i = 0; i < N; i++) size[i] = 1;
40+
}
41+
public int find(int v){
42+
if(a[v] == v) return v;
43+
else return find(a[v]);
44+
}
45+
public void union(int p, int q){
46+
int qRoot = find(q);
47+
int pRoot = find(p);
48+
if(pRoot == qRoot) return;
49+
if(size[qRoot] < size[pRoot]){
50+
a[qRoot] = pRoot;
51+
size[pRoot] += size[qRoot];
52+
}else{ //size[qRoot] >= size[pRoot]
53+
a[pRoot] = qRoot;
54+
size[qRoot] += size[pRoot];
55+
}
56+
}
57+
public boolean connected(int p, int q){
58+
return find(q) == find(p);
59+
}
60+
}
61+
62+
public static void main(String[] args) throws FileNotFoundException {
63+
Graph g = new UndirectedGraph(new FileInputStream(new File("src/ca/mcmaster/chapter/four/graph/tinyG.txt")));
64+
Search search = new UFSearch(g, 9);
65+
System.out.println(search.mark(4));
66+
}
67+
}

0 commit comments

Comments
 (0)