[ZJOI2012]灾难
Posted yanshannan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ZJOI2012]灾难相关的知识,希望对你有一定的参考价值。
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 ",ans); } return 0; } ``` ###$100pts$算法 一个点灭绝,要求其所有入度灭绝。 它所有入度灭绝,要求它所有入度的$lca$灭绝。 这样,就说明这个点对$lca$的灾难值有贡献。 什么,你说这不是树? 给所有入度为$0$的点加一个虚拟父亲不就是树了吗? 比较容易想到的$idea$,但这样复杂度还是$O(n^2)$。 考虑到如果一个点$u$单独对$lca$有贡献,那么所有对它有贡献的点也对$lca$有贡献。 这种关系实际为$lca$包含$u$,可以用树形结构中的父子关系体现。 于是我们可以依此关系重建树。 想想这是一张有向无环图,八成考拓扑排序。 那么就按拓扑序建树,每个点的父亲就是它所有入度点的$lca$。 $lca$必须用倍增求,因为这是动态维护信息。 这样建完树后,各点答案就是各点子树大小$-1$。 ``` #include以上是关于[ZJOI2012]灾难的主要内容,如果未能解决你的问题,请参考以下文章