图论杂题选做

图论杂题选做

Problem A. UOJ605 知识网络

相同标签之间的边数太多,所以每个标签建一个新点,点向标签连 \(0\) 边,标签向点连 \(1\) 边。边数降为 \(O(n+m)\)

点数太多,不能直接跑,但标签很少。所以可以先以每个标签为起点跑 01BFS 求出 \(dis\)

对任意一个点 \(x\),标签内的点与其 \(dis\) 相差不超过 \(1\)。建出最短路径图,若 DAG 上 \(y\) 可到达 \(x\),则 \(dis_{y,x}\) 要减一。

但 DAG 上的可达性问题很难做到 \(O(n^2)\) 以下,但可以用 bitset 除 \(w\)。但直接开空间不够,考虑每 \(B\) 个起点一起做,时间 \(O((k+\frac n B)\frac {nB}w)\),空间 \(O(\frac{nB} w)\),取 \(B=300\) 可以通过。

总时间 \(O(k(n+m)+\frac {n^2} w)\),空间 \(O(\frac{nB} w)\)

https://uoj.ac/submission/784273

Problem B. [CF875F] Royal Questions

将每个公主看做 \((u,v,w)\),以每个王子为点,重新建出一张一般图。问题转化为,选出若干边,并给它们定向,使每个点入度最多为 \(1\),最大化边权和。

类似于 Kruskal,求出最大 生成树/基环树森林即可。

https://codeforces.com/contest/875/submission/332940134

Problem C. [ARC092F] Two Faced Edges

对每条边分讨一下:

  • \(u,v\) 在同一 SCC 内。SCC 数量变化,当且仅当 \((u,v)\) 这条边是 \(u\)\(v\) 的必经边。
  • $u,v $ 不在同一 SCC 内。SCC 数量变化,当且仅当 \((u,v)\) 这条边不是 \(u\)\(v\) 的必经边。

我们枚举起点 \(s\),先从前到后枚举 \(s\) 出边,若遍历到 \(t\) 时已经被遍历则 \(t\) 可以被前面的点到达,\((s,t)\) 不是必经边。然后再倒着跑一遍。复杂度 \(O(nm)\)

Submission #68279931 - AtCoder Regular Contest 092

Problem D. UOJ32 跳蚤公路

考虑 bellman-ford 判负环,设 \(f_{u,i}\)\(u\) 点迭代 \(i\) 次的最短路,若 \(f_{u,n}<f_{u,n-1}\)\(x\) 能到达的所有点都有发财路径。

对于 \(x\),我们再加一维,设 \(f_{u,t,i}\)\(u\) 点迭代 \(i\) 次,\(x\) 前系数是 \(t\) 的最短路。那么没有负环,需要满足

\[\min_t \{f_{u,t,n}+tx\}\ge \min_p\{f_{t,p,n-1}+px\} \]

转化为逻辑符号,

\[\forall t,\exists p, f_{u,t,n}+tx\ge f_{u,p,n-1}+px \]

固定 \(t\),对所有 \(p\) 解出的范围取并,然后对所有 \(t\) 解出的范围取交。再更新一下其所能到达的所有节点即可。

提交记录 #790296 - Universal Online Judge

Problem E. UOJ513 清扫银河

对于 1 操作,先随便搞出一个生成森林,每条非树边对应一个简单环。设连通块数量为 \(c\),这样的环不超过 \(m-n+c\) 个。所有的简单环都能由若干个这样的环异或得到。

对于 2 操作,操作可以拆为单点,不超过 \(n-c\) 次。加起来操作次数不超过 \(m+1\),所以只需判断有没有解。

直接将边集扔进线性基是 \(O(m^3/w)\) 的,考虑优化。二操作可以若干个点一起操作,可以只做一次。对于一个 2 操作点集,若操作后每个点的 1 边数量都是偶数就合法。未知数的数量缩小到 \(n\),由此列方程,高斯消元求解,\(O(n^3/w)\)

提交记录 #790383 - Universal Online Judge

Problem F. UOJ61 怎样更有力气

考虑 Kruskal,先将 \(m\) 条链按照 \(w\) 排序。设 \(i\) 链的限制数为 \(p_i\)

\(p_i\) 小于 链大小减一,那么相当于没有限制,直接合并。

否则,可以暴力将链上的点拿出来。找到补图上度数最小的节点 \(x\),则 \(deg_x\) 不超过 \(O(\sqrt{p})\)。 将与 \(x\) 有连边的点放入 \(T\) 集合,其他的放入 \(S\)\(S\) 中的点可以直接与 \(x\) 合并,\(T\) 中节点可以 \(O(|T|^2)\) 合并,然后再合并 \(S,T\),判一下 \(T\) 中点与 \(S\) 的连边是否达到 \(|S|\) 即可。

提交记录 #790545 - Universal Online Judge

posted @ 2025-08-08 10:48  XP3301_Pipi  阅读(29)  评论(0)    收藏  举报
Title