異或生成樹(樹形dp)

2021-10-06 10:26:14 字數 1327 閱讀 5553

傳送門

題意:給定n

nn個結點的權值ai∈

[1

,127

]a_i\in[1,127]

ai​∈[1

,127

].求最大異或和生成樹。

思路:答案的範圍為[0,

127]

[0,127]

[0,127

].考慮樹形dpdp

dp, 設dp[

i][j

]dp[i][j]

dp[i][

j]為以結點i

ii為根的子樹答案是否為jjj

對於當前結點u

uu,遍歷所有的子結點v

vv ,有轉移方程:dp[

u][i

⊕j]∣

=dp[

u][i

]&dp

[v][

j]

dp[u][i\oplus j]\ |=dp[u][i]\&dp[v][j]

dp[u][

i⊕j]

∣=dp

[u][

i]&d

p[v]

[j].

因為是從上往下遍歷,所以顯然這樣dpdp

dp思路是正確的。一開始先初始化一波dp[

i][a

[i]]

=1

dp[i][a[i]]=1

dp[i][

a[i]

]=1然後dfs

dfsdf

s一遍即可。

時間複雜度:o(12

72n)

o(127^2n)

o(1272

n)

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e2+10;

#define mst(a) memset(a,0,sizeof a)

int n,ans,a[n]

;bool jg[n]

,dp[n]

[128];

vector<

int>e[n]

;void

dfs(

int u,

int fa)}}

intmain()

for(

int i=

1,u,v;i)dfs(1

,0);

printf

("%d\n"

,ans)

;return0;

}

異或的路徑 樹形DP

給一棵 n 個點的樹,1 號節點為根,邊有邊權,令 f u,v 表示 u 節點到 v 節點,路徑上邊權異或值。求 i 1n j 1nf i,j sum sum f i,j i 1n j 1n f i,j 結果對 1000000007 取模。第一行乙個整數 n n 100000 n n leq 100...

樹dp 統計異或值

給定一棵n個點的樹,每個點有權值 定義表示 到的最短路徑上,所有點的點權異或和。對於,求所有 的異或和。第一行乙個整數n。接下來n 1行,每行2個整數u,v,表示u,v之間有一條邊。第n 1行有n個整數,表示每個點的權值 輸出乙個整數,表示所有 的異或和,其中 示例1 複製4 1 21 3 1 41...

異或最小生成樹

對於n個點的完全圖,每兩個點之間的距離等於兩點的權值的異或和,求最小生成樹 int n struct xortrie void insert ll x,int id val rt x ll answerpos int rt,int pos,ll x return rt void traceback ...