Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define forr(i, a, b) for(int i = (a); i < (int)(b); i++)
  4. #define forn(i, n) forr(i, 0, n)
  5. #define forall(it, v) for(auto it = v.begin(); it != v.end(); ++it)
  6. #define dforn(i, n) for(int i = n - 1; i >= 0; i--)
  7. #define db(v) cerr << #v << " = " << v << endl
  8. #define pb push_back
  9. typedef long long ll;
  10. const int MAXN = 20050;
  11.  
  12. int tc, n, m, nCC, color[MAXN];
  13. vector<int> G[MAXN], H[MAXN], topsort, CC[MAXN];
  14. set<int> ADY[MAXN];
  15. bool used[MAXN], contado[MAXN];
  16.  
  17. void limpiar(){
  18.   forn(i, MAXN){
  19.     G[i].clear();
  20.     H[i].clear();
  21.     CC[i].clear();
  22.     ADY[i].clear();
  23.   }
  24.   nCC = 0;
  25.   topsort.clear();
  26.   memset(contado, false, sizeof contado);
  27.   memset(color, 0, sizeof color);
  28.   memset(used, false, sizeof used);
  29. }
  30.  
  31. void dfs(int v, int p){
  32.   used[v] = true;
  33.   forn(i, G[v].size()){
  34.     int w = G[v][i];
  35.     if(w == p) continue;
  36.     if(used[w]) continue;
  37.     dfs(w, v);
  38.   }
  39.   topsort.push_back(v);
  40. }
  41.  
  42. void dfs_reverse(int v, int p, int c){
  43.   //~ printf("Visitando %d con color %d\n", v + 1, c + 1);
  44.   used[v] = true;
  45.   color[v] = c;
  46.   CC[c].push_back(v);
  47.   forn(i, H[v].size()){
  48.     int w = H[v][i];
  49.     if(w == p) continue;
  50.     if(used[w]) continue;
  51.     dfs_reverse(w, v, c);
  52.   }
  53. }
  54.  
  55. int main() {
  56.   scanf("%d", &tc);
  57.   while(tc--){
  58.     limpiar();
  59.     scanf("%d %d", &n, &m);
  60.     forn(i, m){
  61.       int a, b;
  62.       scanf("%d %d", &a, &b);
  63.       --a; --b;
  64.       G[a].pb(b);
  65.       H[b].pb(a);
  66.     }
  67.     forn(i, n){
  68.       if(!used[i]){
  69.         dfs(i, -1);
  70.       }
  71.     }
  72.     reverse(topsort.begin(), topsort.end());
  73.     memset(used, false, sizeof used);
  74.     forn(i, topsort.size()){
  75.       int v = topsort[i];
  76.       if(!used[v]){
  77.         dfs_reverse(v, -1, nCC++);
  78.       }
  79.     }
  80.    
  81.     forn(i, nCC){
  82.       printf("CC %d\n", i + 1);
  83.       forn(j, CC[i].size()){
  84.         printf("%d ", CC[i][j] + 1);
  85.       }
  86.       puts("");
  87.     }
  88.    
  89.     forn(i, nCC){
  90.       forn(j, CC[i].size()){
  91.         int v = CC[i][j];
  92.         forn(k, G[v].size()){
  93.           int to = G[v][k];
  94.           if(to == i) continue;
  95.           ADY[i].insert( color[to] );
  96.         }
  97.       }
  98.     }
  99.    
  100.     int ans = nCC;
  101.     forn(i, nCC){
  102.       printf("Desde CC %d:\n", i + 1);
  103.       forall(it, ADY[i]){
  104.         int to = *it;
  105.         printf(" --> %d\n", to);
  106.         if(!contado[to]){
  107.           contado[to] = true;
  108.           ans--;
  109.         }
  110.       }
  111.     }
  112.    
  113.     printf("%d\n", ans);
  114.   }
  115.   return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement