1. 程式人生 > >【bzoj2115】【wc2011】Xor

【bzoj2115】【wc2011】Xor

2115: [Wc2011] Xor

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 5380  Solved: 2249
[ Submit][ Status][ Discuss]

Description

Input

第一行包含兩個整數N和 M, 表示該無向圖中點的數目與邊的數目。 接下來M 行描述 M 條邊,每行三個整數Si,Ti ,Di,表示 Si 與Ti之間存在 一條權值為 Di的無向邊。 圖中可能有重邊或自環。

Output

僅包含一個整數,表示最大的XOR和(十進位制結果),注意輸出後加換行回車。

Sample Input

5 7

1 2 2

1 3 2

2 4 1

2 5 1

4 5 3

5 3 4

4 3 2

Sample Output

6

HINT

 

 

Source

 
[ Submit][ Status][ Discuss]

 

題解:
       好評;
      無向連通圖的dfs樹有很好的性質  : 只有樹邊和返祖邊(由自己指向自己祖先的邊);
      由於是異或,一條樹上路徑可以任意和環組合還是一條路徑;

      所以答案是一些小環 ^ 1到n的路徑異或和;
      處理每個小環的值線性基貪心;
      20181030

 

 

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6
#include<cmath> 7 #include<vector> 8 #include<stack> 9 #include<map> 10 #include<set> 11 #define Run(i,l,r) for(int i=l;i<=r;i++) 12 #define Don(i,l,r) for(int i=l;i>=r;i--) 13 #define ll long long 14 #define inf 0x3f3f3f3f 15 using namespace std; 16 const int N=200010; 17 int n,m,vis[N],del[N],hd[N],o; 18 ll dis[N]; 19 struct Edge{int v,nt; ll w;}E[N]; 20 struct Basis{ 21 ll d[60]; 22 Basis(){memset(d,0,sizeof(d));} 23 int cal(ll x){ 24 int re=0; 25 for(int i=32;i;i>>=1)if(x>>i)re+=i,x>>=i; 26 return re+1; 27 } 28 void ins(ll x){ 29 for(int i=cal(x);~i;i--)if(x>>i){ 30 if(!d[i]){d[i]=x;break;} 31 else x^=d[i]; 32 } 33 } 34 ll query(ll x){ 35 for(int i=59;~i;i--)if(d[i]){ 36 if((x^d[i])>x)x^=d[i]; 37 } 38 return x; 39 } 40 }A; 41 char gc(){ 42 static char*p1,*p2,s[1000000]; 43 if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin); 44 return(p1==p2)?EOF:*p1++; 45 } 46 ll rd(){ 47 ll x=0; char c=gc(); 48 while(c<'0'||c>'9')c=gc(); 49 while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc(); 50 return x; 51 } 52 void adde(int u,int v,ll w){ 53 E[o]=(Edge){v,hd[u],w};hd[u]=o++; 54 E[o]=(Edge){u,hd[v],w};hd[v]=o++; 55 } 56 void dfs(int u){ 57 for(int i=hd[u];~i;i=E[i].nt)if(!del[i]){ 58 del[i]=del[i^1]=1; 59 int v=E[i].v; 60 if(!vis[v]){ 61 vis[v]=1; 62 dis[v] = dis[u] ^ E[i].w; 63 dfs(v); 64 }else{ 65 A.ins(dis[u]^dis[v]^E[i].w); 66 } 67 } 68 } 69 int main(){ 70 freopen("in.in","r",stdin); 71 freopen("out.out","w",stdout); 72 n=rd(); m=rd(); 73 Run(i,1,n)hd[i]=-1; 74 Run(i,1,m){ 75 int u=rd() , v=rd() ; ll w=rd(); 76 adde(u,v,w); 77 } 78 dfs(1); 79 cout<<A.query(dis[n])<<endl; 80 return 0; 81 }//by tkys_Austin;
View Code