图论 - 杂项(2-SAT 问题、最短路、其他)
2-SAT 问题
k-SAT 问题
SAT 是适定性(Satisfiability)问题的简称。
k-SAT 问题就是给定 \(n\) 个布尔变量和 \(m\) 个约束条件,每个条件形如 \(x_{p_1}⊕x_{p_2}⊕x_{p_3}⊕\ldots⊕x_{p_k}=0/1\)(\(⊕\) 表示任意逻辑运算),求是否有解并构造。当 \(k>2\) 时,k-SAT 是 NPC 问题。
2-SAT 问题
将每个点拆为两点 \(x_0,x_1\),令 \(\operatorname{inv}(x_0)=x_1,\operatorname{inv}(x_1)=x_0\),分别表示 \(x=0/1\),若 \(x=k\) 能推出 \(y=k'\),则 \(x_{k}\) 连向 \(y_{k'}\)。
注意到原命题与逆否命题等价,因此 2-SAT 建出具有对称性,即若 \(x\to y\) 有边,\(\operatorname{inv}(y)\to \operatorname{inv}(x)\) 也有边。
因此实现上可以用一个函数进行两次连边以简化代码:
void ins(int x, int y) { add(x, y), add(y > n ? y - n : y + n, x > n ? x - n : x + n); }
Tarjan 求解 2-SAT
缩点。
并查集求解特殊 2-SAT
特殊情形:若 \(x\Rightarrow y\),则 \(y\Rightarrow x\),即若干个等价关系 \(x=y\),可以使用并查集缩点。
应用:二分图染色
最短路
SPFA
小常数 \(O(nm)\),可以处理负权。
SPFA-SLF 优化
不一定快。
每次加入点时和队头比较 dis,更优加入队头。
SPFA-SLF-Swap 优化
一定时刻以一定概率检查队头队尾,队尾更优则交换。
SPFA-SLF-分块优化
检查队头队尾,若 dis(x)+B<dis(y) 则交换 x,y。
Dijkstra
不可负权。
- \(O(n^2)\)(朴素)
- \(O(w+n+m)\)(桶)
- \(O((n+m)\log m)\)(STL 优先队列)
- \(O((n+m)\log n)\)(手写二叉堆)
- \(O(n\log n+m)\)(Fibonacci 堆,插入复杂度 \(O(1)\))
Floyed
\(O(n^3)\),可以负权。
Johnson
可负权,首先 SPFA,令 \(w'=dis(u)-dis(v)+w\)。