トピック分析
我々は、環の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 == ' - ' - ?1:1、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 == ' - ' - ?1:1、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 }