• 【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
  • 相关阅读:
    Halcon HWindowControl 控件中图像的缩放与移动
    OpenCV cv::mean()函数详解
    OpenCV 霍夫变换(Hough Transform)
    OpenCV 图像分割
    OpenCV 使用ROI进行图像切割
    OpenCV 轮廓查找与绘制-最小外接矩形
    OpenCV 提取轮廓的凸包、外包矩形、最小外包矩形、最小外包圆
    KubeDL 加入 CNCF Sandbox,加速 AI 产业云原生化
    DataWorks 功能实践速览
    coredump 瘦身风云
  • 原文地址:https://www.cnblogs.com/Paul-Guderian/p/9899526.html
Copyright © 2020-2023  润新知