BZOJ 2115 線性基)詳解

2021-09-12 15:00:34 字數 1204 閱讀 6549

第一行包含兩個整數n和 m, 表示該無向圖中點的數目與邊的數目。 接下來m 行描述 m 條邊,每行三個整數si,ti ,di,表示 si 與ti之間存在 一條權值為 di的無向邊。 圖中可能有重邊或自環。

僅包含乙個整數,表示最大的xor和(十進位制結果),注意輸出後加換行回車。

5 71 2 2

1 3 2

2 4 1

2 5 1

4 5 3

5 3 4

4 3 2

寫這題必須了解異或的這個性質c^b^c = b;

因為題目是存在環的,所以我們將每個環的異或和用a[i]表示,用的dfs丟擲每個環上的異或值,由於c^b^c = b的性質,我們可以知道,從起點出發經過乙個環後回到起點時,所得的異或和為該環的異或和。所以我們可以求出a的線性基,在得到任意一條1到n路徑上的異或和便可得到異或和的最大值。

下面上**

#include #include #include #include #include #include #includeusing namespace std;

typedef long long ll;

const int max_base = 60;

const int max = 200000 + 50;

ll a[max]; // 用來存每個環的異或和 ,注意a陣列開大一點,因為不確定有幾個環

ll b[max_base + 5]; // 儲存線性基

int head[max];

int vis[max];

int cnt = 0; // 記錄環的個數

int k = 0; // 記錄邊的條數

ll d[max];

struct edge

edge[max];

void add(int a, int b, ll c)

void dfs(int rt)

ll w = edge[e].w;

if(vis[v]) else }}

void prepare() }}

}}int main()

dfs(1);

prepare();

ll ans = d[n];

for(int i = 60; i >= 0; i--)

} printf("%lld\n", ans);

return 0;

}

bzoj 2115 Xor 線性基 貪心

題目傳送門 這是個通往vjudge的蟲洞 這是個通往bzoj的蟲洞 題目大意 問點 1 到點 n 的最大異或路徑。因為重複走一條邊後,它的貢獻會被消去。所以這條路徑中有貢獻的邊可以看成是一條 1 到 n 的簡單路徑加上若干個環。因此可以找任意一條路徑,然後找出所有環扔進線性基跑出最大異或和。但是找出...

演算法筆記 線性基詳解

線性基是乙個聽起來很高階但實際上還蠻簡單的演算法,本質就類似於線性代數中的基向量,是乙個整數集合的一組線性無關的數字。說是演算法,我覺得其更偏向是一種思想。例如一組向量 v1 v2 v2 三者中任意乙個都無法用另外兩者表示出來,因此它們線性無關。舉個線性基的例子 以下為二進位制表示 對乙個整數集合求...

線性基 BZOJ 4269 再見Xor

划水中。遲早要完 顯然要線性基。考慮求k k 大。對於基的每乙個位置,因為其最高非零位就是位置標號,那看一下 k role presentation k k的這一位是否為 1 1 看是否要異或上 或者不異或 使得這一位得到的答案較大。include define show x cerr x x en...