P4151-[WC2011]最大XOR和路径【线性基】
生活随笔
收集整理的這篇文章主要介紹了
P4151-[WC2011]最大XOR和路径【线性基】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P4151
題目大意
給一個無向圖,求一條1~n1\sim n1~n的路徑使得異或和最大。
解題思路
很強的思路啊(好像去年YPXYPXYPX大爺就講了反正我也沒聽懂)
我們可以將路徑拆分成三部分:環,連接環的路徑,連接111和nnn的路徑。其中連接環的路徑因為會走兩次所以就不用處理。
那我們發現如果111點能到的環可以任意我們選擇異或或者不異或,也就是對于每個環我們可以丟入線性基中處理。
考慮111到nnn的路徑如何選擇,我們發現對于兩條111到nnn的路徑會構成一個環,也就是如果我們選擇了不優的那一條,那么只要異或上這個大環就可以了。所以我們隨便選擇一條111到nnn的路徑即可。
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=5e4+10; struct node{ll to,next,w; }a[N*4]; ll n,m,tot,d[80],v[N],w[N],ls[N]; void add(ll x){for(ll i=60;i>=0;i--)if((x>>i)&1){if(d[i])x^=d[i];else{d[i]=x;break;}}return; } void addl(ll x,ll y,ll w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return; } void dfs(ll x,ll dis){v[x]=1;w[x]=dis;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(v[y])add(dis^a[i].w^w[y]);else dfs(y,dis^a[i].w);}//v[x]=0;return; } ll solve(ll ans){for(ll i=60;i>=0;i--)if((ans^d[i])>ans)ans^=d[i];return ans; } int main() {scanf("%lld%lld",&n,&m);for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);addl(x,y,w);addl(y,x,w);}dfs(1,0);printf("%lld",solve(w[n])); }總結
以上是生活随笔為你收集整理的P4151-[WC2011]最大XOR和路径【线性基】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多域计算和区域控制器研究:五类设计思路齐
- 下一篇: P4158-[SCOI2009]粉刷匠【