首先我們知道,例如1為根,假設存在這樣三條邊:1-2,2-3,2-4,那麼,路徑(3,4)的值等於(1,3)^(1,4)給定一棵nnn個點的帶權樹,結點下標從111開始到nnn。尋找樹中找兩個結點,求最長的異或路徑。那麼我們現在可以得到以1為端點,1到n為另一端點的n條邊,和這n條路徑的異或和值的集合s,我們現在就是要找兩個端點x,y,使路徑(x,y)的值最大,即(1,x)^(1,y)值最大,
換而言之,就是要找集合s中哪兩個點異或值最大
這就是01字典樹的套路了,從01字典樹頂點開始,走兩條路一直走到n,同一層盡量保證一邊是0,另一邊是1
具體思路詳見**
題目描述
異或路徑指的是指兩個結點之間唯一路徑上的所有邊權的異或。
輸入格式
第一行乙個整數nnn,表示點數。
接下來 n−1n-1n−1 行,給出 u,v,wu,v,wu,v,w ,分別表示樹上的 uuu 點和 vvv 點有連邊,邊的權值是 www。
輸出格式
一行,乙個整數表示答案。
輸入輸出樣例
輸入 #1
41 2 3
2 3 4
2 4 6
輸出 #1
說明/提示
最長異或序列是1-2-3,答案是 7 (=3 ⊕ 4)
資料範圍
1≤n≤100000;0#include#define ll long long
#define mod 998244353
#define maxn 833333
using namespace std;
#includell tre[maxn][3],id=0,sum[maxn][3];
struct node
;vectore[maxn];
void add(ll x)
}void dfs(ll u,ll fa,ll s)
}ll dfs1(ll step,ll cx,ll cy)
if((tre[cx][1]>0&&tre[cy][0]>0))
}else
else
}return ans+mx;
}int main()
); e[v].push_back();
}dfs(1,-1,0);
ll ans=dfs1(40,tre[0][0],tre[0][0]);
printf("%lld\n",ans);
}
洛谷P4551 最長異或路徑
題目大意 求樹上最長的異或路徑 題解 由於異或具有自反性,只需要求出每個節點到根的異或長度,塞進 trie 裡,最後對每個節點找一下最大值更新答案即可 卡點 把動態開點寫成了可持久化,然後空間要再多開一點 比層數多一 c code include include define m 30 define...
題解 P4551 最長異或路徑
給定一棵 n 個點的帶權樹,結點下標從 1 開始到 n 尋找樹中找兩個結點,求最長的異或路徑。異或路徑指的是指兩個結點之間唯一路徑上的所有邊權的異或。include include define m 200070 define n 5000070 using namespace std struct...
Luogu4551 最長異或路徑
emmmmmmmmmm異或乙個數兩次等於沒有操作對吧。所以我們按照字首的異或和,建乙個01trie。然後之後。直接在樹上貪心地找能和它每一位不一樣的數。然後。就沒有了吧qwqwq 如下 include include include include include define maxn 10001...