https://www.zybuluo.com/ysner/note/1331590
---
##题面
[戳我][1]
##解析
一道挺不错的图论题。
###$50pts$算法
模拟。
$O(n^2)$暴力随便秒。
咕谷上居然有$70pts$。
```
il void dfs(re int u)
{
  for(re int i=h[u];i+1;i=e[i].nxt)
    {
      re int v=e[i].to;
      if(!--g[v]) ++ans,dfs(v);
    }
}
int main()
{
  memset(h,-1,sizeof(h));
  n=gi();
  fp(i,1,n)
    {
      re int x=gi();
      while(x)
    {
      add(x,i);++d[i];
      x=gi();
    }
    }
  fp(i,1,n)
    {
      fp(j,1,n) g[j]=d[j];
      ans=0,dfs(i),printf("%d\n",ans);
    }
  return 0;
}
```
###$100pts$算法
一个点灭绝,要求其所有入度灭绝。
它所有入度灭绝,要求它所有入度的$lca$灭绝。
这样,就说明这个点对$lca$的灾难值有贡献。
什么,你说这不是树?
给所有入度为$0$的点加一个虚拟父亲不就是树了吗?
比较容易想到的$idea$,但这样复杂度还是$O(n^2)$。
考虑到如果一个点$u$单独对$lca$有贡献,那么所有对它有贡献的点也对$lca$有贡献。
这种关系实际为$lca$包含$u$,可以用树形结构中的父子关系体现。
于是我们可以依此关系重建树。
想想这是一张有向无环图,八成考拓扑排序。
那么就按拓扑序建树,每个点的父亲就是它所有入度点的$lca$。
$lca$必须用倍增求,因为这是动态维护信息。
这样建完树后,各点答案就是各点子树大小$-1$。
```
#include[ZJOI2012]灾难
原文:https://www.cnblogs.com/yanshannan/p/9903885.html