zoukankan      html  css  js  c++  java
  • BZOJ2115 WC2011 XOR

    一开始的时候被吓傻了

    但一条边异或两次就毫无意义了

    所以跑出来的结果是一条路径加若干环

    判环用高斯消元就好了

    最后把每个环与直接跑路径的结果做比较就好了

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N=200010;
     5 vector<pair<int,ll> > G[N];
     6 bool vis[N];
     7 int cir,tot,cnt,n;
     8 ll d[N],V[N];
     9 void dfs(int u){
    10     vis[u]=1;
    11     for(int i=0,i_end=G[u].size();i<i_end;++i){
    12         int v=G[u][i].first;
    13         ll w=G[u][i].second;
    14         if(!vis[v])d[v]=d[u]^w,dfs(v);
    15         else V[++cir]=d[u]^d[v]^w;
    16     }
    17 }
    18 void Gauss(){
    19     for(ll i=1ll<<60;i;i>>=1){
    20         
    21         int j=tot+1;
    22         while(j<=cir&&!(V[j]&i))j++;
    23         if(j==cir+1)continue;
    24         
    25         tot++;swap(V[tot],V[j]);
    26         
    27         for(int k=1;k<=cir;k++)
    28             if(k!=tot&&(V[k]&i))
    29                 V[k]^=V[tot];
    30     }
    31 }
    32 int main(){
    33     int m;
    34     scanf("%d%d",&n,&m);
    35     while(m--){
    36         int u,v;ll w;
    37         scanf("%d%d%lld",&u,&v,&w);
    38         G[u].push_back(make_pair(v,w));
    39         G[v].push_back(make_pair(u,w));
    40     }
    41     dfs(1);Gauss();
    42     ll ans=d[n];
    43     for(int i=1;i<=tot;++i)
    44         ans=max(ans,ans^V[i]);
    45     printf("%lld
    ",ans);
    46     return 0;
    47 }

    不算太麻烦,只是一开始写高斯消元写挂了

    还是要多多练习

  • 相关阅读:
    NPOI导出excel表格应用
    通过用户密码获取共享文件
    sql之left join、right join、inner join的区别
    C#日志编写
    C#预编译指令
    匿名类型(C# 编程指南)
    反射
    SQL通用查询
    Lambda 表达式(C# 编程指南)
    自定义用户控件编写——(文件夹目录选择)
  • 原文地址:https://www.cnblogs.com/ndqzhang1111/p/6863942.html
Copyright © 2011-2022 走看看