forked from hackfengJam/HelloAlgorithm
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDenseGraph.java
113 lines (93 loc) · 2.72 KB
/
DenseGraph.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
package no_weight;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
// 稠密图 - 邻接矩阵
public class DenseGraph implements Graph {
private int n, m; // n 为顶点 V,m 为边 E
// 指定是否为有向图
private boolean directed;
List<List<Boolean>> g;
public DenseGraph(int n, boolean directed) {
this.n = n;
this.m = 0;
this.directed = directed;
g = new ArrayList<>();
for (int i = 0; i < n; i++) {
List<Boolean> line = new ArrayList<>();
for (int j = 0; j < n; j++)
line.add(false);
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).set(w, true);
if (!directed)
g.get(w).set(v, true);
m++;
}
public boolean hasEdge(int v, int w) {
assert (v >= 0 && v < n);
assert (w >= 0 && w < n);
return g.get(v).get(w);
}
public Iterable<Integer> adj(int v) {
List<Integer> iter = new ArrayList<>();
for (int index = 0; index < g.size(); index++)
if (g.get(v).get(index))
iter.add(index);
return iter;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("no_weight.DenseGraph\n");
stringBuilder.append("-----------\n");
for (int i = 0; i < g.size(); i++) {
List<Boolean> line = g.get(i);
stringBuilder.append(i);
stringBuilder.append(" : ");
for (int j = 0; j < line.size(); j++) {
// boolean v = line.get(j);
if (line.get(j)) {
stringBuilder.append(j);
if (j < line.size() - 1)
stringBuilder.append(", ");
}
}
stringBuilder.append("\n");
}
return stringBuilder.toString();
}
class adjIterator implements Iterator {
private DenseGraph G;
private int v;
int index;
public adjIterator(DenseGraph graph, int v) {
this.G = graph;
this.v = v;
this.index = -1;
}
@Override
public boolean hasNext() {
return index + 1 < G.V();
}
@Override
public Object next() {
for (index += 1; index < G.V(); index++)
if (G.g.get(v).get(index))
return index;
return -1;
}
}
}