• 845G


    845G - Shortest Path Problem?

    题意:给一个树,求1到n的最短路径。这里的路径定义为异或和。

    线性基~

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 struct LiBase{
     5     ll a[63];
     6     //初始化
     7     void init(){
     8         memset(a,0,sizeof(a));
     9     }
    10     //插入
    11     bool insert_(ll x){
    12         for(int i=62;i>=0&&x;i--)if(x&(1LL<<i)){
    13             if(!a[i]){
    14                 a[i]=x;
    15                 break;
    16             }else x^=a[i];
    17         }
    18         return x>0;
    19     }
    20     //最大
    21     ll query_min(ll x){
    22         ll ans=x;
    23         for(int i=62;i>=0;i--){
    24             if((ans^a[i])<ans) ans^=a[i];
    25         }
    26         return ans;
    27     }
    28 };
    29 const int maxv=100010;
    30 const int maxe=100010;
    31 int head[maxv];
    32 int cnt=0;
    33 struct Edge{
    34     int v,nex;
    35     ll w;
    36     Edge(int v=0,ll w=0,int nex=0):v(v),w(w),nex(nex){}
    37 }e[maxe<<1];
    38 void init(){
    39     cnt=0;
    40     memset(head,-1,sizeof(head));
    41 }
    42 void add(int u,int v,ll w){
    43     e[cnt]=Edge(v,w,head[u]);
    44     head[u]=cnt++;
    45     e[cnt]=Edge(u,w,head[v]);
    46     head[v]=cnt++;
    47 }
    48 
    49 LiBase lb;
    50 int n,m;
    51 int dfsk;
    52 ll dis[maxv],pre[maxv];
    53 
    54 void dfs(int u,int id){
    55     pre[u]=++dfsk;
    56     for(int i=head[u];~i;i=e[i].nex){
    57         if(i==(id^1)) continue;
    58         int v=e[i].v;
    59         if(!pre[v]){
    60             dis[v]=e[i].w^dis[u];
    61             dfs(v,i);
    62         }else if(pre[v]<pre[u]) lb.insert_(dis[u]^e[i].w^dis[v]);
    63     }
    64 }
    65 
    66 void get_cir(){
    67     memset(pre,0,sizeof(pre));
    68     memset(dis,0,sizeof(dis));
    69     dfsk=0;
    70     dfs(1,-1);
    71 }
    72 int main(){
    73     while(scanf("%d%d",&n,&m)!=EOF){
    74         int u,v;
    75         ll w;
    76         init();lb.init();
    77         for(int i=0;i<m;i++){
    78             scanf("%d%d%lld",&u,&v,&w);
    79             if(u!=v) add(u,v,w);
    80             else lb.insert_(w);
    81         }
    82         get_cir();
    83         ll ans=lb.query_min(dis[n]);
    84         printf("%lld
    ",ans);
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    解决博客园中代码着色问题
    使用OutputDebugString输出调试信息
    Android编程小实验
    在安卓3.0以下版本使用Fragment的注意事项
    开源中国客户端源码阅读笔记
    C++基础
    IO流
    OAuth笔记
    反射
    链表
  • 原文地址:https://www.cnblogs.com/yijiull/p/7425490.html
Copyright © 2020-2023  润新知