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
原文地址:https://www.cnblogs.com/yijiull/p/7425490.html