forked from hackfengJam/HelloAlgorithm
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSparseGraph.java
116 lines (92 loc) · 2.67 KB
/
SparseGraph.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package no_weight;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
// 稀疏图 - 邻接表
public class SparseGraph implements Graph {
private int n, m; // n 为顶点 V,m 为边 E
// 指定是否为有向图
private boolean directed;
private List<List<Integer>> g;
public SparseGraph(int n, boolean directed) {
this.n = n;
this.m = 0;
this.directed = directed;
g = new ArrayList<>();
for (int i = 0; i < n; i++) {
List<Integer> line = new ArrayList<>();
g.add(line);
}
}
public int V() {
return n;
}
public int E() {
return m;
}
public void addEdge(int v, int w) {
assert (v >= 0 && v < n);
assert (w >= 0 && w < n);
if (hasEdge(v, w))
return;
g.get(v).add(w);
// v != w 排除自环
if (v != w && !directed)
g.get(w).add(v);
m++;
}
public boolean hasEdge(int v, int w) {
assert (v >= 0 && v < n);
assert (w >= 0 && w < n);
for (int i = 0; i < g.get(v).size(); i++) {
if (g.get(v).get(i) == w)
return true;
}
return false;
}
public Iterable<Integer> adj(int v) {
return g.get(v);
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("no_weight.SparseGraph\n");
stringBuilder.append("-----------\n");
for (int i = 0; i < g.size(); i++) {
List<Integer> line = g.get(i);
stringBuilder.append(i);
stringBuilder.append(" : ");
for (int j = 0; j < line.size(); j++) {
int v = line.get(j);
stringBuilder.append(v);
if (j < line.size() - 1)
stringBuilder.append(", ");
}
stringBuilder.append("\n");
}
return stringBuilder.toString();
}
public class adjIterator implements Iterator {
private SparseGraph G;
private int v;
int index;
public adjIterator(SparseGraph graph, int v) {
this.G = graph;
this.v = v;
this.index = -1;
}
@Override
public boolean hasNext() {
// return index + 1 < G.g.get(v).size();
// 为了与 no_weight.DenseGraph 统一
return index < G.g.get(v).size();
}
@Override
public Object next() {
index++;
if (index < G.g.get(v).size())
return G.g.get(v).get(index);
return -1;
}
}
}