Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Strongly Connected Components */
- /* Author : M. A. Rafsan Mazumder */
- #include <bits/stdc++.h>
- using namespace std;
- #define MAX 10005
- vector<int> adj[MAX];
- vector<int> revAdj[MAX];
- bool vis[MAX];
- stack<int> S;
- void stackEmpty()
- {
- while(!S.empty()){
- S.pop();
- }
- }
- void dfs(int u)
- {
- vis[u] = true;
- for(int i=0; i<adj[u].size(); i++){
- int v = adj[u][i];
- if(!vis[v]) dfs(v);
- }
- S.push(u);
- }
- void dfs2(int u)
- {
- vis[u] = true;
- for(int i=0; i<revAdj[u].size(); i++){
- int v = revAdj[u][i];
- if(!vis[v]) dfs2(v);
- }
- }
- int main()
- {
- stackEmpty();
- int n, m;
- scanf("%d %d", &n, &m);
- for(int i=1; i<=m; i++){
- int u, v;
- scanf("%d %d", &u, &v);
- adj[u].push_back(v);
- revAdj[v].push_back(u);
- }
- memset(vis, false, sizeof vis);
- for(int i=1; i<=n; i++){
- if(!vis[i]) dfs(i);
- }
- memset(vis, false, sizeof vis);
- int cnt = 0;
- while(!S.empty()){
- int t = S.top();
- S.pop();
- if(!vis[t]){
- cnt++;
- dfs2(t);
- }
- }
- printf("%d", cnt);
- }
Advertisement
Add Comment
Please, Sign In to add comment