#pragma GCCの最適化(3) の#include <ビット/ STDC ++ H> に#define N 105 使用して 名前空間STDを、 構造体ノード{ 長い 長いX。 int型マックス。 ビットセット <N> AVL、VIS; フレンドブール 演算子 <(constのノード&L、CONSTノード&R){ 戻り LX> RX。 } }。 INT [N]。 int型N、K。 チャーS [N]。 PRIORITY_QUEUE <ノード> S; 長いです 長いANS; ビット集合 <N> P [N]。 INT メイン(){ scanf関数(" %d個の%のD "、&N&K)。 K - ; もし(Kの== 0 ){ プット(" 0 " )。 リターン 0 ; } のための(int型 i = 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。 用(int型 i = 1 ; iが<= N iが++ ){ scanf関数("%S "、S + 1 ) のための(int型 J = 1 ; J <= N; J ++)場合(S [j] == ' 1 ')P [I] [J] = 1 ; } のために(int型のI = 1 ; iが<= N; iが++ ){ ノードTMPを、 tmp.xは = [I]; tmp.avl = P [I]は 、[I] tmp.vis = 1 ; tmp.Max = I; S.push( TMP); } ながら!( = S.empty()){ ノードU S.top()。 S.pop(); ANS = UX; K - ; もし(!K){ のprintf(" %LLDする\ n " 、ANS)。 リターン 0 ; } のための(INT J = u.Max + 1、J <= nであり、j ++ ){ 場合(u.avl [J]){ ノードv。 VX = UX + [J]。 v.avl = u.avl&P [J]。 v.vis [J] = 1; v.vis | = u.vis。 v.Max = J; S.push(V); } } } プット(" -1 " )。 リターン 0 ; }