图论 - 杂项(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\)

posted @ 2023-10-03 08:27  Network_Error  阅读(23)  评论(0)    收藏  举报