题意,给你一个图,边为有向边,你可以进行如下操作
1:随机选择一条出边走一步
2:删去一条出边
操作均花费1时间
问最短的时间d,使得d时间内一定能从1走到n
这个题是在dijkstra算法上做了修改。
我们可以轻易的发现,从i走到n的最短时间,取决于i走到soni的最短时间,soni是i沿着出边走到的下一个点
这样就能够从n倒过来走,走到1,是一种dp的思想
每走到一个点,就看这个点的所有父亲,判断从哪个父亲转移过来是最好的,之后更新父亲的值
while (dui.size())
{auto [w, now] = dui.top();dui.pop();if (vis[now]) { continue; }vis[now] = 1;va[now] = w;int temp = iINF;for (auto e : retr[now]){temp = du[e]--;//核心代码,当前的节点对于父亲来说,一定是最好的//那么对于父亲来说,比e不好的节点有du[e]个,我们把不好的路都封上,之后更新父亲的值//每选择一个好的点,du[e]--if (vis[e]) { continue; }dui.push({ va[now] + temp,e });}
}
retr是反图