フェイス質問
https://www.luogu.org/problem/P2761
問題の解決策
状態圧縮+ +動的最短側(90分のバージョンが書き込まれた動的エッジを追加していません)
今年$ NOI2019 $ $ D2 $ $ $ $ T1 KD-ツリー$が粉々に動的な側面に52分を書いていないと言って。。。
#include <cstdioを> する#include <iostreamの> する#include <CStringの> する#include <ベクトル> の#include <キュー> の#include <cstdlib> に#define RI登録int型 の#define N(1 << 21) 使用して 名前空間STD。 INTのN、M。 int型D; int型の駅。 文字列S1、S2; BOOL VIS [N]。 INT DIS [N]。 ベクター < INT > [N]に、LEN [N]。 無効 add_edge(int型、int型、B、int型 C){ [A] .push_back(B)に、LEN [A] .push_back(C); } ボイドリンク(INT CUR、INT STA){ 場合(CUR == N){ int型 RET = STA。 用(RI i = 0 ; iがn <I ++は{) であれば(S2 [i]が== ' - ' &&(RET&(1 << I)))RET ^ =(1つの << I)。 もし(S2 [i]を== ' + ' &&((RET&(!1 << I))))RET ^ =(1 << I); } もし STA(!=RET)add_edge(STA、RET、D)。 返します。 } であれば(S1 [CUR] == ' + ')リンク(CUR + 1、STA +(1 << CUR))。 そう であれば(S1 [CUR] == ' - ')リンク(CUR + 1 、STA)。 他のリンク(CUR + 1、STA)、リンク(CUR + 1、STA +(1 << CUR)); } 構造体ノード{ int型、D Uと、 ブール 演算子 <(constのノード&RHS)のconst { リターンD> rhs.d。 } }。 ボイドダイクストラ(){ PRIORITY_QUEUE <ノード> Q。 memset(DIS、0x3fを、はsizeof (DIS))。 memsetの(VIS、0、はsizeof (VIS))。 DIS [(1個の << N) - 1 ] = 0 ; q.push((ノード){(1 << N) - 1、0 })。 一方、(!q.empty()){ int型のx = q.top()をU。q.pop(); もし(VIS [X])続けます。 もし(のx == 0){ のprintf(" %d個の\ n " 、DIS [X])。 出口(0 ); } VIS [X] = 1 。 用(RI i = 0 ; iが<[X] .size(); iは++ ){ int型、Y = に[X] [I]; もし(DIS [Y]> DIS [X] + LEN [X] [I]){ DIS [Y] = DIS [X] + LEN [X] [I]; q.push((ノード){Y、DIS [Y]})。 } } } } int型のmain(){ IOS :: sync_with_stdio(偽)。 CIN >> N >> M。 にとって(RI I = 1 ; I <= M; iは++ ){ CIN >> D >> S1 >> S2。 リンク(0、0 ); } ダイクストラ()。 もし(DIS [ 0 ]> 1E9)DIS [ 0 ] = 0 。 COUT << DIS [ 0 ] << ENDL。 }