bool[][], vector<bool>[], int[][] для мульти или взвешенного
-: перебор соседей O(n), память O(n2), неудобно хранить мульти-взвешенный граф+: наличие/добавление/удаление ребра за O(1)vector/set/list<int>[]
+: перебор соседей O(deg), память O(m)-: наличие/удаление ребра за O(deg) и O(log(deg))head[vertex], vector<edge> edges; struct edge { int to, next; };dfs(int v) // простейшая версия
.. if (visited[v]) return
.. visited[v] = true
.. for (int u : g[v]) dfs(u)
for (int i = 0; i < n; ++i) if (!visited[i]) dfs(i)