分析
我们发现任取条路径
对于路径外的环一定可以将它完整的取到
而对于和路径有交的环相当于用一段新路径代替原来的一段路径
所以我们只需求出任意一个1到n的路径和图上所有环的值
然后借助线性基求出异或最大值即可
代码
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cctype> #include<cmath> #include<cstdlib> #include<queue> #include<ctime> #include<vector> #include<set> #include<map> #include<stack> using namespace std; #define fi first #define se second #define mp make_pair #define pb push_back #define li long long vector<pair<int,li> >v[100100]; int n,m,vis[100100]; li bel[110],d[100100],ans; inline void ins(li x){ for(int i=63;i>=0;i--) if((1ll<<i)&x){ if(!bel[i]){ bel[i]=x; break; } x^=bel[i]; } } inline void q(){ for(int i=63;i>=0;i--) if((bel[i]^ans)>ans){ ans^=bel[i]; } } inline void dfs(int x,li res){ d[x]=res; vis[x]=1; for(int i=0;i<v[x].size();i++){ int y=v[x][i].fi; li z=v[x][i].se; if(!vis[y])dfs(y,res^z); else ins(res^z^d[y]); } } int main(){ int i,j,k; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ int x,y; li z; scanf("%d%d%lld",&x,&y,&z); v[x].pb(mp(y,z)); v[y].pb(mp(x,z)); } dfs(1,0ll); ans=d[n]; q(); printf("%lld\n",ans); return 0; }
原文地址:https://www.cnblogs.com/yzxverygood/p/11519626.html
时间: 2024-11-08 02:10:50