日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ 2115 Wc2011 Xor DFS+高斯消元

發布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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+高斯消元的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。