第一行包含兩個整數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...