首页 > 其他 > 详细

[ZJOI2012]灾难

时间:2018-11-04 14:43:45      阅读:137      评论:0      收藏:0      [点我收藏+]
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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!