传送门:
bzoj4681
bzoj2143
bzoj2259
bzoj4681
这题好神啊!
首先贪心(取最短路树然后用不在树上的最小权去换)显然是不正确的,但是贪心的思想值得借鉴:
最后的答案必然是前 L L L小的边+后面的一些边。
于是枚举这个 L L L跑 s p f a spfa spfa, f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示从起点到 i i i经过了 j j j条前 L L L小的边,交换了 k k k次值所选的所有未交换的不是前 L L L小的边的边权和。
转移:
一条前
L
L
L小的出边,转移直接加上
j
+
1
j+1
j+1;否则要么
k
+
1
k+1
k+1,要么加上这条边的边权。
bzoj2143
暴力的话边太多了。
实际上可以把
a
i
,
j
a_{i,j}
ai,j看做话费
a
i
,
j
a_{i,j}
ai,j获得了可以走
b
i
,
j
b_{i,j}
bi,j距离的能量。
每走一格消耗一点能量。
d
i
s
[
150
]
[
150
]
[
300
]
dis[150][150][300]
dis[150][150][300]的转移。
bzoj2259
BIT优化DP的做法就不具体说了。
考虑连边求 1 1 1到 ( n + 1 ) (n+1) (n+1)的最短路:
i → i + S i + 1 i\to i+S_i+1 i→i+Si+1的边权为0(对于所有 i + S i + 1 ≥ n + 1 i+S_i+1\geq n+1 i+Si+1≥n+1的点就连一条 i → n + 1 i\to n+1 i→n+1边权为 i + S i − n i+S_i-n i+Si−n的边)。
i
→
i
+
S
i
+
1
±
j
i\to i+S_i+1\pm j
i→i+Si+1±j的边权为
j
j
j,连边可以优化:
i
i
i先到达
i
+
S
i
+
1
i+S_i+1
i+Si+1和从
i
+
S
i
+
1
i+S_i+1
i+Si+1到达与它距离为
j
j
j的点的过程实际上是无关的:所以我们只需要
(
i
,
i
+
1
)
,
(
i
,
i
−
1
)
(i,i+1),(i,i-1)
(i,i+1),(i,i−1)均连上边权为1的边即可。