/** Силно свързани компоненти на ориентиран граф. DFS() + DFS() на транспонирания граф, с обходени в обратния на finalized ред върхове. */ #include #include #include using namespace std; const int n = 8; vector graph[n] = { { 4 }, { 0 }, { 1, 3 }, { 2 }, { 1 }, { 1, 4, 6 }, { 2, 5 }, { 3, 6 } }; vector tgraph[n]; pair finalized[n]; bool visited[n]; int time; void DFS_visit(int u) { visited[u] = true; ++time; for (int v : graph[u]) if (!visited[v]) DFS_visit(v); finalized[u] = pair(u, ++time); } void DFS() { time = 0; for (int i = 0; i < n; i++) visited[i] = false; for (int i = 0; i < n; i++) if (!visited[i]) DFS_visit(i); } void SCC_visit(int u) { visited[u] = true; cout << u << " "; for (int v : tgraph[u]) if (!visited[v]) SCC_visit(v); } void SCC() { DFS(); //DFS for (int i = 0; i < n; i++) for (int u : graph[i]) tgraph[u].push_back(i); // транспонираният граф for (int i = 0; i < n; i++) visited[i] = false; sort(finalized, finalized + n, [](pair p1, pair p2){return p1.second > p2.second; }); // сортираме finalized в обратен ред for (int i = 0; i < n; i++) if (!visited[finalized[i].first]) // SCC_Visit в обратния ред на finalized { SCC_visit(finalized[i].first); cout << endl; } } int main() { SCC(); return 0; }