==== Codes ==== DFS in a directed graph. Using linked lists representation. \\ With additional bonus: Makes a topological ordering when the graph is a DAG. vector > arc; // edge == arc in a directed graph vector visited; // needed for DFS vector topSort; // nodes in topological order void DFS_rec( int node ){ visited[node] = true; for( int j = 0; j < arc[node].size(); j++ ) if( !visited[arc[node][j]] ) DFS_rec( arc[node][j] ); topSort.push_back( node ); } void DFS(){ std::fill( visited.begin(), visited.end(), false ); topSort.clear(); for( int start = 0; start < N; start++ ) if( !visited[start] ) DFS_rec( start ); } // DFS close times of nodes not used here, // the order of nodes in the array topSort // defines a topological order. // Because of the main fact: // The nodes in DAG during DFS are being closed // in reverse topological order.