質問表面:https://www.luogu.org/problem/P2962
タグは、ガウスの消去法を持っています。
しかし、我々は、使用方法を見つけることができませんでした。
だから、検索。
必ずしも許容できない35電源の2。
双方向検索。
しかし、問題は、開始点と終了点からの検索ではありません。
先頭との中点しかし、 奇妙なビット
これは、複雑さを軽減します。
次のようにコードとコメントは以下のとおりです。
#include <ビット/ STDC ++ H.> の#define LLロングロング 使用 名前空間STD; LL F [ 40 ]、ED、B [ 40 ]、CNT; INT N-、M、ミネソタ州= 0x7FFFFFFFで、 BOOL H; 地図 <LL、INT > MP; // 所望の状態にステップ数を表す 空隙(DFS int型、今X、LL int型工程){ // Xは、現在の状態がステップ数ステップで最初のいくつかのスイッチのために今ある IF(X == + CNT 1。){ IF(今== ED) ミネソタ州 = 分(ミネソタ州、STEP); 他{ IF(H!){ // 前半 int型 T = MP [今]; IF(T == 0 || STEP <T)MP [今] = STEP; } そうでなければ { // 他の半分が更新されなければなりません前半の一つとに結合されている int型 T = MP [ED- 今]を、 IF(T =!0)ミネソタ州=分(ミネソタ州、T +のSTEP); } } リターン; } DFS(Xの + 1、今^ F [X] + STEP 1。); DFS(X + 1 、今、STEP); } int型メイン() { scanf関数(" %D%dの"、&N、&M)。 F [ 1 ] = bの[ 1 ] = 1 。 以下のために(int型 iは= 2 ; iが<= N + 1は、 F [i]は= bの[I] =(B [I-iが++;)1 ] << 1 )。 ED = B [N + 1 ] - 1。// 处理结尾 ため(int型 I = 1 ; I <= M; iは++ ){ int型Uを、V。 scanf関数(" %d個の%のD "、&U、& V); F [U]+ = B [V]、[V] + = F B [U]。 } H = 0 ; CNT = N / 2 ; DFS(1、0、0 ); H = 1 ; CNT = N; DFS(N / 2 + 1、0、0 ); printf(" %d個の\ n " 、ミネソタ州)。 システム(「一時停止」)。 リターン 0 ; }