必要に応じてパスは、点離れる他の方向からの場合、リング(そうでなければ無意味来る方向)が存在しなければならない、多くの排他的OR +シクロ最大グループに対応する経路は線形であってもよい検討します頼みます
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 100005 4 の#defineっ長い長い 5 構造体JI { 6 int型NEX、であり; 7 LL LEN。 8 }エッジ[N << 2 ]。 9 int型VIS E、N、M、X、Y、ヘッド[N]、[N]。 10 LLのZ、[ 61 ]、S [N]。 11 ボイド追加(int型のx、int型のY、LLのZ){ 12 エッジ[E] .nex = 頭部[X]。 13 エッジ[E] .TO = Y。 14 エッジ[E] .LEN = Z。 15 頭[X] = E ++ 。 16 } 17 空隙追加(LLのK){ 18 のために(int型 iは= 60、I> = 0 ; i-- ) 19 であれば(K&(1LL << I)) 20 であれば([i])とK ^ = A [私]; 21 他{ 22 [I] = K。 23 ブレーク; 24 } 25 } 26の 空隙 DFS(int型 K、INT FA、LLのSH){ 27の S [K] = SH。 28 VIS [K] = 1 。 29 のために(int型 I =ヘッド[K];!I = - 1 ; I = エッジ[I] .nex) 30 場合(I =!FA) 31 であれば(VIS [エッジ[I] .TO]!)DFS(エッジ[i]は.TO、I ^ 1、S [k]は^ エッジ[I] .LEN)。 32 他の追加(S [k]は^ S [エッジ[i]は.TO] ^ エッジ[I] .LEN)。 33 } 34 LLクエリ(LLのK){ 35 のための(int型 J = 60 ; J> = 0 ; j-- ) 36 であれば((K&(1LL << J))==0)K ^ = A [J]。 37 リターンK。 38 } 39 INT メイン(){ 40 のscanf(" %D%dの"、&N、&M)。 41 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 42 のために(int型 I = 1 ; I <= M; iが++ ){ 43 のscanf(" %D%D%LLD "、およびX&Y、およびZ)。 44 追加(X、Y、Z)。 45 追加(X、Y、Z)。 46 } 47の DFS(1、 - 1、0 ); 48 のprintf(" %のLLD " 、クエリ(S [N])); 49 }