首页 > 其他分享 >P2597 [ZJOI2012] 灾难(DAG上的支配树)

P2597 [ZJOI2012] 灾难(DAG上的支配树)

时间:2024-02-16 22:12:09浏览次数:28  
标签:DAG int void write dep P2597 ZJOI2012 il deg

题目链接

所谓支配树,就是将关系转为一棵树,使得将树上点 \(x\) 单独去掉其祖先的任意一个,\(x\) 均不能选择,而非其父亲的点单独去掉对该点无影响。而其字树内的点则为去掉该点一定不能选择的点。

对于本题,如何建树?将原图连边(被吃的向捕食者连),拓扑排序,若当前点为 \(x\),则其所有儿子都以其为食。

那么,对于一个点 \(v\),当且仅当其所有父亲都不能选择时,该点不能选择。根据定义可得点 \(v\) 在支配树上的父亲为其在原树上的所有父亲的 lca

#include <bits/stdc++.h>
using namespace std;
#define il inline
#define ptc putchar
#define pb push_back
#define R(i, l, r) for (int i = l; i <= r; ++i)
#define debug puts("--------------------------------------------")
typedef long long ll;
typedef pair<int, int> PII;
namespace ZeroTwo
{
    template <typename T>
    il void read(T &x) 
    { 
        x = 0; T f = 1; char ch;
        while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
        while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar();
        x *= f;
    }
    template <typename T, typename ...L>
    il void read(T &x, L &...y) {read(x); read(y...);}
    template <typename T>
    il void write(T x) 
    {
        if (x < 0) ptc('-'), x = -x;
        if (x > 9) write(x / 10);
        ptc(x % 10 + '0');
    }
    template <typename T, typename ...L>
    il void write(T &x, L &...y) {write(x), ptc(' '); write(y...);}
}
using namespace ZeroTwo;
const int N = 65540;
int n, deg[N], a[N], f[N][25], dep[N], sz[N];
vector <int> E[N], G[N];
int lca(int u, int v)
{
    if (dep[u] < dep[v]) swap(u, v);
    int k = dep[u] - dep[v];
    for (int i = 20; i >= 0; --i) 
    {
        if (k >= (1 << i)) k -= (1 << i), u = f[u][i];
        if (!k) break;
    }
    if (u == v) return u;
    for (int i = 20; i >= 0; --i)
        if (f[u][i] ^ f[v][i]) u = f[u][i], v = f[v][i];
    return f[u][0];
}
void dfs(int x)
{
    sz[x] = 1;
    for (auto v : G[x]) 
    {
        dfs(v);
        sz[x] += sz[v];
    }
}
signed main() 
{
    cin >> n;
    R(i, 1, n)
    {
        a[i] = -1;
        int x;
        while (1)
        {
            cin >> x;
            if (!x) break;
            E[x].push_back(i);
            ++deg[i];
        }
    }
    queue <int> q;
    R(i, 1, n) if (!deg[i]) q.push(i), a[i] = 0;
    while (q.size())
    {
        int x = q.front(); q.pop();
        f[x][0] = a[x];
        dep[x] = dep[a[x]] + 1;
        G[a[x]].push_back(x);
        R(i, 1, 20) f[x][i] = f[f[x][i - 1]][i - 1];
        for (auto v : E[x])
        {
            if (a[v] == -1) a[v] = x;
            else a[v] = lca(a[v], x);
            --deg[v]; 
            if (!deg[v]) q.push(v);
        }
    }
    dfs(0);
    R(i, 1, n) cout << sz[i] - 1 << '\n';
    return 0;
}

标签:DAG,int,void,write,dep,P2597,ZJOI2012,il,deg
From: https://www.cnblogs.com/cyyhcyyh/p/18017560

相关文章

  • P2609 [ZJOI2012] 数列
    (题目传送门)实在是泰裤辣!直接推导??不存在的。最直接的想法是记忆化搜索,但是不想写高精……观察发现每个\(a_n\)都可以写成\(x\timesa_0+y\timesa_1\)的形式。你对单个\(a_i\)计算系数和记忆化搜索无异。观察条件,考虑一个二元组\((a_i,a_{i+1})\),发现可以转化成对\((a_......
  • Android Dagger2简单使用
    Dagger是一个很古老的框架了,当初诞生时候,主要是为了模块之间的解耦。本篇文章主要介绍一下如何使用dagger2,后续会介绍其原理。AS集成对于现在的AS项目,一般都是会集成Kotlin和Java混写,所以可以在想要使用dagger的模块module的gradle下加入如下配置。implementation'com.google.dagg......
  • DAG拓扑排序
    DAG拓扑排序引入小学奥数类型题。沏茶过程(烧水壶)到(接水)到(烧水洗茶杯找茶叶)(并行)到(沏茶)即有先后顺序的流程,且必须所有步骤都能执行。概述拓扑排序是对DAG(有向无环图)的顶点进行的一种线性排序,排序序列中每个顶点都会且仅会出现一次,且对于所有有向边\(u\rightarrowv......
  • DAGScheduler
    https://zhuanlan.zhihu.com/p/165158261  具体来说DAGScheduler的功能如下:1.划分和创建Stage:根据RDD之间的依赖类型(窄依赖或宽依赖),为每个Job划分和创建Stage,多个Stage之间相互依赖,形成一个DAG(有向无环图)。2.决定运行Task的最佳位置:根据RDD的依赖关系,缓存或Shuffling数据的......
  • [ARC136E] Non-coprime DAG
    [ARC136E]Non-coprimeDAG显然只和可达性有关。注意到这样一件事情:所有偶数都是可达的。而对于奇数而言,\((x-\operatorname{lpf}(x),x+\operatorname{lpf}(x))\)这个区间内的数和\(x\)一定不可达。定义\(x\)控制的区间为\((x-\operatorname{lpf}(x),x+\operator......
  • P4017 最大食物链计数 (DAG拓扑排序)
    空降锣鼓1题目分析首先,要知道这道题是Topo拓扑排序。不妨先从拓扑排序定义下手,分析题目的性质。经分析得:食物链中的生物——节点生物之间的关系——有向边为了方便描述,我们将不会捕食其他生物的生产者叫做最佳生产者不会被其他生物捕食的消费者叫做最佳消费......
  • P1113 杂务 (DAG拓扑排序--DP)
    这是一道拓扑排序的模板题0额.所需的前置知识:图论相关的基本概念建图,存图图的遍历非常入门的DP下面进入正文1引入拓扑排序是一类用于处理DAG(Directedacyclicgraph),即有向无环图上的问题。以这道题为例,我们分析拓扑排序的作用:显然地,本题中各项工作是有一定的依......
  • 分布式可视化 DAG 任务调度系统 Taier 的整体流程分析
    Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关心任务错综复杂的依赖关系与底层的大数据平台的架构实现,将工作的重心更多地聚焦在业务之中。本文......
  • 分布式可视化 DAG 任务调度系统 Taier 的整体流程分析
    Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关心任务错综复杂的依赖关系与底层的大数据平台的架构实现,将工作的重心更多地聚焦在业务之中。本......
  • 从 Component Tree 视角看 Dagger 到 Hilt 的演变
    1.从Dagger的本质说起一言以蔽之,Dagger的本质就是一棵ComponentTree(组件树)。1.1Component:依赖注入容器component是Dagger中的核心概念,我们通过@Component注解定义并生成代码。component作为依赖注入容器,身兼工厂、仓库、物流三种角色于一身。Dagger中的很多重要......