zoukankan      html  css  js  c++  java
  • 【BZOJ2115】【WC2011】—Xor(线性基)

    传送门

    发现最后路径一定是一条路径加上很多个环
    因为重复走的路径已经被消除了

    就只需要把所有环找到求出线性基就可以了

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    inline int read(){
    	char ch=getchar();
    	int res=0,f=1;
    	while(!isdigit(ch))f^=ch=='-',ch=getchar();
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
    	return f?res:-res;
    }
    inline ll readl(){
    	char ch=getchar();
    	ll res=0,f=1;
    	while(!isdigit(ch))f^=ch=='-',ch=getchar();
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
    	return f?res:-res;
    }
    const int N=50005;
    const int M=200005;
    int adj[N],nxt[M],to[M],vis[N],tot,cnt;
    ll p[65],val[M],cir[M],dis[N];
    inline void addedge(int u,int v,ll k){
    	nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v,val[cnt]=k;
    }
    void dfs(int u,int fa){
    	vis[u]=1;
    	for(int e=adj[u];e;e=nxt[e]){
    		int v=to[e];
    		if(v==fa)continue;
    		if(!vis[v])dis[v]=dis[u]^val[e],dfs(v,u);
    		else cir[++tot]=dis[u]^dis[v]^val[e];
    	}
    }
    signed main(){
    	int n=read(),m=read();
    	for(int i=1;i<=m;i++){
    		int u=read(),v=read();ll w=readl();
    		addedge(u,v,w),addedge(v,u,w);
    	}
    	dfs(1,0);
    	ll ans=dis[n];
    	for(int i=1;i<=tot;i++){
    		for(int j=60;~j;j--){
    			if(!(cir[i]>>j))continue;
    			if(p[j])cir[i]^=p[j];
    			else {p[j]=cir[i];break;}
    		}
    	}
    	for(int i=60;~i;i--)ans=max(ans,ans^p[i]);
    	cout<<ans<<'
    ';
    }
    
    
  • 相关阅读:
    git 简单操作
    JS中substr与substring的区别
    手写map, filter函数
    node之pipe
    nodejs之child_process
    node真的是单线程模式吗
    【xinsir】分享一个查找文件的脚手架
    【xinsir】函数库,持续更新
    数组循环方法统计
    20190916
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145562.html
Copyright © 2011-2022 走看看