图论专题-差分约束系统、强连通分量、二分图
二分图
关押罪犯
看到 最大值最小 的条件首先想到二分,然后问题转化为是否存在一种分配方式,使得所有仇恨值 \(> 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
LYZ-Ice Skates
圆桌会议
根据 Hall 定理,条件转化为对于任意的区间 \([L, R]\),有 \(\displaystyle\sum_{L \le l_i,r_i \le R}a_i \le R - L + 1\)。
进一步的,化为 \(\displaystyle\sum_{L \le l_i,r_i \le R}a_i + L - 1 \le R\)。容易发现,
强连通分量
以下简称强连通分量为 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)\)。
跑最长路,有正环则无解。
狡猾的商人
跟上题一样。