-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathVertex.cpp
88 lines (73 loc) · 1.39 KB
/
Vertex.cpp
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
#include <algorithm>
#include<unordered_set>
#include<set>
#include<vector>
#include<string>
#include<set>
#include<iterator>
#include "Vertex.h"
int G_VertexID = 0;
Vertex::Vertex(const string & name) : Vertex(++G_VertexID, name)
{
}
Vertex::~Vertex()
{
}
std::ostream & operator<<(std::ostream & out, const Vertex & v)
{
out << v.getName();
return out;
}
std::ostream & operator<<(std::ostream & out, const VertexSet & v)
{
out << "(";
for (auto it = v.cbegin(); it != v.cend();) {
out << (*it)->getName();
if (++it != v.cend())
out << ",";
}
out << ")";
return out;
}
powerset_type powerset(set_type const& set)
{
typedef set_type::const_iterator set_iter;
typedef std::vector<set_iter> vec;
typedef vec::iterator vec_iter;
struct local
{
static VertexSharedPtr dereference(set_iter v) { return *v; }
};
powerset_type result;
vec elements;
do
{
set_type tmp;
transform(elements.begin(), elements.end(),
std::inserter(tmp, tmp.end()),
local::dereference);
result.insert(tmp);
if (!elements.empty() && ++elements.back() == set.end())
{
elements.pop_back();
}
else
{
set_iter iter;
if (elements.empty())
{
iter = set.begin();
}
else
{
iter = elements.back();
++iter;
}
for (; iter != set.end(); ++iter)
{
elements.push_back(iter);
}
}
} while (!elements.empty());
return result;
}