#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43410545"); }
题意:找一条异或最长路。
题解:先随便来一条路径,然后我们发现这条路径上可以随便加简单环(不管有没有共点共边)、
就是因为可以先从某点走到环上来一圈再走回来,这样来去的路径被搞没了,简直污得不行。
然后我们可以用线性基来决定去异或哪些环。
并没有错。
算了来点干的吧,上面的都是在扯淡。
SARFT Warning:
5>>64=?
5>>65=?
我来告诉你! 分别是5和2!
那个英文是广电总局的意思。
所以大家注意线性基就安心扫到63得了,不要像我一样作死循环到65。
WA了好久啊!!!!!
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 50100 #define M 101000 using namespace std; struct KSD { int v,next; long long len; }e[M<<1]; int head[N],cnt; inline void add(int u,int v,long long len) { e[++cnt].v=v; e[cnt].len=len; e[cnt].next=head[u]; head[u]=cnt; } int n,m; bool vis[N]; long long d[N],a[M]; long long ins[70]; void dfs(int x) { vis[x]=true; int i,v; for(i=head[x];i;i=e[i].next) { v=e[i].v; if(!vis[v])d[v]=d[x]^e[i].len,dfs(v); else a[++m]=d[v]^e[i].len^d[x]; } } void Ins() { int i,j; for(i=1;i<=m;i++) { for(j=63;j>=0;j--) { if((a[i]>>j)&1) { if(!ins[j]) { ins[j]=a[i]; break; } else a[i]^=ins[j]; } } } long long ans=d[n]; for(i=63;i>=0;i--) if((ans^ins[i])>ans) ans^=ins[i]; printf("%lld\n",ans); } int main() { freopen("test.in","r",stdin); int i,j; long long len; scanf("%d%d",&n,&m); while(m--) { scanf("%d%d%lld",&i,&j,&len); add(i,j,len),add(j,i,len); } dfs(1); Ins(); return 0; }
时间: 2024-10-07 11:18:31