|
| 1 | +// Strongly connected components of graph |
| 2 | +#include<bits/stdc++.h> |
| 3 | +using namespace std; |
| 4 | +void addEdge(vector<pair<int, int>> adj[], int u, int v, int w){ |
| 5 | +adj[u].push_back({v, w}); |
| 6 | +} |
| 7 | +void dfsrec(vector<pair<int, int>> adj[], int V, int u, vector<bool> &visited){ |
| 8 | +visited[u] = true; |
| 9 | +for(auto x : adj[u]){ |
| 10 | +if(!visited[x.first]) |
| 11 | +dfsrec(adj, V, x.first, visited); |
| 12 | +} |
| 13 | +cout << u << " "; |
| 14 | +} |
| 15 | +void dfs(vector<pair<int, int>> adj[], int V){ |
| 16 | +vector<bool> visited(V, false); |
| 17 | +if(V <= 0) |
| 18 | +return; |
| 19 | +cout << endl; |
| 20 | +for(int i = 0; i < V; i++){ |
| 21 | +if(!visited[i]){ |
| 22 | +dfsrec(adj, V, i, visited); |
| 23 | +} |
| 24 | +} |
| 25 | +cout << endl; |
| 26 | +} |
| 27 | +void indegree(vector<pair<int, int>> adj[], int V, vector<int> &indeg){ |
| 28 | +for(int i = 0; i < V; i++){ |
| 29 | +for(auto x : adj[i]){ |
| 30 | +indeg[x.first]++; |
| 31 | +} |
| 32 | +} |
| 33 | +} |
| 34 | +void dfsrec(vector<pair<int, int>> adj[], int u, stack<int> &s, vector<bool> &visited){ |
| 35 | +for(auto x : adj[u]){ |
| 36 | +if(!visited[x.first]) |
| 37 | +{ |
| 38 | +visited[x.first] = true; |
| 39 | +dfsrec(adj, x.first, s, visited); |
| 40 | +} |
| 41 | +} |
| 42 | +s.push(u); |
| 43 | +} |
| 44 | +void rev(vector<pair<int, int>> adj[], vector<pair<int, int>> adjrev[], int V){ |
| 45 | +for(int i = 0; i < V; i++){ |
| 46 | +for(auto x : adj[i]){ |
| 47 | +adjrev[x.first].push_back({i, 0}); |
| 48 | +} |
| 49 | +} |
| 50 | +} |
| 51 | +int scc(vector<pair<int, int>> adj[], int V){ |
| 52 | +stack<int> s; |
| 53 | +vector<bool> visited(V, false); |
| 54 | +for(int i = 0; i < V; i++){ |
| 55 | +if(!visited[i]){ |
| 56 | +visited[i] = true; |
| 57 | +dfsrec(adj, i, s, visited); |
| 58 | +} |
| 59 | +} |
| 60 | +//show(s); |
| 61 | +int c = 0; |
| 62 | +vector<pair<int, int>> adjrev[V]; |
| 63 | +rev(adj, adjrev, V); |
| 64 | +vector<bool> visitedd(V, false); |
| 65 | +cout << "Strongly connected components are\n"; |
| 66 | +while(!s.empty()){ |
| 67 | +int u = s.top(); |
| 68 | +s.pop(); |
| 69 | +if(!visitedd[u]){ |
| 70 | +dfsrec(adjrev, V, u, visitedd); |
| 71 | +cout << endl; |
| 72 | +c++; |
| 73 | +} |
| 74 | +} |
| 75 | +return c; |
| 76 | +} |
| 77 | +int main(){ |
| 78 | +int V = 6; |
| 79 | +vector<pair<int, int>> adj[V]; |
| 80 | +addEdge(adj, 0, 1, 10); |
| 81 | +addEdge(adj, 4, 2, 10); |
| 82 | +addEdge(adj, 4, 5, 30); |
| 83 | +addEdge(adj, 3, 4, 90); |
| 84 | +addEdge(adj, 2, 1, 10); |
| 85 | +addEdge(adj, 3, 5, 30); |
| 86 | +addEdge(adj, 1, 4, 90); |
| 87 | +addEdge(adj, 4, 0, 100); |
| 88 | +scc(adj, V); |
| 89 | +return 0; |
| 90 | +} |
0 commit comments