#ifndef INCLUDE_MODE #define INCLUDE_MODE /* #define SUBMIT_ONLY */ #define DEBUG_OUTPUT #define SAMPLE_CHECK G #endif #ifdef INCLUDE_MAIN VO Solve() { CIN( int , N , M ); using weight_type = ll; using path_type = Tuple; using edge_type = Tuple; CIN_A( edge_type , 0 , M , UVW ); CIN( string , S ); vector> e( N ); FOR( m , 0 , M ){ auto& [u,v,w] = UVW[m]; --u; --v; e[u] <<= {v,w}; } /* 状態を1次元分追加 */ using T = T2; int K = 2; SET_HW( N , K ); auto edge = [&]( const T& v , const char& c ){ auto& [i,k] = v; vector> a{}; if( k + 1 < K ){ if( S[i] == c ){ a <<= {T{i,k+1},0}; } } RUN( e[i] , [j,w] ){ a <<= {T{j,k},w}; } return a; }; auto edge1 = [&]( const T& v ){ return edge( v , 'K' ); }; GridGraph graph1{ edge1 }; auto edge2 = [&]( const T& v ){ return edge( v , 'P' ); }; GridGraph graph2{ edge2 }; BranchedDijkstra dijk1{ graph1 }; auto d1 = dijk1.GetDistance( vector>{{T{0,0},0,0}} , 1 ); WHAT( d1 ); vector> t_start{}; FOR( i , 0 , N ){ if( S[i] == 'C' && !d1[EnumHW_inv({i,1})].empty() ){ t_start <<= tuple{T{i,0},d1[EnumHW_inv({i,1})][0][O],i}; } } WHAT( t_start ); BranchedDijkstra dijk2{ graph2 }; auto d2 = dijk2.GetDistance( t_start , 2 ); WHAT( d2 ); ll a = dijk2.Infty(); FOR( i , 0 , N ){ if( S[i] == 'C' ){ RUN( d2[EnumHW_inv({i,1})] , [u,s] ){ if( s != i ){ SetMin( a , u ); } } } } RETURN( a == dijk2.Infty() ? -1 : a ); } REPEAT_MAIN(1); #else /* INCLUDE_MAIN */ #ifdef INCLUDE_SUB /* 圧縮時は中身だけ削除する。*/ IN VO Experiment() { } /* 圧縮時は中身だけ削除する。*/ IN VO SmallTest() { CERR( "全てのケースを確認しました。" ); } /* 圧縮時は中身だけ削除する。*/ IN VO RandomTest( const int& test_case_num ) { REPEAT( test_case_num ){ } CERR( "全てのケースを確認しました。" ); } #define INCLUDE_MAIN #include __FILE__ #else /* INCLUDE_SUB */ #ifdef INCLUDE_LIBRARY /* VVV 常設でないライブラリは以下に挿入する。*/ template > class AbstractBranchedDijkstra : public PointedSet { private: GRAPH& m_G; // コンストラクタに引数が必要なMultiplicativeMonoidなどはstaticメンバ関数による // 参照返しがしにくく、コンストラクタの返り値である右辺値を受け取ることを許容したいので // 左辺値参照にはしない。 COMM_SEMIGRP m_M; public: inline AbstractBranchedDijkstra( GRAPH& G , COMM_SEMIGRP M , const U& infty ); // TUPLEはtupleなど。Sはoperator<()が全順序である型。 // 各点への最短径路長を始辺の色ごとに上位length個まで求める。 template