/** Бонус: Алгоритъм на Таржан за силно свързани компоненти на ориентиран граф */ #include #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 } }; int index[n]; int low_index[n]; bool in_stack[n]; stack s; int ind; int x; void SCC_Visit(int u) { index[u] = ind; low_index[u] = ind++; s.push(u); in_stack[u] = true; for (int v : graph[u]) if (index[v] == -1) { SCC_Visit(v); low_index[u] = min(low_index[u], low_index[v]); } else if (in_stack[v]) low_index[u] = min(low_index[u], index[v]); if (index[u] == low_index[u]) do { x = s.top(); s.pop(); in_stack[x] = false; cout << x << " "; } while (x != u); } void SCC() { ind = 0; for (int i = 0; i < n; i++) index[i] = -1; for (int i = 0; i < n; i++) if (index[i] == -1){ SCC_Visit(i); cout << endl; } } int main() { SCC(); return 0; }