最小生成树&最短路杂题
A
与 cheap robot 是一个题,就是跑多元最短路之后 \(dis_u+dis_v+w(u,v)\) 赋权跑Kruskal重构树即可
B
注意到是网格图,那么 \(u,v\) 不连通也就是以其为源点/汇点存在一个割。转对偶图之后也就是判环,那么在删除 \((u,v)\) 之前对偶图里其对应点已经连通就 NIE
,否则 TAK
C
注意到环上节点个数 \(\le 20\),这启发我们可以枚举。
首先考虑树的情况,当定根时,设 \(g_u\) 为子树 \(u\) 期望行走长度。
- \(u\) 是叶子,\(g_u=0\)
- \(u\) 不是叶子,\(g_u=\frac{\sum_{v\in Son(u)}g_v+w(u,v)}{|Son(u)|}\)
这个容易 \(O(n)\) dp 并且换根求出每个点为根的答案。
然后再考虑环的情况。
注意到我们必然是走到环上一个点之后再随机游走到另一个点然后离开。
设 \(p_{u,v,0/1}\) 为环上第 \(u\) 个节点游走到第 \(v\) 个节点,顺逆时针且下一步走入子树或者不能走的概率,这个通过正反两个方向计算即可。
先考虑求出环上点的 \(g_u\),那么环上点的答案 \(f\) 是容易求的,也就是 \(f_u=\sum g_v·(p_{u,v,0}+p_{u,v,1})+d_{u,v,0}·p_{u,v,0}+d_{u,v,1}·p_{u,v,1}\)
然后考虑环内各个子树就直接换根下去就好了。
啊,还有长度
没有关系的
写出 \(O(n+k^2)\) 之后足以通过本题,但是事实上这个 \(k^2\) 可以优化到 \(O(k)\)。
D
还是比较特殊的dp。
\(dp_u=\min_{(u,v)}\lbrace \max(dp_v-p(u,v),r(u,v))\rbrace\)
考虑按照 \(r(u,v)\) 从大到小处理,如果边 \(r(u,v)\) 还没有被松弛且边权大于它的都已经被松弛,则说明 \(dp_{v}-p(u,v)\) 不可能大于 \(r(u,v)\),直接更新即可。
详细的说,我们使用一个队列进行拓扑排序,每次在拓扑排序完一轮后将当前未松弛的最大的 \(r(u,v)\) 取出进行松弛并标记为已操作,不再后续进行松弛。
E
每个人只会最多踢带一次
显然最短路可以拆点
那么考虑一个球的状态
-
被往东南西北踢
-
被带球
-
被接球
不妨设状态分别是 0/1/2/3/4/5
则 0/1/2/3 的转移方向是固定的,代价是p。
然后 0/1/2/3 也可以转移到5,代价是距离这个位置最小的球员跑过来带球的代价,这个可以通过一个 \(O(hw)\) 的多源BFS求出。
然后 4 的决策可以是往四个方向跑,亦或者用B的代价转到 0/1/2/3 变成踢球,也或者把球接住。而 5 也可以选择松开球也可以选择运球。
所以发现 \(4,5\) 会有一条 \(0\) 的边,所以 \(4,5\) 是等价的,只需要建立 \(5n\) 个点。
建图跑 dijkstra 即可。
F
蠢蛋题目。
按照题意要求根据可达性建立有向图(需要一个虚点辅助),然后缩点,问题变成找出一条路径使得路径上点权和最大。拓扑排序即可。
G
唐氏题目。
有一个简单的 dp:设当前可用边集合不变时,\(f_{i,j,k}\) 表示经过了 \(2^k\) 步从 \(i\) 能否走到 \(j\),显然有 \(f_{i,j,k}|=f_{i,t,k-1}\&f_{t,j,k-1}\)。
一个细节是我们走到 \(n\) 就算胜利,但是可能出现多走一步走不到 \(n\) 的情况,这是简单的,我们直接给 \(n\) 加一个自环即可。
而注意到可用边集合最多变化 \(m\) 次,所以可以预处理每个状态的 \(f\),通过倍增等手段拼出大答案,在 \(O(n^3m\log V)\) 的复杂度下解决这个问题。
这是超时的,但是注意到 \(f_{i,t,k-1}\&f_{t,j,k-1}\) 如果令 \(g_{i,j,k}=f_{j,i,k}\),则可以改写为 \(f_{i,t,k-1}\& g_{j,t,k-1}\),可以使用 bitset
进行优化。
复杂度 \(O(\frac{n^3m\log V}{w})\) 算下来 2.38e8
可以通过。
用 bitset 优化 |& 矩阵快速幂