szabivan

TOUR v2

Oct 25th, 2013
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.14 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int theGraph[1001][1001];
  5. int theTransposedGraph[1001][1001];
  6. int degreeG[1001];
  7. int degreeTG[1001];
  8.  
  9. int bfsOrder[ 1001 ];
  10. int bfsSp;
  11.  
  12. int visited[ 1001 ];
  13. int sizes[ 1001 ];
  14.  
  15. inline void initCase( int n ){
  16.   memset( degreeG, 0, sizeof(int)*(n+1));
  17.   memset( degreeTG, 0, sizeof(int)*(n+1));
  18.   memset( visited, 0, sizeof(int)*(n+1));
  19.   bfsSp = 0;
  20. }
  21.  
  22. void bfs( int node ){
  23.   if( visited[ node ] ) return;
  24.   visited[ node ] = 1;
  25.   for( int i = 0; i < degreeG[ node ]; i++ ){ bfs(theGraph[node][i]); }
  26.   bfsOrder[ bfsSp++ ] = node;
  27. }
  28.  
  29. void bfsTransposed( int node, int componentCount ){
  30.   if( visited[ node ] ) return;
  31.   visited[ node ] = componentCount;
  32.   sizes[ componentCount ]++;
  33.   for( int i = 0; i < degreeTG[ node ]; i++ ){
  34.     bfsTransposed( theTransposedGraph[node][i], componentCount );
  35.   }
  36. }
  37.  
  38. int outDegree[ 1001 ];
  39. inline int getUniqueSinkSize( int n, int componentCount ){
  40.   int i, zeros = componentCount;
  41.   memset( outDegree, 0, sizeof( int)*(componentCount+1) );
  42.   for( i = 1; i <= n; i++ ){
  43.     if( outDegree[ visited[ i ] ] ) continue;
  44.     for( int j = 0; j < degreeG[i]; j++ ){
  45.       if( visited[ i ] == visited[ theGraph[i][j] ] ) continue;
  46.       if( 0 == ( outDegree[ visited[ i ] ]++ ) ) { zeros--; break ; }
  47.     }
  48.   }
  49.   if( zeros != 1 ) return 0;
  50.   for( i = 1; i <= componentCount; i++ ) if( outDegree[ i ] == 0 ) {
  51.     return sizes[ componentCount ];
  52.   }
  53. }
  54.  
  55. int main( int argc, char* argv[] ){
  56.   int t, n, i, j, k;
  57.   scanf("%d",&t);
  58.   while( t-- ){
  59.     scanf("%d",&n);
  60.     initCase( n );
  61.     for( i = 1; i <= n; i++ ){
  62.       scanf("%d",&k);
  63.       while( k-- ){
  64.         scanf("%d",&j);
  65.         theGraph[i][ degreeG[i]++ ] = j;
  66.         theTransposedGraph[j][ degreeTG[j]++ ] = i;
  67.       }
  68.     }
  69.     for( i = 1; i <= n; i++ ){
  70.       bfs( i );
  71.     }
  72.     memset( visited, 0, sizeof(int)*(n+1) );
  73.     j = 0;
  74.     while( bfsSp ){
  75.       if( !visited[ bfsOrder[ bfsSp - 1 ] ] ){
  76.         j++;
  77.         sizes[ j ] = 0;
  78.         bfsTransposed( bfsOrder[ bfsSp - 1 ], j );
  79.       }
  80.       bfsSp--;
  81.     }
  82.     printf("%d\n",getUniqueSinkSize( n, j ) );
  83.   }
  84.   return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment