【bzoj2115】【wc2011】Xor
2115: [Wc2011] Xor
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 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
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
题解:
好评;
无向连通图的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;