damihenrique

lixoo_tarjan

Sep 2nd, 2014
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.01 KB | None | 0 0
  1. vector<ii> adj[MAXV];
  2. int dfs_num[MAXV], dfs_low[MAXV], vis[MAXV];
  3. int dfsNumber, numSCC, V;
  4. vector<int> S;
  5.  
  6. void tarjan(int u) {
  7.  
  8.     dfs_low[u] = dfs_num[u] = dfsNumber++;
  9.     S.pb(u);
  10.     vis[u] = 1;
  11.     int tam = adj[u].size();
  12.     rep(j,0,tam){
  13.          ii v = adj[u][j];
  14.          if (dfs_num[v.first] == -1)
  15.              tarjan(v.first);
  16.          if (vis[v.first])
  17.              dfs_low[u] = min(dfs_low[u], dfs_low[v.first]);
  18.     }
  19.  
  20.     if (dfs_low[u] == dfs_num[u]) {
  21.         ++numSCC;  // componente numero (numSCC)
  22.         while (1) {
  23.              int v = S.back(); S.pop_back(); vis[v] = 0;
  24.             // v = vertices da componente atual(numSCC)
  25.              if (u == v) break;
  26.         }
  27.     }
  28. }
  29.  
  30.  
  31. int main(){
  32.    
  33.     V = 4;
  34.    
  35.     rep(i,0,V+1){
  36.         dfs_low[i] = vis[i] = 0;
  37.         dfs_num[i] = -1;
  38.     }
  39.  
  40.     dfsNumber = numSCC = 0;
  41.    
  42.     rep(i,0,V)
  43.         if (dfs_num[i] == -1)
  44.             tarjan(i);
  45.  
  46.     printf("Qtdade de SCC -> %d\n",numSCC);
  47.  
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment