NewTrain1 T9:[WC2011]と最大パスXOR

トピック分析

我々は、環のN +数に単純なパス1として見パスを選択しました

簡単なパスを取る、我々はこのパスが最適な解決策ではありません選択した場合でも、我々はまた、我々は、nに最適解パスをこのパスを取り、1に戻ったことを信じて、その後、これを行くことができるのいずれかNへのパス、実際にはそう、このパス+リング、またはこのパスを異なるオフセットをクリックしてください。

そして、リングに直接リンクしないパスに対して、我々はまた、このリングは、排他的であるか、または内部に答えるようにすることを考えることができます。この道路はリングに分岐し、その後、戻ってきて、分岐部への道路から、リングの一部が排他そのためか、直接リングをXORすることができますので、相殺をクリックしてください。

アイデアを解決するリニアグループに追加されるプリリングの全ては、次にあります。次いで、N、単純なパスに1のいずれかを計算し、長さd、我々は排他的OR Dの最大値を求めることができ、線形群と呼びます。

簡単な計算のループ経路による前処理は、すべてのDFSで行うことができます。

1つの#include <ビット/ STDC ++ H>
 2  の#define INTMAX 2147483647LL
 3  の#define PII対<整数、整数>
 4  の#define MK make_pair
 5  の#define再登録
 6を 使用して 名前空間STDを、
7 typedefの長い 長いLL。
8  CONST  ダブルパイ= ACOS( - 1.0 )。
9  CONST  INT Infの= 0x3f3f3f3f 10  のconst  int型 MAXN = 2E5 + 10 11  
12インラインint型READ(){
 13      のRE INT X = 0、F = 1、CH = GETCHAR()。
14      しばらく(!isdigit(CH))は、f = CH == ' - ' - ?11、CH = getchar関数();
15      一方(isdigit(CH))X = X * 10 + CH- 48、CH = GETCHAR()。
16      リターンのX *はF;
17  }
 18  インラインLL readll(){
 19      再LL X = 0、F = 1、CH = GETCHAR()。
20      しばらく(!isdigit(CH))は、f = CH == ' - ' - ?11、CH = getchar関数();
21      一方(isdigit(CH))X = X * 10 + CH- 48、CH = GETCHAR()。
22      リターンのX *はF;
23  }
 24  
25  構造体のエッジ{
 26      INT 、NXTに、
27      LLのD;
28 } E [MAXN << 1 ]。
29  int型CNT、ヘッド[MAXN]。
30  int型N、M。
31  BOOL VIS [MAXN]。
32LL DIS [MAXN]、BSE [ 70 ]。 
33インラインボイド add_edge(INT U、INT V、LL d)は{
 34      E [++ CNT] .TO = V; E [CNT] .D = Dは、E [CNT] .nxt =頭部[U];頭[ U] = CNT。
35  }
 36  
37インラインボイド挿入(LL x)から{
 38      のためのint型 I = 60 ; I> = 0 ; - I){
 39          であれば(X&(1LL << I)){
 40              であれば(BSE [i])とX ^ = BSE [I]。
41              {
 42                  BSE [I] =のX。
43                  ブレーク;
44              }
 45          }
 46      }
 47  }
 48  インラインLLクエリ(LL X){
 49      のためのint型 I = 60 ; I> = 0 ; - I){
 50          であれば((X ^ BSE [I])> x)はx ^ = BSE [I]。
51      }
 52      リターンX。
53  }
 54のインラインボイド DFS(INT X){
 55      VIS [X] = 56      のためのint型I =ヘッド[X]、Y; I; I = E [I] .nxt){
 57          、Y = E [I] .TO。
58          であれば(VIS [Y])を挿入する(DIS [X] ^ DIS [Y] ^ E [I] .D)。
59          {
 60              DIS [Y] = DIS [X] ^ E [I] .D。
61の             DFS(Y)。
62          }
 63      }
 64  }
 65  INT メイン(){
 66      N =読み取る(); M = 読み取ります()。
67      のためにint型 I = 1 ; I <= M; ++ i)が{
 68          、INT U =読み取る()、V = )(読み取ります。
69          LL D =readll();
70          add_edge(U、V、D)。
71          add_edge(V、U、D)。
72      }
 73の      DFS(1 )。
74      のprintf(" %LLDする\ n " 、クエリ(DIS [N]));
75      リターン 0 ;
76 }

 

おすすめ

転載: www.cnblogs.com/LI-dox/p/11267300.html