class Solution :
def checkIfPrerequisite ( self, n: int , prerequisites: List[ List[ int ] ] , queries: List[ List[ int ] ] ) - > List[ bool ] :
d = [ [ False ] * n for _ in range ( n) ]
for i, j in prerequisites:
d[ i] [ j] = True
for k, i, j in itertools. product( range ( n) , repeat= 3 ) :
d[ i] [ j] = ( d[ i] [ j] ) | ( d[ i] [ k] & d[ k] [ j] )
return [ d[ i] [ j] for i, j in queries]
// class Solution {
// public:
// map< pair< int,int> ,bool> mp;
// bool dfs( vector< vector< int>> & graph,int u,int end) {
// if( u== end) {
// mp[ make_pair( u,u) ] = true;
// return true ;
// }
// if( mp.find( make_pair( u,end)) != mp.end( )) return mp[ make_pair( u,end) ] ;
// for( auto v:graph[ u] ) {
// if( dfs( graph,v,end)) {
// mp[ make_pair( v,end) ] = true;
// return true ;
// }
// }
// mp[ make_pair( u,end) ] = false;
// return false ;
// }
// vector< bool> checkIfPrerequisite( int n, vector< vector< int>> & prerequisites, vector< vector< int>> & queries) {
// vector< vector< int>> graph;
// graph.resize( n) ;
// for( auto v: prerequisites) {
// graph[ v[ 0] ] .push_back( v[ 1] ) ;
// }
// vector< bool> res;
// for( auto query:queries) {
// res.push_back( dfs( graph,query[ 0] ,query[ 1] )) ;
// }
// return res;
// }
// } ;
class Solution {
public:
vector< bool> checkIfPrerequisite( int n, vector< vector< int>> & prerequisites, vector< vector< int>> & queries) {
vector< vector< int>> d( n,vector< int> ( n,0)) ;
for( auto pre:prerequisites) {
d[ pre[ 0] ] [ pre[ 1] ] = 1;
}
for( int k= 0; k< n; k++) {
for( int i= 0; i< n; i++) {
for( int j= 0; j< n; j++) {
d[ i] [ j] = d[ i] [ j] || ( d[ i] [ k] && d[ k] [ j] ) ;
}
}
}
vector< bool> res;
for( auto query:queries) {
res.push_back( d[ query[ 0] ] [ query[ 1] ] ) ;
}
return res;
}
} ;