bzoj2815[灾难] 灭绝树 ( 灭绝树上灭绝果,灭绝树下你和我)
来源:互联网 发布:c语言三种循环结构 编辑:程序博客网 时间:2024/04/30 06:37
灭绝树的定义:
灭绝树上,如果 u 是 v 的父亲 ,如果 u 挂了,那么 v 也要挂 。
怎么构造灭绝树?
拓扑排序+lca
主要的思想:
一个点的前驱的LCA一定是一个数到根的必经点
作用:
找必经点
#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 1e5 + 10 ;struct Edge { int nxt , to ;};Edge e [ N * 20 ] , t [ N * 20 ] ;int head [N] , headt [N] ;int tot , tot1 , n ;int in [N] , fa [N] [25] , bin [20] , dep [N] , sz [N] ;vector <int> q , st ;void addeage ( int u , int v ) { ++ tot ; e [tot].nxt = head [u] ; e [tot].to = v ; head [u] = tot ; in [v] ++ ;}void addeage1 ( int u , int v ) { ++ tot1 ; t [tot1].nxt = headt [u] ; t [tot1].to = v ; headt [u] = tot1 ;}void dfs ( int u ) { sz [u] = 0 ; for ( int i = headt [u] ; i ; i = t [i].nxt ) { int v = t [i].to ; if ( v == fa [u] [0] ) continue ; fa [v] [0] = u ; dfs ( v ) ; sz [u] += sz [v] + 1 ; }}void pre ( int u ) { for ( int i = 1 ; bin [i] <= dep [u] ; ++ i ) { fa [u] [i] = fa [ fa [u] [ i - 1 ] ] [ i - 1 ] ; }}int LCA ( int u , int v ) { if ( u == -1 ) return v ; if ( dep [u] < dep [v] ) swap ( u , v ) ; int t = dep [u] - dep [v] ; for ( int i = 0 ; bin [i] <= t ; ++ i ) if ( t & bin [i] ) u = fa [u] [i] ; if ( u == v ) return u ; for ( int i = 17 ; i >= 0 ; -- i ) { if ( fa [u] [i] != fa [v] [i] ) { u = fa [u] [i] ; v = fa [v] [i] ; } } return fa [u] [0] ;}void top () { for ( int i = 1 ; i <= n ; ++ i ) if ( ! in [i] ) st.push_back ( i ) ; while ( ! st.empty () ) { int u = st.back () ; st.pop_back () ; q.push_back ( u ) ; for ( int i = head [u] ; i ; i = e [i].nxt ) { int v = e [i].to ; in [v] -- ; if ( ! in [v] ) st.push_back ( v ) ; } } }void build () { for ( int i = q.size () - 1 ; i >= 0 ; -- i ) { int u = q [i] ; int fat = -1 ; for ( int j = head [u] ; j ; j = e [j].nxt ) fat = LCA ( fat , e [j].to ) ; if ( fat == -1 ) fat = 0 ; addeage1 ( fat , u ) ; dep [u] = dep [fat] + 1 ; fa [u] [0] = fat ; pre ( u ) ; }}int main () { bin [0] = 1 ; for ( int i = 1 ; i < 20 ; ++ i ) bin [i] = bin [ i - 1 ] * 2 ; scanf ( "%d" , & n ) ; for ( int i = 1 ; i <= n ; ++ i ) { int x ; scanf ( "%d" , & x ) ; while ( x != 0 ) { addeage ( i , x ) ; scanf ( "%d" , & x ) ; } } top () ; build () ; dfs ( 0 ) ; for ( int i = 1 ; i <= n ; ++ i ) printf ( "%d\n" , sz [i] ) ; return 0 ;}
阅读全文
0 0
- bzoj2815[灾难] 灭绝树 ( 灭绝树上灭绝果,灭绝树下你和我)
- [BZOJ2815][ZJOI2012]灾难-灭绝树
- BZOJ 2815 灾难 (灭绝树)
- BZOJ 2815 [ZJOI2012]灾难【灭绝树
- bzoj 2815(LCA+拓扑排序)(灭绝树)
- 人类灭绝时间表
- 生物大灭绝
- 屁 是恐龙灭绝的罪魁祸首?
- 人类到底要不要灭绝蚊子?
- 恐龙灭绝与电脑的相关性[原创]
- 恐龙的灭绝与青藏高原有关!
- 真正的自重...小偷可以灭绝
- 计算机发展最终导致人类灭绝
- ESET现今称Flashback木马威胁“灭绝”
- 【转载】灭绝了的莱州湾纹蛤
- 人工智能革命:人类将永生或者灭绝
- Google翻译,3个步骤灭绝人类
- 人工智能革命:人类将永生或者灭绝
- 爬虫工具:虚拟机Selenium和PhantomJS,ChromeDriver 镜像安装教程
- DAY11
- restore-ip-addresses Java code
- 突破性一句话木马
- Jzoj4890 随机游走
- bzoj2815[灾难] 灭绝树 ( 灭绝树上灭绝果,灭绝树下你和我)
- docker装配mysql
- 队列的简单实现--C语言
- java作业
- 异或问题整理(高斯消元留坑)
- MATLAB逻辑与流程控制
- hibernate核心思想-------------ORM思想
- Unity_Lua_简介
- visual studio # 从 GitHub clone 项目到本地