题目链接:LibreOJ 10091「一本通 3.5 例 1」受欢迎的牛
题目描述:
给定一张有向图,问有多少个结点可以从其他所有的结点到达。
题解:
考虑对于一个
DAG
而言,我们可以在toposort
过程中进行DP
求出每个结点可以由多少个结点到达,也就是定义状态dp[u]
表示有多少个结点可以到达结点u
,那么转移方程式容易写出的:
dp[v] = dp[v] + dp[u]
如果u,v
之间存在边。
因此我们可以先将原图进行一次缩点,再同一个强连通块里面的点是可以互相到达的,所以我们只需要考虑缩点后新图上每个点可以从多少个点到达。也就是在新图上面进行toposort
并计算dp
。
代码:LibreOJ10091