algo

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

View the Project on GitHub dnx04/algo

:heavy_check_mark: graph/EnumTriangles.h

Verified with

Code

template <class F>
void EnumTriangles(int n, const vector<pii>& ed, F f) {  // 0-indexed graph
  vi deg(n);
  for (auto [u, v] : ed) ++deg[u], ++deg[v];
  vector<vi> g(n);  // directed
  for (auto& e : ed) {
    auto [u, v] = e;
    if (tie(deg[u], u) > tie(deg[v], v)) swap(u, v);
    g[u].eb(v);
  }
  vector<bool> adj(n);
  for (auto& [u, v] : ed) {
    for (auto nu : g[u]) adj[nu] = true;
    for (auto nv : g[v]) {
      if (adj[nv]) f(u, v, nv);
    }
    for (auto nu : g[u]) adj[nu] = false;
  }
}
#line 1 "graph/EnumTriangles.h"
template <class F>
void EnumTriangles(int n, const vector<pii>& ed, F f) {  // 0-indexed graph
  vi deg(n);
  for (auto [u, v] : ed) ++deg[u], ++deg[v];
  vector<vi> g(n);  // directed
  for (auto& e : ed) {
    auto [u, v] = e;
    if (tie(deg[u], u) > tie(deg[v], v)) swap(u, v);
    g[u].eb(v);
  }
  vector<bool> adj(n);
  for (auto& [u, v] : ed) {
    for (auto nu : g[u]) adj[nu] = true;
    for (auto nv : g[v]) {
      if (adj[nv]) f(u, v, nv);
    }
    for (auto nu : g[u]) adj[nu] = false;
  }
}
Back to top page