图论题目总结

CF gym 101190B Binary code:

题目大意:

\(n\) 个最多一位未定的 01 字符串,现在请你输出一种方案,表示构造一种填 0/1 的方案。
使得不存在两个字符串一个是另一个的前缀,不存在输出 \(no\)
\(n \le 5 \times 10^5\)

解题思路:

两个串一个为另一个的前缀的很好的判定方式就是一个串在另一个串的 \(Trie\) 子树内。
也就是说我们要建出一棵 01 \(Trie\) 使得字符串对应的节点两两没有祖先关系。

由于每个串最多两种情况,那么我们可以将每种情况都先加到 \(Trie\) 树中。
那么相当于对于每一对有祖先关系的节点都只能选一个。考虑 \(2-sat\)

有一种很精妙的实现方法,就是在递归 Trie 树时记录一个节点表示该点祖先中至少选一个的 ”超级点“。
可以这样是因为我们只关心他不能与祖先有关系,所以我们可以将祖先看成一个整体。
\(O(n)\)

但这么做我觉得扩展不到线段树优化建图上,因为 Trie 每个节点都是一个具体的节点,但线段树一般不会存祖先,如果存的话就得爆了。
不过线段树的应用范围还是更广的,因为即使是这个题也可以将 Trie 拍成 dfn 序,这样在 dfn 序上线段树优化建图多个 log。

CF gym 103371K Three Competitions:

题目大意:

\(n\) 个人进行了 3 场比赛,每场都有个排名,\(i\) 战胜了 \(j\) 当且仅当 \(i\) 在至少两场比赛中排名在 \(j\) 之前。
\(q\) 次询问,每次询问给定 \(a, b\),表示查询 \(a\) 是否间接战胜了 \(b\)
\(n \le 2 \times 10^5\)

解题思路:

我们考虑如果 \(i\) 战胜了 \(j\),那么就从 \(i\) 连向 \(j\) 一条有向边。
现在相当于问你是否可以到达。

但有向图判可达是做不到 \(O(\frac{nm}{w})\) 以下的。
但这是一个竞赛图,竞赛图的一个性质就是缩点后会有一条链。

那么我们可以通过某个K开头的强连通分量算法+线段树就能解决。
\(O(n \log n)\)

CF gym 102059 B. Dev, Please Add This:

题目大意:

有一个 \(n \times m\) 的地图,地图上有一个球,若干个糖果、墙壁和平地。
你每次可以给球前后左右一个方向,那么它会一直走走到墙前/地图边缘。
请问能否碰到所有糖果。
\(n,m \le 50\)

解题思路:

考虑设两个同一行/列上的墙或边界,设他们之间是一段,那么只要在某一步中在这里停下,那么这一段的糖果就都能吃到。
然后由于只能停在墙和边界前面,所以在墙前的位置的另一个方向也可以到达,那么就将此段连一条边到那可到达的段。

这样对于每个糖果就相当于要求到达它横向或竖向的对应的块了。
也就是我们能要找一条路径使得经过每个二元组的至少其中一个。

但每个二元组并非要求恰好一个经过,也有可能两个都经过。
所以我们不能对于每个二元组的关系建 2-sat,但我们可以对于每个点经不经过来建。
那么这些二元组就相当于限制,代表如果第一个不选那么第二个必须选。

这样就符合 2-sat 的原理了。
\(O(n^4)\)

posted @ 2025-07-31 21:55  positive_deviation  阅读(7)  评论(0)    收藏  举报