【题解】 bzoj2115: [Wc2011] Xor (线性基+dfs)
发布日期:2021-10-23 09:05:19 浏览次数:3 分类:技术文章

本文共 1209 字,大约阅读时间需要 4 分钟。

Solution:

  • 看得题解(逃,我太菜了,想不出这种做法
  • 那么

Attention:

  • 板子别写错了 又写错了这次
  • \(long long\)是左移63位,多了会溢出就会出鬼

Code:

//It is coded by Ning_Mew on 5.29#include
#define LL long longusing namespace std;const int maxn=5e4+7,maxm=1e5+7;int n,m;LL x[70],sum[maxn],ans;struct Edge{ int nxt,to;LL dis;}edge[maxm*2];int head[maxn],cnt=0;bool vis[maxn];void add(int from,int to,LL dis){ edge[++cnt].nxt=head[from]; edge[cnt].dis=dis; edge[cnt].to=to; head[from]=cnt;}void push(LL ss){ for(int i=63;i>=0;i--){ if((ss>>i)&1){ if(!x[i]){x[i]=ss;return;} else{ss=(ss^x[i]);} } }}void dfs(int u){ vis[u]=1; for(int i=head[u];i!=0;i=edge[i].nxt){ int v=edge[i].to; if(vis[v]){ push( ((sum[u]^edge[i].dis)^sum[v]) ); continue; }else{ sum[v]=(sum[u]^edge[i].dis); dfs(v); } }}int main(){ freopen("in.in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y;LL z;scanf("%d%d%lld",&x,&y,&z); add(x,y,z);add(y,x,z); } memset(vis,false,sizeof(vis)); dfs(1); ans=sum[n]; for(int i=63;i>=0;i--){ if((ans^x[i])>ans)ans=(ans^x[i]); } printf("%lld\n",ans); return 0;}

博主蒟蒻,随意转载。但必须附上原文链接:,否则你会终生找不到妹子!!!

转载于:https://www.cnblogs.com/Ning-Mew/p/9105496.html

转载地址:https://blog.csdn.net/weixin_30549657/article/details/95806085 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ip地址
下一篇:BZOJ 1599: [Usaco2008 Oct]笨重的石子( 枚举 )

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月24日 04时16分03秒