圖是聯通的,並且加邊的時候要保證環一定是異或值為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的生成樹,而各邊權和最小的生成樹則被稱...