#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
template < class T> struct cLtraits_identity{
using type = T;
}
;
template < class T> using cLtraits_try_make_signed =
typename conditional<
is_integral< T> :: value ,
make_signed< T> ,
cLtraits_identity< T>
> :: type ;
template < class S, class T> struct cLtraits_common_type{
using tS = typename cLtraits_try_make_signed< S> :: type ;
using tT = typename cLtraits_try_make_signed< T> :: type ;
using type = typename common_type< tS,tT> :: type ;
}
;
void * wmem;
char memarr[ 96000000 ] ;
template < class S, class T> inline auto max_L( S a, T b)
- > typename cLtraits_common_type< S,T> :: type {
return ( typename cLtraits_common_type< S,T> :: type ) a >= ( typename cLtraits_common_type< S,T> :: type ) b ? a : b;
}
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
struct graph{
int N;
int * es;
int ** edge;
void setDirectEdge( int N__, int M, int A[ ] , int B[ ] , void ** mem = & wmem) {
int i;
N = N__;
walloc1d( & es, N, mem) ;
walloc1d( & edge, N, mem) ;
walloc1d( & edge[ 0 ] , M, mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
es[ A[ i] ] ++ ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
walloc1d( & edge[ i] , es[ i] , mem) ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
es[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
edge[ A[ i] ] [ es[ A[ i] ] ++ ] = B[ i] ;
}
}
int TopologicalSort( int res[ ] , void * mem= wmem) {
int i;
int j;
int k;
int rs;
int * deg;
int * q;
int qs = 0 ;
int qe = 0 ;
walloc1d( & deg, N, & mem) ;
walloc1d( & q, N, & mem) ;
rs = 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
deg[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
deg[ edge[ i] [ j] ] ++ ;
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
if ( deg[ i] == 0 ) {
q[ qe++ ] = i;
}
}
while ( qs < qe) {
i = q[ qs++ ] ;
res[ rs++ ] = i;
for ( j= ( 0 ) ; j< ( es[ i] ) ; j++ ) {
k = edge[ i] [ j] ;
deg[ k] -- ;
if ( deg[ k] == 0 ) {
q[ qe++ ] = k;
}
}
}
if ( rs== N) {
return 1 ;
}
return 0 ;
}
}
;
template < class T, class S> inline int vec2arr( vector< T> & v, S arr[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] = v[ i] ;
}
return N;
}
template < class T, class S1, class S2> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
}
return N;
}
template < class T, class S1, class S2, class S3> inline int vec2arr( vector< vector< T>> & v, S1 arr1[ ] , S2 arr2[ ] , S3 arr3[ ] ) {
int i;
int N = v.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr1[ i] = v[ i] [ 0 ] ;
arr2[ i] = v[ i] [ 1 ] ;
arr3[ i] = v[ i] [ 2 ] ;
}
return N;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
int M;
int A[ 100000 ] ;
int B[ 100000 ] ;
int ord[ 100000 ] ;
int dp[ 100000 ] ;
graph g;
class Solution{
public :
int minimumTime( int N, vector< vector< int >> & relations, vector< int > & T) {
int Q5VJL1cS, i;
dummy_main( ) ;
M = vec2arr( relations, B, A) ;
for ( i= ( 0 ) ; i< ( M) ; i++ ) {
A[ i] -- ;
B[ i] -- ;
}
g.setDirectEdge ( N,M,A,B) ;
g.TopologicalSort ( ord) ;
for ( Q5VJL1cS= ( N) - 1 ; Q5VJL1cS>= ( 0 ) ; Q5VJL1cS-- ) {
int RZTsC2BF;
auto & i = ord[ Q5VJL1cS] ;
dp[ i] = T[ i] ;
for ( RZTsC2BF= ( 0 ) ; RZTsC2BF< ( g.es [ i] ) ; RZTsC2BF++ ) {
auto & j = g.edge [ i] [ RZTsC2BF] ;
chmax( dp[ i] , dp[ j] + T[ i] ) ;
}
}
int WYIGIcGE;
cLtraits_try_make_signed< remove_reference< decltype( ( * ( ( int * ) NULL ) ) ) > :: type > :: type t_ynMSdg;
if ( N== 0 ) {
t_ynMSdg = 0 ;
}
else {
t_ynMSdg = dp[ 0 ] ;
for ( WYIGIcGE= ( 1 ) ; WYIGIcGE< ( N) ; WYIGIcGE++ ) {
t_ynMSdg = max_L( t_ynMSdg, dp[ WYIGIcGE] ) ;
}
}
return t_ynMSdg;
}
}
;
// cLay version 20211024-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int M, A[1d5], B[], ord[], dp[];
// graph g;
//
// class Solution {
// public:
// int minimumTime(int N, VVI& relations, VI& T) {
// dummy_main();
// M = vec2arr(relations, B, A);
// rep(i,M) A[i]--, B[i]--;
// g.setDirectEdge(N,M,A,B);
// g.TopologicalSort(ord);
// rrep[ord](i,N){
// dp[i] = T[i];
// rep[g.edge[i]](j,g.es[i]) dp[i] >?= dp[j] + T[i];
// }
// return max(dp(N));
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgY0x0cmFpdHNfaWRlbnRpdHl7CiAgdXNpbmcgdHlwZSA9IFQ7Cn0KOwp0ZW1wbGF0ZTxjbGFzcyBUPiB1c2luZyBjTHRyYWl0c190cnlfbWFrZV9zaWduZWQgPQogIHR5cGVuYW1lIGNvbmRpdGlvbmFsPAogICAgaXNfaW50ZWdyYWw8VD46OnZhbHVlLAogICAgbWFrZV9zaWduZWQ8VD4sCiAgICBjTHRyYWl0c19pZGVudGl0eTxUPgogICAgPjo6dHlwZTsKdGVtcGxhdGUgPGNsYXNzIFMsIGNsYXNzIFQ+IHN0cnVjdCBjTHRyYWl0c19jb21tb25fdHlwZXsKICB1c2luZyB0UyA9IHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3NpZ25lZDxTPjo6dHlwZTsKICB1c2luZyB0VCA9IHR5cGVuYW1lIGNMdHJhaXRzX3RyeV9tYWtlX3NpZ25lZDxUPjo6dHlwZTsKICB1c2luZyB0eXBlID0gdHlwZW5hbWUgY29tbW9uX3R5cGU8dFMsdFQ+Ojp0eXBlOwp9CjsKdm9pZCp3bWVtOwpjaGFyIG1lbWFycls5NjAwMDAwMF07CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBhdXRvIG1heF9MKFMgYSwgVCBiKQotPiB0eXBlbmFtZSBjTHRyYWl0c19jb21tb25fdHlwZTxTLFQ+Ojp0eXBlewogIHJldHVybiAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYSA+PSAodHlwZW5hbWUgY0x0cmFpdHNfY29tbW9uX3R5cGU8UyxUPjo6dHlwZSkgYiA/IGEgOiBiOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4LCB2b2lkICoqbWVtID0gJndtZW0pewogIHN0YXRpYyBpbnQgc2tpcFsxNl0gPSB7MCwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMX07CiAgKCptZW0pID0gKHZvaWQqKSggKChjaGFyKikoKm1lbSkpICsgc2tpcFsoKHVuc2lnbmVkIGxvbmcgbG9uZykoKm1lbSkpICYgMTVdICk7CiAgKCphcnIpPShUKikoKm1lbSk7CiAgKCptZW0pPSgoKmFycikreCk7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgxLCBpbnQgeDIsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgd2FsbG9jMWQoYXJyLCB4Mi14MSwgbWVtKTsKICAoKmFycikgLT0geDE7Cn0KdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgY2htYXgoUyAmYSwgVCBiKXsKICBpZihhPGIpewogICAgYT1iOwogIH0KICByZXR1cm4gYTsKfQpzdHJ1Y3QgZ3JhcGh7CiAgaW50IE47CiAgaW50KmVzOwogIGludCoqZWRnZTsKICB2b2lkIHNldERpcmVjdEVkZ2UoaW50IE5fXywgaW50IE0sIGludCBBW10sIGludCBCW10sIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgICBpbnQgaTsKICAgIE4gPSBOX187CiAgICB3YWxsb2MxZCgmZXMsIE4sIG1lbSk7CiAgICB3YWxsb2MxZCgmZWRnZSwgTiwgbWVtKTsKICAgIHdhbGxvYzFkKCZlZGdlWzBdLCBNLCBtZW0pOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGVzW2ldID0gMDsKICAgIH0KICAgIGZvcihpPSgwKTtpPChNKTtpKyspewogICAgICBlc1tBW2ldXSsrOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIHdhbGxvYzFkKCZlZGdlW2ldLCBlc1tpXSwgbWVtKTsKICAgIH0KICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBlc1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTSk7aSsrKXsKICAgICAgZWRnZVtBW2ldXVtlc1tBW2ldXSsrXSA9IEJbaV07CiAgICB9CiAgfQogIGludCBUb3BvbG9naWNhbFNvcnQoaW50IHJlc1tdLCB2b2lkICptZW09d21lbSl7CiAgICBpbnQgaTsKICAgIGludCBqOwogICAgaW50IGs7CiAgICBpbnQgcnM7CiAgICBpbnQqZGVnOwogICAgaW50KnE7CiAgICBpbnQgcXMgPSAwOwogICAgaW50IHFlID0gMDsKICAgIHdhbGxvYzFkKCZkZWcsIE4sICZtZW0pOwogICAgd2FsbG9jMWQoJnEsIE4sICZtZW0pOwogICAgcnMgPSAwOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGRlZ1tpXSA9IDA7CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgZm9yKGo9KDApO2o8KGVzW2ldKTtqKyspewogICAgICAgIGRlZ1tlZGdlW2ldW2pdXSsrOwogICAgICB9CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgaWYoZGVnW2ldPT0wKXsKICAgICAgICBxW3FlKytdID0gaTsKICAgICAgfQogICAgfQogICAgd2hpbGUocXMgPCBxZSl7CiAgICAgIGkgPSBxW3FzKytdOwogICAgICByZXNbcnMrK10gPSBpOwogICAgICBmb3Ioaj0oMCk7ajwoZXNbaV0pO2orKyl7CiAgICAgICAgayA9IGVkZ2VbaV1bal07CiAgICAgICAgZGVnW2tdLS07CiAgICAgICAgaWYoZGVnW2tdPT0wKXsKICAgICAgICAgIHFbcWUrK10gPSBrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYocnM9PU4pewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiAwOwogIH0KfQo7CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFM+IGlubGluZSBpbnQgdmVjMmFycih2ZWN0b3I8VD4gJnYsIFMgYXJyW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnJbaV0gPSB2W2ldOwogIH0KICByZXR1cm4gTjsKfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTMSwgY2xhc3MgUzI+IGlubGluZSBpbnQgdmVjMmFycih2ZWN0b3I8dmVjdG9yPFQ+PiAmdiwgUzEgYXJyMVtdLCBTMiBhcnIyW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnIxW2ldID0gdltpXVswXTsKICAgIGFycjJbaV0gPSB2W2ldWzFdOwogIH0KICByZXR1cm4gTjsKfQp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBTMSwgY2xhc3MgUzIsIGNsYXNzIFMzPiBpbmxpbmUgaW50IHZlYzJhcnIodmVjdG9yPHZlY3RvcjxUPj4gJnYsIFMxIGFycjFbXSwgUzIgYXJyMltdLCBTMyBhcnIzW10pewogIGludCBpOwogIGludCBOID0gdi5zaXplKCk7CiAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICBhcnIxW2ldID0gdltpXVswXTsKICAgIGFycjJbaV0gPSB2W2ldWzFdOwogICAgYXJyM1tpXSA9IHZbaV1bMl07CiAgfQogIHJldHVybiBOOwp9CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgppbnQgTTsKaW50IEFbMTAwMDAwXTsKaW50IEJbMTAwMDAwXTsKaW50IG9yZFsxMDAwMDBdOwppbnQgZHBbMTAwMDAwXTsKZ3JhcGggZzsKY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBtaW5pbXVtVGltZShpbnQgTiwgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgcmVsYXRpb25zLCB2ZWN0b3I8aW50PiYgVCl7CiAgICBpbnQgUTVWSkwxY1MsIGk7CiAgICBkdW1teV9tYWluKCk7CiAgICBNID0gdmVjMmFycihyZWxhdGlvbnMsIEIsIEEpOwogICAgZm9yKGk9KDApO2k8KE0pO2krKyl7CiAgICAgIEFbaV0tLTsKICAgICAgQltpXS0tOwogICAgfQogICAgZy5zZXREaXJlY3RFZGdlKE4sTSxBLEIpOwogICAgZy5Ub3BvbG9naWNhbFNvcnQob3JkKTsKICAgIGZvcihRNVZKTDFjUz0oTiktMTtRNVZKTDFjUz49KDApO1E1VkpMMWNTLS0pewogICAgICBpbnQgUlpUc0MyQkY7CiAgICAgIGF1dG8maSA9IG9yZFtRNVZKTDFjU107CiAgICAgIGRwW2ldID0gVFtpXTsKICAgICAgZm9yKFJaVHNDMkJGPSgwKTtSWlRzQzJCRjwoZy5lc1tpXSk7UlpUc0MyQkYrKyl7CiAgICAgICAgYXV0byZqID0gZy5lZGdlW2ldW1JaVHNDMkJGXTsKICAgICAgICBjaG1heChkcFtpXSwgZHBbal0gKyBUW2ldKTsKICAgICAgfQogICAgfQogICAgaW50IFdZSUdJY0dFOwogICAgY0x0cmFpdHNfdHJ5X21ha2Vfc2lnbmVkPHJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoKCooKGludCopTlVMTCkpKT46OnR5cGU+Ojp0eXBlIHRfeW5NU2RnOwogICAgaWYoTj09MCl7CiAgICAgIHRfeW5NU2RnID0gMDsKICAgIH0KICAgIGVsc2V7CiAgICAgIHRfeW5NU2RnID0gZHBbMF07CiAgICAgIGZvcihXWUlHSWNHRT0oMSk7V1lJR0ljR0U8KE4pO1dZSUdJY0dFKyspewogICAgICAgIHRfeW5NU2RnID0gbWF4X0wodF95bk1TZGcsIGRwW1dZSUdJY0dFXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0X3luTVNkZzsKICB9Cn0KOwovLyBjTGF5IHZlcnNpb24gMjAyMTEwMjQtMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBpbnQgTSwgQVsxZDVdLCBCW10sIG9yZFtdLCBkcFtdOwovLyBncmFwaCBnOwovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IG1pbmltdW1UaW1lKGludCBOLCBWVkkmIHJlbGF0aW9ucywgVkkmIFQpIHsKLy8gICAgIGR1bW15X21haW4oKTsKLy8gICAgIE0gPSB2ZWMyYXJyKHJlbGF0aW9ucywgQiwgQSk7Ci8vICAgICByZXAoaSxNKSBBW2ldLS0sIEJbaV0tLTsKLy8gICAgIGcuc2V0RGlyZWN0RWRnZShOLE0sQSxCKTsKLy8gICAgIGcuVG9wb2xvZ2ljYWxTb3J0KG9yZCk7Ci8vICAgICBycmVwW29yZF0oaSxOKXsKLy8gICAgICAgZHBbaV0gPSBUW2ldOwovLyAgICAgICByZXBbZy5lZGdlW2ldXShqLGcuZXNbaV0pIGRwW2ldID4/PSBkcFtqXSArIFRbaV07Ci8vICAgICB9Ci8vICAgICByZXR1cm4gbWF4KGRwKE4pKTsKLy8gICB9Ci8vIH07Cg==