-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdegeneracy_ordering.h
More file actions
27 lines (26 loc) · 913 Bytes
/
degeneracy_ordering.h
File metadata and controls
27 lines (26 loc) · 913 Bytes
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
#include <vector>
#include <set>
template<typename AdjList>
std::vector<int> degeneracy_ordering(const AdjList& adj)
{
std::vector<int> ret;
ret.reserve(adj.size());
std::vector<std::pair<bool, int>> used_degree(adj.size());
std::set<std::pair<int, int>> degree_vertex;
for (int i = 0; i < static_cast<int>(adj.size()); ++i) {
used_degree[i].second = adj[i].size();
degree_vertex.emplace(used_degree[i].second, i);
}
while (!degree_vertex.empty()) {
auto dv = *degree_vertex.begin();
degree_vertex.erase(degree_vertex.begin());
ret.push_back(dv.second);
used_degree[dv.second].first = true;
for (int v : adj[dv.second]) {
if (used_degree[v].first) continue;
degree_vertex.erase({used_degree[v].second, v});
degree_vertex.emplace(--used_degree[v].second, v);
}
}
return ret;
}