1
+ #include < iostream>
2
+ #include < list>
3
+ #include < stack>
4
+ #define NIL -1
5
+ using namespace std ;
6
+
7
+ class Graph
8
+ {
9
+ int V;
10
+ list<int > *adj;
11
+
12
+
13
+ void SCCUtil (int u, int disc[], int low[],
14
+ stack<int > *st, bool stackMember[]);
15
+ public:
16
+ Graph (int V);
17
+ void addEdge (int v, int w);
18
+ void SCC ();
19
+ };
20
+
21
+ Graph::Graph (int V)
22
+ {
23
+ this ->V = V;
24
+ adj = new list<int >[V];
25
+ }
26
+
27
+ void Graph::addEdge (int v, int w)
28
+ {
29
+ adj[v].push_back (w);
30
+ }
31
+
32
+
33
+ void Graph::SCCUtil (int u, int disc[], int low[], stack<int > *st,
34
+ bool stackMember[])
35
+ {
36
+
37
+ static int time = 0 ;
38
+
39
+ disc[u] = low[u] = ++time;
40
+ st->push (u);
41
+ stackMember[u] = true ;
42
+
43
+
44
+ list<int >::iterator i;
45
+ for (i = adj[u].begin (); i != adj[u].end (); ++i)
46
+ {
47
+ int v = *i;
48
+
49
+
50
+ if (disc[v] == -1 )
51
+ {
52
+ SCCUtil (v, disc, low, st, stackMember);
53
+
54
+
55
+ low[u] = min (low[u], low[v]);
56
+ }
57
+
58
+
59
+ else if (stackMember[v] == true )
60
+ low[u] = min (low[u], disc[v]);
61
+ }
62
+
63
+
64
+ int w = 0 ;
65
+ if (low[u] == disc[u])
66
+ {
67
+ while (st->top () != u)
68
+ {
69
+ w = (int ) st->top ();
70
+ cout << w << " " ;
71
+ stackMember[w] = false ;
72
+ st->pop ();
73
+ }
74
+ w = (int ) st->top ();
75
+ cout << w << " n" ;
76
+ stackMember[w] = false ;
77
+ st->pop ();
78
+ }
79
+ }
80
+ void Graph::SCC ()
81
+ {
82
+ int *disc = new int [V];
83
+ int *low = new int [V];
84
+ bool *stackMember = new bool [V];
85
+ stack<int > *st = new stack<int >();
86
+
87
+
88
+ for (int i = 0 ; i < V; i++)
89
+ {
90
+ disc[i] = NIL;
91
+ low[i] = NIL;
92
+ stackMember[i] = false ;
93
+ }
94
+
95
+
96
+ for (int i = 0 ; i < V; i++)
97
+ if (disc[i] == NIL)
98
+ SCCUtil (i, disc, low, st, stackMember);
99
+ }
100
+
101
+ int main ()
102
+ {
103
+ cout << " nSCCs in first graph n" ;
104
+ Graph g1 (5 );
105
+ g1.addEdge (1 , 0 );
106
+ g1.addEdge (0 , 2 );
107
+ g1.addEdge (2 , 1 );
108
+ g1.addEdge (0 , 3 );
109
+ g1.addEdge (3 , 4 );
110
+ g1.SCC ();
111
+
112
+ cout << " nSCCs in second graph n" ;
113
+ Graph g2 (4 );
114
+ g2.addEdge (0 , 1 );
115
+ g2.addEdge (1 , 2 );
116
+ g2.addEdge (2 , 3 );
117
+ g2.SCC ();
118
+
119
+ cout << " nSCCs in third graph n" ;
120
+ Graph g3 (7 );
121
+ g3.addEdge (0 , 1 );
122
+ g3.addEdge (1 , 2 );
123
+ g3.addEdge (2 , 0 );
124
+ g3.addEdge (1 , 3 );
125
+ g3.addEdge (1 , 4 );
126
+ g3.addEdge (1 , 6 );
127
+ g3.addEdge (3 , 5 );
128
+ g3.addEdge (4 , 5 );
129
+ g3.SCC ();
130
+
131
+ cout << " nSCCs in fourth graph n" ;
132
+ Graph g4 (11 );
133
+ g4.addEdge (0 ,1 );g4.addEdge (0 ,3 );
134
+ g4.addEdge (1 ,2 );g4.addEdge (1 ,4 );
135
+ g4.addEdge (2 ,0 );g4.addEdge (2 ,6 );
136
+ g4.addEdge (3 ,2 );
137
+ g4.addEdge (4 ,5 );g4.addEdge (4 ,6 );
138
+ g4.addEdge (5 ,6 );g4.addEdge (5 ,7 );g4.addEdge (5 ,8 );g4.addEdge (5 ,9 );
139
+ g4.addEdge (6 ,4 );
140
+ g4.addEdge (7 ,9 );
141
+ g4.addEdge (8 ,9 );
142
+ g4.addEdge (9 ,8 );
143
+ g4.SCC ();
144
+
145
+ cout << " nSCCs in fifth graph n" ;
146
+ Graph g5 (5 );
147
+ g5.addEdge (0 ,1 );
148
+ g5.addEdge (1 ,2 );
149
+ g5.addEdge (2 ,3 );
150
+ g5.addEdge (2 ,4 );
151
+ g5.addEdge (3 ,0 );
152
+ g5.addEdge (4 ,2 );
153
+ g5.SCC ();
154
+
155
+ return 0 ;
156
+ }
0 commit comments