B Graph(異或最小生成樹)

2021-10-08 13:21:09 字數 1760 閱讀 8192

圖是聯通的,並且加邊的時候要保證環一定是異或值為0,所以我們可以保證從乙個點到另乙個點的路徑異或值是不變的,這個時候就簡單了,不就是乙個異或最小生成樹了嘛。

我們只要預處理一下,任選乙個點作為根節點去得到從這個點到其他點的路徑異或值,然後再做一遍異或最小生成樹即可。

/*

*/#pragma gcc optimize(2)

#pragma gcc optimize(3)

#include

#define mp make_pair

#define pb push_back

#define endl '\n'

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

const

double pi =

acos(-

1.0)

;const

double eps =

1e-7

;const

int inf =

0x3f3f3f3f

;inline ll read()

while

(c >=

'0'&& c <=

'9')

return f * x;

}void

print

(ll x)

print

(x /10)

;putchar

(x %10+

48);}

const

int n =

1e5+10;

int trie[n *30]

[2], tot, a[n]

;int head[n]

, to[n <<1]

, nex[n <<1]

, value[n <<1]

, cnt =1;

void

add(

int x,

int y,

int w)

void

insert

(int x)

else}}

intfind

(int x)

else

}return ans;

}ll ans =0;

void

dfs1

(int l,

int r,

int dep)

int now = int_max;

for(

int i = mid +

1; i <= r; i++

) ans +

= now;

}void

dfs2

(int rt,

int fa,

int w)

}int

main()

dfs2(1

,0,0

);sort

(a, a + n)

;dfs1(0

, n -1,

29);printf

("%lld\n"

, ans)

;return0;

}

異或最小生成樹

對於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 ...

G Xor MST(異或最小生成樹)

異或最小生成樹,這裡採用了一種分治的方法來貪心求解最值 為什麼這樣是對的 顯然我們分成兩個集合我們可以抵消掉高位的一大堆一樣的東西,這個時候,我們可以保證我們的貪心策略是正確的。為什麼我們要合併兩個集合 假設左邊集合有n nn個點,右邊集合有m mm個點,顯然左邊最多鏈結n 1 n 1 n 1條邊,...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...