p4151 [WC2011]と最大パスXOR

分析

私たちは取るパスのいずれかで見つかりました

パスの外側のリングは、フル取ることができるようになります

パスのリング断面が周期で新しいパスに元のパスを置き換えるために対応しているよう

したがって、我々はすべてのリングのパスと値をnに1のいずれかを取得する必要が

その後、最大に排他的または直鎖状の基によって得られます

コード

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include < 文字列 > 
の#include <アルゴリズム> 
書式#include <CCTYPE> 
書式#include <cmath> 
の#include <cstdlib> 
書式#include <キュー> 
の#include <CTIME> 
#include <ベクトル> 
の#include < 設定 > 
の#include <地図> 
の#include <積層>
 使用して 名前空間STD。
#define Fiの第一
 の#define SE第二
 の#define融点make_pair用
 の#definePB一back用 
 の#defineのLi長い長い
ベクトル <ペア< int型、LI>> V [ 100100 ]。
INTの N、M、VIS [ 100100 ]。
李ベル[ 110 ]、D [ 100100 ]、ANS。
インラインボイドイン(LI x)から{
     ためint型私= 63 ; I> = 0 ; i-- もし((1LL << I)&X){
           場合(!ベル[I]){ 
            ベル[I] = バツ;
            破ります; 
          } 
          X ^ =ベル[i]は、
      } 
} 
インラインボイドQ(){
     ためint型 = Iを63 ; I> = 0 ; i-- もし((ベル[I] ^ ANS)> ANS){ 
          ANS ^ = ベル[I]。
      } 
} 
インラインボイド DFS(INT X、李RES){ 
    D [X] =のRES。
    VIS [X] = 1 以下のためにint型 i = 0 ; iはV <[X] .size(); iは++ ){
       int型、Y = V [X] [I] .fi。
      李Z= V [X] [I] .SE。
      もし(!VIS [Y])DFS(Y、RES ^ Z)。
        他のイン(RES ^ Z ^ D [Y])。
    } 
} 
int型のmain(){
     int型I、J、K。
    scanf関数(" %d個の%のD "、&​​N、&M)。
    (i = 1 ; I <= M; iは++ ){
       int型X、Y。
      Li、Z。
      scanf関数(" %D%D%LLD "、およびX&Y、およびZ)。
      V [X] .pb(MP(Y、Z))。
      V [Y] .pb(MP(X、Z))。
    } 
    DFS(1 、0LL)。
    ANS = D [N];
    Q(); 
    printf(" %LLDする\ n " 、ANS)。
    リターン 0 ; 
}

おすすめ

転載: www.cnblogs.com/yzxverygood/p/11519626.html