1. 程式人生 > >BZOJ 2115 [Wc2011] Xor

BZOJ 2115 [Wc2011] Xor

amp void for cloc 最大路 == while log --

題解:xor最大路徑一定是幾個環加上從1到n的路徑

環用tarjan處理

最大xor和用線性基處理

喵啊

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint;
const int maxn=50007;

int n,m;
Lint ans;

int cntedge;
int head[maxn];
int to[maxn<<2],nex[maxn<<2];
Lint dist[maxn<<2];
void Addedge(int x,int y,Lint z){
	nex[++cntedge]=head[x];
	to[cntedge]=y;
	dist[cntedge]=z;
	head[x]=cntedge;
}

Lint p[maxn];
int dfsclock;
int pre[maxn],lowlink[maxn];
Lint depth[maxn];
void Dfs(int u,int fa){
	pre[u]=lowlink[u]=++dfsclock;
	
	for(int i=head[u];i;i=nex[i]){
		if(to[i]==fa)continue;
		if(!pre[to[i]]){
			depth[to[i]]=depth[u]^dist[i];
			Dfs(to[i],u);
			lowlink[u]=min(lowlink[u],lowlink[to[i]]);
		}else{
			lowlink[u]=min(lowlink[u],pre[to[i]]);
			Lint x=depth[u]^depth[to[i]]^dist[i];
			for(int j=62;j>=1;--j){
				if(x&(1LL<<(j-1))){
					if(p[j]){
						x^=p[j];
					}else{
						p[j]=x;break;
					}
				}
			}
		}
	}
}

int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int x,y;Lint z;
		scanf("%d%d%lld",&x,&y,&z);
		Addedge(x,y,z);Addedge(y,x,z);
	}
	
	Dfs(1,0);
	ans=depth[n];
	for(int j=62;j>=1;--j){
		if((ans^p[j])>ans)ans=(ans^p[j]);
	}
	cout<<ans<<endl;
	return 0;
}

  

BZOJ 2115 [Wc2011] Xor