1. 程式人生 > >Xor HYSBZ - 2115 (線性基)

Xor HYSBZ - 2115 (線性基)

insert init ++ con ont ins struct tps display

Xor

HYSBZ - 2115

題意:給一個樹,求1到n的最長路徑。這裏的路徑定義為異或和。

線性基~~

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 struct LiBase{
 5     ll a[63];
 6     //初始化
 7     void init(){
 8         memset(a,0,sizeof(a));
 9     }
10     //插入
11     bool insert_(ll x){
12         for(int
i=62;i>=0&&x;i--)if(x&(1LL<<i)){ 13 if(!a[i]){ 14 a[i]=x; 15 break; 16 }else x^=a[i]; 17 } 18 return x>0; 19 } 20 //最大 21 ll query_max(ll x){ 22 ll ans=x; 23 for(int i=62;i>=0;i--){
24 if((ans^a[i])>ans) ans^=a[i]; 25 } 26 return ans; 27 } 28 }; 29 const int maxv=50010; 30 const int maxe=100010; 31 int head[maxv]; 32 int cnt=0; 33 struct Edge{ 34 int v,nex; 35 ll w; 36 Edge(int v=0,ll w=0,int nex=0):v(v),w(w),nex(nex){} 37 }e[maxe<<1]; 38
void init(){ 39 cnt=0; 40 memset(head,-1,sizeof(head)); 41 } 42 void add(int u,int v,ll w){ 43 e[cnt]=Edge(v,w,head[u]); 44 head[u]=cnt++; 45 e[cnt]=Edge(u,w,head[v]); 46 head[v]=cnt++; 47 } 48 49 LiBase lb; 50 int n,m; 51 int dfsk; 52 ll dis[maxv],pre[maxv]; 53 54 void dfs(int u,int id){ 55 pre[u]=++dfsk; 56 for(int i=head[u];~i;i=e[i].nex){ 57 if(i==(id^1)) continue; 58 int v=e[i].v; 59 if(!pre[v]){ 60 dis[v]=e[i].w^dis[u]; 61 dfs(v,i); 62 }else if(pre[v]<pre[u]) lb.insert_(dis[u]^e[i].w^dis[v]); 63 } 64 } 65 66 void get_cir(){ 67 memset(pre,0,sizeof(pre)); 68 memset(dis,0,sizeof(dis)); 69 dfsk=0; 70 dfs(1,-1); 71 } 72 int main(){ 73 while(scanf("%d%d",&n,&m)!=EOF){ 74 ll u,v,w; 75 init();lb.init(); 76 for(int i=0;i<m;i++){ 77 scanf("%d%d%lld",&u,&v,&w); 78 if(u!=v) add(u,v,w); 79 else lb.insert_(w); 80 } 81 get_cir(); 82 ll ans=lb.query_max(dis[n]); 83 printf("%lld\n",ans); 84 } 85 return 0; 86 }
View Code

看了眾多dalao的博客終於學會了~

Xor HYSBZ - 2115 (線性基)