《演算法競賽高階指南》最長異或值路徑

2021-10-23 10:25:08 字數 1752 閱讀 5024

給定乙個樹,樹上的邊都具有權值。

樹中一條路徑的異或長度被定義為路徑上所有邊的權值的異或和:

給定上述的具有n個節點的樹,你能找到異或長度最大的路徑嗎?

輸入格式

第一行包含整數n,表示樹的節點數目。

接下來n-1行,每行包括三個整數u,v,w,表示節點u和節點v之間有一條邊權重為w。

輸出格式

輸出乙個整數,表示異或長度最大的路徑的最大異或和。

資料範圍

1≤n≤100000,

0≤u,v1->2,值為7 (=3 ⊕ 4)

//h[i]陣列表示的是i節點指向其他節點的路徑中排序最大的那乙個(最後輸入的那乙個)

//e[i]第i條路徑有指向的下乙個節點,這裡有u->v (i)和v->u (j)

//是兩條不同的路徑,所以這裡e[i]=v,e[j]=u

//c[i] 表示的是第i條路徑的權值

//ne[i]表示在路徑排序中第i條路徑的上一條路徑

//其中h陣列的大小與節點的個數有關

//而e、c、ne陣列都是與單一路徑成2倍關係

//cnt為路徑的排序

int a[n]

,son[

3100010][

2],idx;

//我們通過dfs搜尋將每個節點到根節點的路徑異或值計算出來到a陣列中

//每乙個資料最多占用二進位制31位所以

//son陣列最大位3100010

void

add(

int u,

int v,

int w)

void

dfs(

int u,

int father,

int sum)

}

void

insert

(int x)

}int

search

(int x)

else p=son[p]

[s];

}return res;

}int

main()

dfs(0,

-1,0

);//我們本身將h陣列的每乙個陣列初始化位-1,即根節點

//我們通過dfs搜尋從0~-1到1~-1、2~-1…… 得到每個節點到根節點的異或路徑值

//現在我們需要解決的是在得到a陣列的異或值中尋找一對異或值最高的結果

for(

int i=

0;i)insert

(a[i]);

int res=0;

for(

int i=

0;i) res=

max(res,

search

(a[i]))

; cout<

return0;

}

最長異或路徑

題目鏈結 戳我前置知識 什麼是異或?如果二進位制下同一位不相同,則為 1 否則為 0 trie樹 基本位運算 對於同一條邊異或兩次,相當於沒有進行異或,我們將dis i 表示為從i點到根節點的路徑異或和。則問題轉化為了求兩點的dis異或最大值 貪心的想,對於乙個數x,我們對於dis i x最大,則每...

Acwing 144 最長異或值路徑

144.最長異或值路徑 給定乙個樹,樹上的邊都具有權值。樹中一條路徑的異或長度被定義為路徑上所有邊的權值的異或和 為異或符號。給定上述的具有n個節點的樹,你能找到異或長度最大的路徑嗎?輸入格式 第一行包含整數n,表示樹的節點數目。接下來n 1行,每行包括三個整數u,v,w,表示節點u和節點v之間有一...

AcWing 144 最長異或值路徑

找到兩個點之間的路權值異或和最大。將無根樹扯成有根樹,將根節點到每個葉子節點的路徑異或權值處理出來存起來,然後我們可以遍歷取max,因為從根節點到兩個葉子節點的值異或起來會把中間重複路徑的異或權值消去 異或的性質,相同異或為0 所以借助trie樹就可以了。include using namespac...