Description
题目链接:Codeforces 1027D
有 $n$ 间屋子和 $1$ 只老鼠,老鼠会从第 $i$ 间房子跑到 $a_i$ 间房子。在每间房子放捕鼠夹都有代价 $c_i$,而老鼠的初始位置可能是任何一个房间,为了保证抓到老鼠(无论老鼠在哪个房间,总有一种路径会经过有捕鼠夹的房子),你需要在若干房间放上捕鼠夹,求最小代价和。
数据范围:$1\le a_i\le n\le 2\cdot 10^5$,$1\le c_i\le 10^4$
Solution
想象成是一张 $n$ 个点、$n$ 条边的基环图,对于每个弱连通块单独处理。
对于第 $i$ 个点,记录是否访问过,如果它还没有答案(起点在 $i$ 时已经能在某个房间抓到老鼠)则进行 $\text{DFS}$。在搜索的过程中,如果遇到了一个已经访问过的点,则说明出现了环。这个环的答案为“搜索中遇到的所有点(用栈维护)的代价最小值”。
代码中, $vis[i]$ 记录是否访问过(用于判环),$mark[i]$ 记录是否已经有答案(用于判断是否需要 $\text{DFS}$)
时间复杂度:$O(n)$
Code
1 |
|