-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraph.java
149 lines (107 loc) · 4.22 KB
/
Graph.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
public static class Edge {
private int first;
private int second;
public Edge(int a, int b) {
first = a;
second = b;
}
public int getFirst() {
return first;
}
public int getSecond() {
return second;
}
}
public static class Graph {
private Map<Integer, Map<Integer, Boolean>> incidentMatrix;
private List<Edge> edges; // = new ArrayList<>();
public Graph() {
incidentMatrix = new HashMap<>();
edges = new ArrayList<>();
}
public Set<Integer> vertices() {
return incidentMatrix.keySet();
}
public void addEdge(Edge edge) {
int a = edge.getFirst();
int b = edge.getSecond();
//System.out.println("addEdge: "+a+" "+b);
if (!incidentMatrix.containsKey(a)) {
incidentMatrix.put(a, new HashMap<>());
}
incidentMatrix.get(a).put(b,true);
if (!incidentMatrix.containsKey(b)) {
incidentMatrix.put(b, new HashMap<>());
}
incidentMatrix.get(b).put(a,true);
edges.add( edge );
//System.out.println(Arrays.toString(incidentMatrix.keySet().toArray()));
}
public void addNode(int a) {
if (!incidentMatrix.containsKey(a)) {
incidentMatrix.put(a, new HashMap<>());
}
}
public boolean containsEdge(Edge edge) {
return incidentMatrix.containsKey(edge.getFirst())
&& incidentMatrix.get(edge.getFirst()).containsKey(edge.getSecond());
}
public Edge getEdgeByNumber(int n) {
return edges.get(n-1);
}
public void removeEdge(Edge edge) {
int a = edge.getFirst();
int b = edge.getSecond();
incidentMatrix.get(a).remove(b);
incidentMatrix.get(b).remove(a);
}
public void makeSkeleton(Integer root, Graph skeleton, Set<Integer> visited, Map<Integer, Graph> skeletons) {
//System.out.println("makeSkeleton: "+root);
skeletons.put(root, skeleton);
//System.out.println(Arrays.toString(incidentMatrix.keySet().toArray()));
for (Integer neighbour: incidentMatrix.get(root).keySet()) {
if (visited.contains(neighbour)) {
//System.out.println("Skip: "+neighbour);
continue;
}
visited.add(neighbour);
skeleton.addEdge( new Edge( root, neighbour) );
makeSkeleton(neighbour, skeleton, visited, skeletons);
}
}
}
public static class DisjoinedSet {
Map<Integer, Graph> skeletonsByVertex;
int size;
public DisjoinedSet(Graph graph) {
skeletonsByVertex = new HashMap<>();
Set<Integer> visited = new HashSet<>();
size = 0;
for (Integer vertex: graph.vertices()) {
if (visited.contains(vertex))
continue;
Graph skeleton = new Graph();
//System.out.println("XmakeSkeleton: "+vertex);
graph.makeSkeleton(vertex, skeleton, visited, skeletonsByVertex);
size++;
}
}
public Graph getSkeletonByVertex(int n) {
return skeletonsByVertex.get(n);
}
public int size() {
return size;
}
public void update(Graph source, Edge removed) {
Set<Integer> visited = new HashSet<>();
size--;
int list[] = new int[]{ removed.getFirst(), removed.getSecond() };
for (int vertex: list) {
if (visited.contains(vertex))
continue;
Graph skeleton = new Graph();
source.makeSkeleton(vertex, skeleton, visited, skeletonsByVertex);
size++;
}
}
}