P14994 异或最短路和 题解

· · 题解

不会线性基的看这里——《初中生都能看懂的线性基详解》,以下内容均来自我的这篇专栏。

P4151 [WC2011] 最大 XOR 和路径 / CF845G Shortest Path Problem?

给定一张 n 个点 m 条边的带权无向连通图,求 1 号点到 n 号点的(非简单)路径异或和最大 / 小值。

--- 考虑求一个生成树,对于点 $u$ ,其到 $1$ 号点的树边异或和为 $d_u$。对于所有非树边 $(u,v)$,它都对应着一个环 $u\rightarrow1\rightarrow v\rightarrow u$,其权值为 $d_u\oplus d_v\oplus w_{u\rightarrow v}$,发现仅使用这些环,能够线性组合出其它的环,因为走过一条边两次相等于没有走。 将上述所有非树边所对的环加入线性基,最后答案为 $d_n$ 在线性基中的最大 / 小表示。 时间复杂度 $O(m\log V)$。 ```cpp vector<pair<int,ll>>e[N]; void dfs(int u){ vst[u]=1; for(int i=0;i<e[u].size();++i){ int v=e[u][i].first;ll w=e[u][i].second; if(vst[v])L.insert(d[u]^d[v]^w); else{ d[v]=d[u]^w; dfs(v); } } } ``` --- ### [P14994 异或最短路和](https://www.luogu.com.cn/problem/P14994) 给定一张 $n$ 个点 $m$ 条边的带权无向图,求对于每个有序点对之间(非简单)路径异或和最小值之和: $$\sum_{u=1}^n\sum_{v=1}^n\operatorname{dist}(u,v)$$ 若 $u,v$ 无法互达,$\operatorname{dist}(u,v)=0$。 $n,m\leq2\times10^5,V\leq10^{18}$。 --- 若 $u,v$ 可达,则 $\operatorname{dist}(u,v)$ 是 $d_u\oplus d_v$ 在该连通块中所有环构成的线性基中的最小表示。考虑快速计算。 介绍一个性质,假设 $f(x)$ 为 $x$ 在线性基的最小表示, 那么有: $$f(x\oplus y)=f(x)\oplus f(y)$$ 按位考虑,分类讨论易证。 那么原式可以按位计算,时间复杂度 $O((n+m)\log V)$。 ```cpp for(int k=0;k<vec.size();++k){ //枚举连通块内的点 int i=vec[k]; f[i]=L.minrep(d[i]); for(int j=0;j<V;++j)if(f[i]&(1ll<<j))++c[j]; //统计每一位1的个数 } for(int k=0;k<vec.size();++k){ int i=vec[k]; for(int j=0;j<V;++j){ if(f[i]&(1ll<<j))ans=(ans+(1ll<<j)*(vec.size()-c[j])%mod)%mod; else ans=(ans+(1ll<<j)*c[j]%mod)%mod; } } ```