Постоянно сталкиваясь с проблемами олимпиад на графах, я всегда писал довольно длинный код для реализации DFS, и для его отладки требовалось много времени. Я написал такие конструкции:
class Graph {
int V;
list<int> *adj;
public:
Graph(int V);
void addEdge(int v, int w);
void DFS(int s, int f);
};
Graph::Graph(int V) {
this->V = V;
adj = new list<int>[V];
}
void Graph::addEdge(int v, int w) {
adj[v].push_back(w);
adj[w].push_back(v);
}
void Graph::DFS(int s,int f) {
vector<bool> visited(V, false);
stack<int> stack;
stack.push(s);
while (!stack.empty()) {
s = stack.top();
stack.pop();
if (!visited[s]) {
cout << s << " ";
visited[s] = true;
}
for (list<int>::iterator i = adj[s].begin(); i != adj[s].end(); ++i)
if (!visited[*i])
stack.push(*i);
}
}
Это было долго и неудобно, особенно при смене языка на другой. Это особенно сложно при написании с нуля. Мне нужен оптимальный подход для реализации DFS / BFS как можно более кратко и элегантно, желательно в форме аккуратного метода, который принимает входные значения в форме (начало, конец).