イメージ

graph TD
  A((0)) --> B((1))
  A --> C((4))
  B --> D((2))
  B --> E((3))
  C --> F((5))
  C --> G((6))

実装

グラフの隣接リスト表現g上を探索する

dfs.cpp
auto dfs = [&](auto self, int cv) -> void {
    seen[cv] = true;
    
    each(nv, g[cv]) {
        if (seen[nv]) continue;
        self(self, nv);
    }
};

木の場合

なら1つ前のノードさえ持っていれば良い

dfs.cpp
auto dfs = [&](auto self, int cv, int pv) -> void {
    each(nv, g[cv]) {
        if (nv == pv) continue;
        self(self, nv);
    }
};

バックトラック

一筆書きを探索する場合はseenを戻してやれば良い

dfs.cpp
auto dfs = [&](auto self, int cv) -> void {
    seen[cv] = true;
    
    each(nv, g[cv]) {
        if (seen[nv]) continue;
        self(self, nv);
    }
    seen[cv] = false;
};

ただし、グリッド上でやると かかる

参考

関連