bool get( int n, unsigned char *r, int ix ) { return ( r[ ix / 8 ] >> ( ix % 8 ) ) & 0x01; } void set( int n, unsigned char *r, int ix ) { r[ ix / 8 ] |= 0x01 << ( ix % 8 ); } int index( int n, int i, int j ) { return n * i + j; } bool add_transitivity( int n, unsigned char *r ) { bool changed = false; for ( int i = 0; i < n; ++ i ) { for ( int j = 0; j < n; ++ j ) { if ( !get( n, r, index( n, i, j ) ) ) continue; for ( int k = 0; k < n; ++ k ) { if ( !get( n, r, index( n, i, k ) ) && get( n, r, index( n, j, k ) ) ) { changed = true; set( n, r, index( n, i, k ) ); } } } } return changed; } void make_transitive( int n, unsigned char *r ) { while ( add_transitivity( n, r ) ) ; }