BZOJ 2115: [Wc2011] Xor 线性基

这个题的思路非常神啊,感觉不太好理解...

code:

#include <cstdio> 
#include <algorithm>     
#include <cstring> 
#include <string>  
#define N 100006 
#define ll long long     
using namespace std;    
namespace IO 
{ 
    void setIO(string s) 
    {
        string in=s+".in"; 
        string out=s+".out";       
        freopen(in.c_str(),"r",stdin); 
        // freopen(out.c_str(),"w",stdout);  
    }
}; 
int n,m,edges;  
int hd[N],to[N<<1],nex[N<<1],vis[N];  
ll bin[65],p[65],val[N<<1],sum[N]; 
void add(int u,int v,ll c) 
{
    nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c; 
}
struct Base
{   
    ll p[65];  
    void insert(ll x) 
    {
        for(int i=61;i>=0;--i) 
        {
            if(x&bin[i]) 
            { 
                if(p[i]) x^=p[i]; 
                else { p[i]=x; break; }   
            }
        }
    }
    ll query(ll x)  
    {
        for(int i=61;i>=0;--i) x=max(x,x^p[i]);   
        return x; 
    }         
}base;      
void dfs(int x,int ff,ll pre) 
{ 
    sum[x]=pre,vis[x]=1; 
    for(int i=hd[x];i;i=nex[i]) 
    {
        int y=to[i];        
        if(vis[y]) 
        {
            base.insert(sum[x]^sum[y]^val[i]);  
            continue; 
        }   
        dfs(y,x,sum[x]^val[i]); 
    }   
}
int main() 
{ 
    // IO::setIO("input"); 
    int i,j;    
    scanf("%d%d",&n,&m); 
    for(i=0;i<=61;++i) bin[i]=1ll<<i;   
    for(i=1;i<=m;++i) 
    {
        int x,y; 
        ll z; 
        scanf("%d%d%lld",&x,&y,&z),add(x,y,z),add(y,x,z);  
    } 
    dfs(1,0,0); 
    printf("%lld\n",base.query(sum[n]));      
    return 0;  
}

  

posted @ 2020-01-10 13:49  EM-LGH  阅读(108)  评论(0编辑  收藏  举报