1. 程式人生 > >洛谷P4151 [WC2011] 最大XOR和路徑 [線性基,DFS]

洛谷P4151 [WC2011] 最大XOR和路徑 [線性基,DFS]

man bsp target ons 中間 所有 -s mic als

  題目傳送門

最大XOR和路徑

格式難調,題面就不放了。


  分析:

  一道需要深刻理解線性基的題目。

  好久沒打過線性基的題了,一開始看到這題還是有點蒙逼的,想了幾種方法全被否定了。還是看了大佬的題解才會做的。

  首先我們能想到,在圖中從$1$走到$n$有這麽兩種情況,一種是一條鏈直接走到$n$,另一種是先走鏈然後繞若幹個環然後回到鏈上走到$n$。對於這道題顯然我們是要考慮所有的環的(由異或的性質可知)。

  然後我們又可以發現,如果一條鏈和一個環中間有一條路徑相連,那麽我們從鏈上走到環上時會經過這條路徑一次,從環上回到鏈上時又會走這條路徑一次,那麽兩次走過的路徑異或和就是$0$!

  再看,如果從$1$走到$n$有若幹條鏈,那麽這些鏈會相互構成若幹個環,如果我們走了一條鏈,然後讓這條鏈異或這些環,就可以得到對應的另一條鏈!(可以自己畫圖分析一下,博主太懶不想畫圖_(:з」∠)_)

  綜合一下上面的性質,我們就能得到一種算法:進行一遍$DFS$,把所有的環構造成線性基,然後把任意一條從$1$到$n$的鏈放入線性基中求最大異或和。

  $SO$,這道黑題就這麽過了。

  博主手殘寫了個$namespace$,不過好像跑得還挺快。

  Code:

//It is made by HolseLee on 3rd Sep 2018
//Luogu.org P4151
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<iomanip> #include<algorithm> using namespace std; typedef long long ll; const int N=5e4+7,M=2e5+7;; int n,m,head[N],cnte; ll dis[N],b[70]; bool vis[N];
struct Node { int to,nxt; ll val; Node() {} Node(int _to,ll _val,int _nxt): to(_to),val(_val),nxt(_nxt) {} }e[M]; namespace LinerBase { void insert(ll x) { for(int i=63; i>=0; --i) { if( !(x>>i) ) continue; if( !b[i] ) { b[i]=x; break; } else { x^=b[i]; } } } ll quary(ll x) { ll ret=x; for(int i=63; i>=0; --i) { if( (ret^b[i])>ret ) ret^=b[i]; } return ret; } } inline ll read() { char ch=getchar(); ll num=0; bool flag=false; while( ch<0 || ch>9 ) { if( ch==- ) flag=true; ch=getchar(); } while( ch>=0 && ch<=9 ) { num=num*10+ch-0; ch=getchar(); } return flag ? -num : num; } inline void add(int x,int y,ll z) { e[++cnte]=Node(y,z,head[x]); head[x]=cnte; } void dfs(int x,ll now) { dis[x]=now, vis[x]=true; for(int i=head[x]; i; i=e[i].nxt) { if(!vis[e[i].to]) dfs(e[i].to,now^e[i].val); else LinerBase::insert(now^e[i].val^dis[e[i].to]); } } int main() { n=read(); m=read(); int x,y;ll z; for(int i=1; i<=m; ++i) { x=read(), y=read(), z=read(); add(x,y,z); add(y,x,z); } dfs(1,0); printf("%lld\n",LinerBase::quary(dis[n])); return 0; }

洛谷P4151 [WC2011] 最大XOR和路徑 [線性基,DFS]