BZOJ 2115 Wc2011 Xor DFS+高斯消元
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 2115 Wc2011 Xor DFS+高斯消元
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標題效果:鑒于無向圖。右側的每個邊緣,求一個1至n路徑,右上路徑值XOR和最大
首先,一個XOR并能為一個路徑1至n簡單的路徑和一些簡單的XOR和環
我們開始DFS獲得隨機的1至n簡單的路徑和繪圖環所有線性無關(兩個或多個環異或得到)
然后在一些數中選出一個子集。使它們與一個給定的數的異或和最大,這就是高斯消元的問題了
利用高斯消元使每一位僅僅存在于最多一個數上 然后貪心求解就可以
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 50500 using namespace std; typedef long long ll; struct abcd{int to,next;ll f; }table[200200]; int head[M],tot; int n,m,top; bool v[M]; ll _xor[M],stack[M<<2],ans; void Add(int x,int y,ll z) {table[++tot].to=y;table[tot].f=z;table[tot].next=head[x];head[x]=tot; } void DFS(int x) {int i;v[x]=true;for(i=head[x];i;i=table[i].next){if(v[table[i].to])stack[++top]=_xor[x]^table[i].f^_xor[table[i].to];else_xor[table[i].to]=_xor[x]^table[i].f,DFS(table[i].to);} } void Gaussian_Elimination() {int i,k=0;ll j;for(j=1ll<<62;j;j>>=1){for(i=k+1;i<=top;i++)if(stack[i]&j)break;if(i==top+1)continue;swap(stack[++k],stack[i]);for(i=1;i<=top;i++)if( (stack[i]&j) && i!=k )stack[i]^=stack[k];} } int main() {int i,x,y;ll z;cin>>n>>m;for(i=1;i<=m;i++){scanf("%d%d%lld",&x,&y,&z);Add(x,y,z);Add(y,x,z);}DFS(1);Gaussian_Elimination();ans=_xor[n];for(i=1;stack[i];i++)if( (ans^stack[i])>ans )ans^=stack[i];cout<<ans<<endl; } //lld!!!!版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
總結
以上是生活随笔為你收集整理的BZOJ 2115 Wc2011 Xor DFS+高斯消元的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《梦幻西游》手游藏宝阁怎么指定交易 《梦
- 下一篇: 如何安装使用MQCache缓存服务器(适