-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathCC.h
131 lines (116 loc) · 4.18 KB
/
CC.h
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
#ifndef CH4_CC_H
#define CH4_CC_H
// TODO: add EdgeWeightedGraph
#include "../head/Graph.h"
/**
* The {@code CC} class represents a data type for
* determining the connected components in an undirected graph.
* The <em>id</em> operation determines in which connected component
* a given vertex lies; the <em>connected</em> operation
* determines whether two vertices are in the same connected component;
* the <em>count</em> operation determines the number of connected
* components; and the <em>size</em> operation determines the number
* of vertices in the connect component containing a given vertex.
* The <em>component identifier</em> of a connected component is one of the
* vertices in the connected component: two vertices have the same component
* identifier if and only if they are in the same connected component.
* <p>
* This implementation uses depth-first search.
* The constructor takes time proportional to <em>V</em> + <em>E</em>
* (in the worst case),
* where <em>V</em> is the number of vertices and <em>E</em> is the number of edges.
* Afterwards, the <em>id</em>, <em>count</em>, <em>connected</em>,
* and <em>size</em> operations take constant time.
* <p>
* For additional documentation, see <a href="https://algs4.cs.princeton.edu/41graph">Section 4.1</a>
* of <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne.
*
* @author Robert Sedgewick
* @author Kevin Wayne
*/
class CC {
public:
/**
* Computes the connected components of the undirected graph {@code G}.
*
* @param G the undirected graph
*/
CC(Graph &G) : marked(G.getV()), id(G.getV()), size(G.getV()), count(0) {
for (int v = 0; v < G.getV(); v++) {
if (!marked[v]) {
dfs(G, v);
count++;
}
}
}
/**
* Returns the component id of the connected component containing vertex {@code v}.
*
* @param v the vertex
* @return the component id of the connected component containing vertex {@code v}
* @throws IllegalArgumentException unless {@code 0 <= v < V}
*/
int getid(int v) {
validateVertex(v);
return id[v];
}
/**
* Returns the number of vertices in the connected component containing vertex {@code v}.
*
* @param v the vertex
* @return the number of vertices in the connected component containing vertex {@code v}
* @throws IllegalArgumentException unless {@code 0 <= v < V}
*/
int getsize(int v) {
validateVertex(v);
return size[id[v]];
}
/**
* Returns the number of connected components in the graph {@code G}.
*
* @return the number of connected components in the graph {@code G}
*/
int getcount() {
return count;
}
/**
* Returns true if vertices {@code v} and {@code w} are in the same
* connected component.
*
* @param v one vertex
* @param w the other vertex
* @return {@code true} if vertices {@code v} and {@code w} are in the same
* connected component; {@code false} otherwise
* @throws IllegalArgumentException unless {@code 0 <= v < V}
* @throws IllegalArgumentException unless {@code 0 <= w < V}
*/
bool connected(int v, int w) {
validateVertex(v);
validateVertex(w);
return getid(v) == getid(w);
}
private:
// depth-first search for a Graph
void dfs(Graph G, int v) {
marked[v] = true;
id[v] = count;
size[count]++;
for (int w : G.getadj(v)) {
if (!marked[w]) {
dfs(G, w);
}
}
}
// throw an IllegalArgumentException unless {@code 0 <= v < V}
void validateVertex(int v) {
int V = marked.size();
if (v < 0 || v >= V)
throw runtime_error("vertex " + to_string(v) + " is not between 0 and " + to_string(V - 1));
}
private:
vector<bool> marked; // marked[v] = has vertex v been marked?
vector<int> id; // id[v] = id of connected component containing v
vector<int> size; // size[id] = number of vertices in given component
int count; // number of connected components
};
#endif //CH4_CC_H