-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdfs.h
59 lines (45 loc) · 1.28 KB
/
dfs.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
#ifndef __DFS__
#define __DFS__
#include <stack>
using namespace std;
template<typename V, template<typename,typename> class E, typename D>
class DepthFirstIterator {
public:
DepthFirstIterator(Graph<V,E,D>* g) : graph(g) {
set<V*> vertices = graph->getAllVertices();
vStack.push(*(vertices.begin()));
}
DepthFirstIterator(Graph<V,E,D>* g, V* s) : graph(g), startVertex(s) {
vStack.push(startVertex);
}
bool hasNext() {
return !vStack.empty();
}
V* getNext() {
if (hasNext()) {
V* current = vStack.top();
vStack.pop();
extendVisit(current);
return current;
}
return NULL;
}
private:
Graph<V,E,D>* graph;
V* startVertex;
stack<V*> vStack;
set<V*> markSet;
void extendVisit(V* current) {
set<V*> adjVertices = graph->verticesFrom(current);
typename set<V*>::iterator it;
for (it = adjVertices.begin(); it != adjVertices.end(); ++it) {
V* v = *it;
// not visited yet
if (markSet.find(v) == markSet.end()) {
vStack.push(v);
markSet.insert(v);
}
}
}
};
#endif