日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

01tire+洛谷P4551 最长异或路径

發布時間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 01tire+洛谷P4551 最长异或路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

給定一棵n個點的帶權樹,結點下標從1開始到N。尋找樹中找兩個結點,求最長的異或路徑。
異或路徑指的是指兩個結點之間唯一路徑上的所有邊權的異或。

輸入格式

第一行一個整數NN,表示點數。

接下來 n?1 行,給出 u,v,w ,分別表示樹上的 u 點和 v 點有連邊,邊的權值是 w。

輸出格式

一行,一個整數表示答案。

輸入輸出樣例

輸入 #1

4
1 2 3
2 3 4
2 4 6

輸出 #1

7

說明/提示

最長異或序列是1-2-3,答案是 7 (=3 ⊕ 4)

數據范圍

1≤n≤100000;0<u,v≤n;0≤w<2311\le n \le 100000;0 < u,v \le n;0 \le w < 2^{31}1n100000;0<u,vn;0w<231

分析:

復習 01trie:
是trie的一種。每個節點是0或者1,我們可以將一些數以二進制表示的形式存入01trie,進而解決一些異或問題。有關trie樹的原理再次不在贅述。
異或,指一個法則:

  • 兩個數的二進制數位上相等即為0,不相等即為1。
  • 顯然,一個數對同一個數異或兩次等于沒有異或,那么異或也就滿足交換律,結合律。
  • 對于一列數的異或和,我們可以將其用結合律從1~\simi,i+1~\simj進行異或,然后在將這兩個結果進行異或,結果不變。
    于是我們可以:

  • 處理出1到每一個節點的異或和

  • 把他們加到一棵(01trie)里面

  • 從高位到低位貪心操作,取最大值,即是答案。

  • AC代碼:

    #include<bits/stdc++.h> using namespace std; const int N=1e5+10;int head[N], nxt[N<<1], to[N<<1], weight[N<<1], cnt; int n, dis[N], ch[N<<4][2], tot = 1, ans;void insert(int x){for (int i=30,u=1;i>=0;--i){//由題目,是w<2^31,所以對于異或和只需要30位即可int c=((x>>i)&1);if (!ch[u][c])ch[u][c]=++tot;u=ch[u][c];} }void get(int x){int res=0;for(int i=30,u=1;i>=0;--i){int c=((x>>i)&1);if(ch[u][c^1]){u=ch[u][c^1];res|=(1<<i);}elseu=ch[u][c];}ans=max(ans,res); } void add(int u, int v, int w){nxt[++cnt]=head[u];head[u] = cnt;to[cnt]=v;weight[cnt]=w; }void dfs(int u,int fa) {insert(dis[u]);//處理出1到每一個節點的異或和,把他們加到一棵\(01trie\)里面get(dis[u]);for (int i=head[u];i;i=nxt[i]){int v=to[i];if (v==fa)continue;dis[v]=dis[u]^weight[i];dfs(v, u);//用dfs(v,u)表示v和u之間的路徑的邊權異或和} }int main() {scanf("%d", &n);for (int i=1;i<n;++i){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}dfs(1,0);//設定0為根節點,但實際根節點是1;printf("%d", ans);return 0; }

    總結

    以上是生活随笔為你收集整理的01tire+洛谷P4551 最长异或路径的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。