ネットワークフロー問題[24]ソフトウェアパッチの問題

フェイス質問

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) - 10 })。
  一方、(!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。
    リンク(00 ); 
  } 
  ダイクストラ()。
  もし(DIS [ 0 ]> 1E9)DIS [ 0 ] = 0 
  COUT << DIS [ 0 ] << ENDL。
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11278011.html