图论专题-差分约束系统、强连通分量、二分图

发布时间 2024-01-09 21:04:11作者: Rainsheep

图论专题-差分约束系统、强连通分量、二分图

题单

二分图

关押罪犯

看到 最大值最小 的条件首先想到二分,然后问题转化为是否存在一种分配方式,使得所有仇恨值 \(> mid\) 的罪犯分在两间牢房里。

我们不能让所有仇恨值 $ > mid$ 的罪犯对分到一个牢房里,如果把罪犯之间的仇恨关系看作是一条边,那也就是说同一牢房内不能存在连边,那么也就是判断所有 \(> mid\) 的边是否可以构成一张 二分图。直接染色即可。

时间复杂度 \(O(n\log C)\)

棋盘覆盖

对于格子 \((x,y)\) 而言,令 \(f(x, y) = x + y\)

对于一个格子而言,我们发现如果试图在上面放骨牌,被覆盖到的两个格子的 \(f\) 奇偶性一定不同。这启发我们按 \(f\) 的奇偶性将整个网格分成两部分,一个格子则向其周围四联通(上下左右)的格子连边,那么一个地方放置了骨牌等价于在二分图中获得了匹配。

匈牙利求最大匹配即可,时间复杂度 \(O(nm)\)

Machine Schedule

考虑两台机器,一个任务在两台机器上的工作状态,我们如果将这种完成关系看作是连边的话,那么这个任务只需要被选择一个端点(即机器工作的状态)即可。

那么,我们对每个人物在 \(A,B\) 上的状态连边,因为我们需要所有任务都被完成,所以问题转化为 最小点覆盖,由 最小点覆盖 = 最大匹配,匈牙利即可。时间复杂度 \(O(nm)\)

需要预先排除需要 \(0\) 状态的任务,显然我们可以在开始切换状态前处理它们。

另外,因为一个机器不同的状态间不会有连边,所以这是一张二分图。

Exploration plan

首先我们发现满足条件随时间单调,所以可以考虑二分时间,问题转化为,给定时间,判断能否在给定时间内保证 \(k\) 个点上。

首先按照最短路走一定最优,另外,一个点肯定最优策略中肯定只由一个点转移而来。我们在每次二分中,从每个出发点向最短路 \(< mid\) 的点连边,这样每个匹配就对应了一次转移。

只需检查匹配数是否 $ \ge k$ 即可。

Magic

强连通分量

以下简称强连通分量为 scc。

受欢迎的牛 G

题目中对喜欢的概念容易发现有传递性。更进一步的,我们发现一个强连通分量内的牛都会互相喜欢,因为根据定义它们互相可达。

一个强连通分量如果想要所有的牛都喜欢它,那么需要其他所有 scc 都能通过某种方式将喜欢传达出去,也就是说,除了明星 scc 外,别的所有的 scc 的出度不能为 \(0\),否则这个 scc 的喜欢无法传递出去。

缩点判断 scc 度数即可。

但是,出度不为 \(0\) 就能保证喜欢可以传递到明星 scc 吗?

我们将明星 scc 提起作为根。因为保证了除了根之外的点的出度都 \(> 0\),所以对于所有叶子,他们都连向其父亲,而对于父亲,再向其儿子连边会合并 scc,所以这条出边为其父亲,对于每一层都是如此,所以可以保证从所有点出发都能到达根。

杀人游戏

间谍网络

.
容易发现一个 scc 内只要有一个人被贿赂则其他人都可以接续掌控。并且,我们可以根据该 scc 走到别的相邻的 scc,这也就是说,如果一个 scc 有入度,那么贿赂其中一人一定不优,因为从入度方向贿赂同样可以推平这个 scc。

这么说来,我们选择 没有入度 的 scc 才是最具性价比的,并且记得选择其中的 \(\min\)

考虑无解,一个 scc 如果既不能被揭发,又不能被贿赂,那么这个 scc 就是安全的。不过如果揭发该间谍的 scc 同样安全,我们发现这个揭发关系是具有传递性的,所以可以拓扑排序递推出每个点是否安全。

抢掠计划

不难发现一个 scc 内的银行都可以相互到达,因为 \(a_i \ge 0\),所以一旦到了某个 scc 就必会走完。由此,我们将一个 scc 视作是一个点也无可厚非,且 \(A_i = \displaystyle \sum_{u \in scc_i} a_i\)

对于答案的计算,考虑拓扑排序直接从起点开始 dp,转移式显然为 \(f_v = \displaystyle\max_{(u, v) \in E}f_u + A_v\)

对所有可达酒馆取 \(\max\) 即为答案。

2-SAT

2-SAT

模板题。

和平委员会

对于互斥的 \((u, v)\),又因为每对代表都必须出席,则有边 \((u, v'), (v, u')\)。判断每一对是否在一个 scc 里即可。

对于方案,我们考虑 scc 编号越小的实际上拓扑序越大,因为我们一次 tarjan 是 dfs,会先将深处的点标记。那么,我们在每一对中选择拓扑序较大的。

对于原因,从拓扑序小的点出发,可能会染出与后面的点相违的颜色,所以我们优先选择拓扑序较大的作为方案。

差分约束系统

小 K 的农场

  • 对于第一个条件,转化为 \(a - b \ge c \Rightarrow b\le a-c\)。连边 \((a,b,-c)\)
  • 对于第二个条件,转化为 \(a - b \le c \Rightarrow a \le b + c\)。连边 \((b, a, c)\)
  • 对于第三个条件,转化为 \(a - b \le 0 \Rightarrow a \le b + 0\), \(a - b \ge 0 \Rightarrow b \le a + 0\)。连边 \((b,a,0), (a,b,0)\)

判断负环即可。

倍杀测量者

我们发现女装人数是随 \(T\) 的增大而单调递减的,并且实数这个东西看起来也没那么好办,于是二分 \(T\)。问题转化为给定了一些限制条件,判断是否存在方案使得在给定 \(T\) 下有人女装。

我们试试变变这些条件。

选手 A 立下了 “我没 \(k\) 倍杀选手 B 就女装” 的 Flag。

那么有 \(\dfrac{s_A}{s_B} \ge (k_i - T)\),这个条件看上去非常的棘手,不同于传统的差分约束,这里是一个分数,我们想把它转化为加法。

于是我们在不等式两边同时取 \(\log\)(底数随意,这里取 \(2\))。原不等式化为 \(\log_2s_A-\log_2s_B \ge (k_i - T)\)。进一步化为 \(\log_2s_A \ge \log_2s_B + (k_i - T)\),这样就可以转化为最长路判断正环了。

选手 A 立下了 “选手 B 把我 \(k\) 倍杀我就女装” 的 Flag。

如法炮制,有 \(\dfrac{s_B}{s_A} < (k_i + T) \Rightarrow \log_2s_B-\log_2s_A < (k_i + T) \Rightarrow \log_2s_A > \log_2s_B-(k_i + T)\)

对于无解,我们直接代入 \(T = 0\) 判断此时是否有人女装即可。

Intervals

对于每个区间约束 \((l_i, r_i, w_i)\),因为要变为最短路的形式,很自然的想到做前缀和后,约束转化为 \(s_{r_i} - s_{l_i - 1} \ge w_i \Rightarrow s_{r_i} \ge s_{l_i - 1} + w_i\),连边 \((l_i - 1, w_i, r_i)\)

另外,由于每个点最多贡献 \(1\),为了保证这个有不等式 \(s_i - s_{i - 1} \le 1 \Rightarrow s_{i - 1} \ge s_i - 1\),连边 \((i, i - 1, -1)\)

不仅,由于是前缀和,所以还有 \(s_i \ge s_{i - 1} + 0\),连边 \((i - 1, i, 0)\)

跑最长路,有正环则无解。

狡猾的商人

跟上题一样。