题解:P6122 [NEERC 2016] Mole Tunnels
Priestess_SLG · · 题解
比较经典的 Regret Greedy。前置知识 GSS9 trick:选中一条边之后将这条边的边权取反,下一次被选中的时候边权就可以直接抵消。
先考虑一个错误的做法:每一次每一只鼹鼠贪心的前往这个距离最近的点,容易想到树形 dp 维护:设
但是这显然是错的,因此考虑 Regret Greedy。考虑到若有一条边被不同方向经过了两次,那么不如交换路径然后不经过这条边优秀。此时考虑套用 GSS9 trick,记录每一条边从父亲往儿子结点走的路径数减去从儿子往父亲结点走的路径数:
- 若路径数差
\ge 0 ,则将儿子往父亲边权取反,另一方向边权不变。 - 若路径树差
\le 0 ,则将父亲往儿子边权取反,另一方向边权不变。
这个差值显然可以简单更新,
代码,因为没有封装更新过程所以有点长。