BZOJ 2115: [Wc2011] Xor 线性基 dfs
https://www.lydsy.com/JudgeOnline/problem.php?id=2115
每一条从1到n的道路都可以表示为一条从1到n的道路异或若干个环的异或值。
那么把全部的环丢到线性基里基本操作就可以了。。
https://blog.csdn.net/qaq__qaq/article/details/53812883 这个博客非常好
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 #define LL long long 8 const int maxn=50010; 9 int n,m; 10 struct nod{ 11 int y,next;LL v; 12 }e[maxn*4]; 13 int head[maxn]={},tot=0; 14 LL b[65]={},c[65]={},d[maxn]={},val[maxn*4]={},cnt=0,tem=0; 15 bool vis[maxn]={}; 16 void init(int x,int y,LL v){ 17 e[++tot].y=y;e[tot].v=v;e[tot].next=head[x];head[x]=tot; 18 } 19 void dfs(int x){ 20 vis[x]=1; 21 for(int i=head[x];i;i=e[i].next){ 22 if(!vis[e[i].y]){ 23 d[e[i].y]=d[x]^e[i].v; 24 dfs(e[i].y); 25 } 26 else val[++cnt]=d[e[i].y]^d[x]^e[i].v; 27 } 28 } 29 void getit(LL x){ 30 for(int i=60;i>0;i--){ 31 if(x&c[i]){ 32 if(!b[i]){b[i]=x;break;} 33 x^=b[i]; 34 } 35 } 36 } 37 int main(){ 38 int x,y;LL z; 39 scanf("%d%d",&n,&m); 40 for(int i=1;i<=m;i++){ 41 scanf("%d%d%lld",&x,&y,&z); 42 init(x,y,z);init(y,x,z); 43 } 44 dfs(1);c[1]=1; 45 for(int i=2;i<=60;i++)c[i]=c[i-1]*2; 46 for(int i=1;i<=cnt;i++){getit(val[i]);} 47 LL ans=d[n]; 48 for(int i=60;i>0;i--)ans=max(ans,ans^b[i]); 49 printf("%lld\n",ans); 50 return 0; 51 }