【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

 

posted @ 2018-11-03 07:42  大米饼  阅读(124)  评论(0编辑  收藏  举报