[大战div2D]Codeforces Round #791 (Div. 2) D. Toss a Coin to Your Graph...口胡(二分答案+拓扑排序+dp)
碎碎念
明天要网络赛了,该菜还是菜,哈哈
题意
给定一个\(n\)个点\(m\)条边的有向图,每个点都有一个非负点权\(a[i]\)。初始可以将一枚硬币放在任意一点上,然后沿着可以经过的有向边走\(k-1\)次(即需经过\(k\)个点),求硬币最终经过的所有点的最大点权的最小值。若无论如何走都不可能经过\(k\)个点,输出\(-1\)。
分析
“路径上经过的所有点的最大点权的最小值”具有单调性,显然可以二分答案\(mid\),表示走过路径上的点的最大点权。
因为要使\(mid\)为最大点权,所以在\(check\)函数中,若存在有向边\((u,v),a[u]<=mid,a[v]<=mid\),则\((u,v)\)被视作可走边,反之则不可走。这样我们就得到了一个新图,使得我们在这个新图上无论如何走,走过的点权都\(<=mid\)。
在这个新图上如何确定是否能走过\(k\)个点呢?
显然,当得到的新图存在环,则所有的路径长度都可被取到,经过\(k\)个点的要求一定满足,而判环可以用拓扑排序。
如果得到的新图不存在环,则要找到图中的最长链,判断最长链的点的个数是否\(>=k\)。而找最长链,可以从每个入度为\(0\)的点开始进行\(dp\)(保证一定从某条最长有向链的起始端开始\(dp\)),转移方程为,若存在有向边\((u,v),dp[v]=max(dp[v],dp[u]+1)\)。
“从入度为\(0\)的点开始找”恰好暗合了拓扑排序的思想,因此可以在拓扑排序的过程中顺便完成这个\(dp\)。

浙公网安备 33010602011771号