CP-templates

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Misuki743/CP-templates

:heavy_check_mark: graph/treeHash.cpp

Verified with

Code

template<bool ordered = false>
pair<int, vector<int>> treeHash(vector<vector<int>> &g, int root = 0) {
  int nxt = 0;
  static map<vector<int>, int> toId;
  vector<int> id(ssize(g));
  auto dfs = [&](int v, int p, auto self) -> int {
    vector<int> seq;
    seq.reserve(ssize(g[v]));
    for(int x : g[v]) if (x != p)
      seq.emplace_back(self(x, v, self));
    if constexpr (!ordered)
      ranges::sort(seq);
    if (!toId.contains(seq))
      toId[seq] = nxt++;
    return id[v] = toId[seq];
  };

  dfs(root, -1, dfs);

  return make_pair(nxt, id);
}
#line 1 "graph/treeHash.cpp"
template<bool ordered = false>
pair<int, vector<int>> treeHash(vector<vector<int>> &g, int root = 0) {
  int nxt = 0;
  static map<vector<int>, int> toId;
  vector<int> id(ssize(g));
  auto dfs = [&](int v, int p, auto self) -> int {
    vector<int> seq;
    seq.reserve(ssize(g[v]));
    for(int x : g[v]) if (x != p)
      seq.emplace_back(self(x, v, self));
    if constexpr (!ordered)
      ranges::sort(seq);
    if (!toId.contains(seq))
      toId[seq] = nxt++;
    return id[v] = toId[seq];
  };

  dfs(root, -1, dfs);

  return make_pair(nxt, id);
}
Back to top page