[BZOJ2815][ZJOI2012]灾难(拓扑排序+LCA)
来源:互联网 发布:小程序第三方平台源码 编辑:程序博客网 时间:2024/05/21 09:26
可以想到建一棵灭绝树(森林),也就是说一个节点灭绝后它的子树灭绝。怎么建呢?
由于原图没有环,所以可以想到根据拓扑序建树。对于没有入度的点,直接作为根节点,对于剩下的点,假设现在考虑到了点
建树后,每个节点的
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;inline int read() { int res = 0; bool bo = 0; char c; while (((c = getchar()) < '0' || c > '9') && c != '-'); if (c == '-') bo = 1; else res = c - 48; while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + (c - 48); return bo ? ~res + 1 : res;}const int N = 7e4 + 5, M = 1e6 + 5, LogN = 22;int n, ecnt, nxt[M], adj[N], go[M], ecnt2, nxt2[M], adj2[N], go2[M],ecnt3, nxt3[M], adj3[N], go3[M], dep[N], fa[N][LogN], H, T, Q[M], cnt[N],cnt2[N], sze[N];void add_edge(int u, int v) { nxt[++ecnt] = adj[u]; adj[u] = ecnt; go[ecnt] = v;}void add_edge2(int u, int v) { nxt2[++ecnt2] = adj2[u]; adj2[u] = ecnt2; go2[ecnt2] = v;}void add_edge3(int u, int v) { nxt3[++ecnt3] = adj3[u]; adj3[u] = ecnt3; go3[ecnt3] = v;}int lca(int u, int v) { int i, x; if (dep[u] < dep[v]) swap(u, v); x = dep[u] - dep[v]; for (i = 20; i >= 0; i--) if ((x >> i) & 1) u = fa[u][i]; if (u == v) return u; for (i = 20; i >= 0; i--) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i]; return fa[u][0];}void topo() { int i; H = T = 0; for (i = 1; i <= n; i++) if (!cnt[i]) Q[++T] = i; while (H < T) { int u = Q[++H], tmp = go2[adj2[u]]; for (int e = adj2[u]; e; e = nxt2[e]) tmp = lca(tmp, go2[e]); dep[u] = dep[fa[u][0] = tmp] + 1; for (i = 0; i <= 19; i++) fa[u][i + 1] = fa[fa[u][i]][i]; if (tmp) add_edge3(tmp, u), cnt2[u]++; for (int e = adj[u], v; e; e = nxt[e]) if (!(--cnt[v = go[e]])) Q[++T] = v; }}void dfs2(int u) { sze[u] = 1; for (int e = adj3[u]; e; e = nxt3[e]) dfs2(go3[e]), sze[u] += sze[go3[e]];}void solve() { topo(); int i; for (i = 1; i <= n; i++) if (!cnt2[i]) dfs2(i); for (i = 1; i <= n; i++) printf("%d\n", sze[i] - 1);}int main() { int i, x; n = read(); for (i = 1; i <= n; i++) while (x = read()) add_edge(x, i), add_edge2(i, x), cnt[i]++; solve(); return 0;}
阅读全文
0 0
- [BZOJ2815][ZJOI2012]灾难(拓扑排序+LCA)
- [BZOJ2815][ZJOI2012]灾难 拓扑排序+lca
- BZOJ2815 ZJOI2012 灾难 构造+LCA+树形dp+拓扑排序
- 【拓扑排序+LCA构造Dominator Tree】BZOJ2815 [ZJOI2012]灾难
- 【ZJOI2012】【BZOJ2815】灾难 (catas) {拓扑+倍增lca}
- bzoj2815 灾难 拓扑排序&lca
- [BZOJ2815][ZJOI2012]灾难(倍增lca+top)
- [BZOJ2815][ZJOI2012]灾难(拓扑+倍增)
- BZOJ2815: [ZJOI2012]灾难(支配树)
- BZOJ2815: [ZJOI2012]灾难
- [BZOJ2815][ZJOI2012]灾难-灭绝树
- bzoj2815 [ZJOI2012]灾难 支配树
- 【BZOJ2815】【ZJOI2012】灾难 阿米巴和小强题 动态倍增LCA 灾难树
- [拓扑+LCA]BZOJ 2815——[ZJOI2012]灾难
- P2597 [ZJOI2012]灾难(top+lca)
- 【bzoj2851】【ZJOI2012】【灾难】【LCA】
- 树型动态规划练习题:【bzoj2815】[ZJOI2012]灾难
- BZOJ 2815 [ZJOI2012]灾难 (支配树)拓扑+倍增
- 数据结构之队列
- 编写一个JFrame窗口,要求如下: 1. 在窗口的NORTH区放置一个JPanel面板。 2. JPanel面板放置如下组件: (1) JLable标签,标签文本为“兴趣”,右边接着是三个JChec
- 3台虚拟机搭建Hadoop HA
- Vmware设置网络设置
- springboot 系统学习5 集成 activemq
- [BZOJ2815][ZJOI2012]灾难(拓扑排序+LCA)
- CCNA Data Center DCICT 200-155 Official Cert Guide.pdf 英文原版 免费下载
- 常用学习资料网址
- Java开发练习6.1 事件监听
- Android获取状态栏高度、标题栏高度、编辑区域高度的获取
- python2.x 与 python3.x 中print函数
- 简单DDA算法
- CSS3 Foundations.pdf 英文原版 免费下载
- 【题解/普及】P1028 数的计算