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 }