首页 > 其他分享 >DFS序

DFS序

时间:2024-05-08 17:36:55浏览次数:20  
标签:int tr mid dfs DFS 节点

DFS序

题目链接:DFS序2

DFS序

其实是利用时间戳按照DFS访问顺序对每个节点标号

in[p] : 以p(节点编号)为根节点的子树的开头

out[p] : 以p(节点编号)为根节点的子树的结尾

​ 例 : in[1] = 4, out[1] = 8, 代表以节点编号1为根节点的子树, DFS序对应时间戳为[4,8]

dfs_order[] : 存储节点编号, 索引为时间戳

​ 例 : dfs_order[1] = 4, 代表节点编号为1的点,对应的DFS序为4

AC代码

#include <iostream>
#include <vector>
#define ll long long
#define ls u << 1
#define rs u << 1 | 1
using namespace std;

const int N = 1e6 + 10;
int n, m, r, idx;
int a[N], in[N], out[N], dfs_order[N];
bool vis[N];
vector<int> G[N];

struct node{
    int l, r;
    ll sum, lazy;
}tr[N << 2];

void pushup(int u){
    tr[u].sum = tr[ls].sum + tr[rs].sum;
}

void pushdown(int u){
    if(tr[u].lazy){
        tr[ls].sum += (tr[ls].r - tr[ls].l + 1) * tr[u].lazy, tr[rs].sum += (tr[rs].r - tr[rs].l + 1) * tr[u].lazy;
        tr[ls].lazy += tr[u].lazy, tr[rs].lazy += tr[u].lazy;
        tr[u].lazy = 0;
    }
}

void build(int l, int r, int u){
    tr[u].l = l, tr[u].r = r, tr[u].lazy = 0;
    if(l == r){
        tr[u].sum = a[dfs_order[l]];
        return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, ls), build(mid+1, r, rs);
    pushup(u);
}

void add(int l, int r, int u, ll v){
    if(l <= tr[u].l && r >= tr[u].r){
        tr[u].sum += (tr[u].r - tr[u].l + 1) * v;
        tr[u].lazy += v;
        return;
    }
    pushdown(u);
    int mid = (tr[u].l + tr[u].r) >> 1;
    if(l <= mid) add(l, r, ls, v);
    if(r > mid) add(l, r, rs, v);
    pushup(u);
}


ll query(int l, int r, int u){
    if(l <= tr[u].l && r >= tr[u].r) return tr[u].sum;
    int mid = (tr[u].l + tr[u].r) >> 1;
    pushdown(u);
    ll ans = 0;
    if(l <= mid) ans += query(l, r, ls);
    if(r > mid) ans += query(l, r, rs);
    return ans;
}

void dfs(int p){
    in[p] = ++idx;
    dfs_order[idx] = p; // 记录某个时间访问到的节点编号
    vis[p] = true;
    for(int it : G[p])
        if(!vis[it]) dfs(it);
    out[p] = idx;
}


int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);

    cin >> n >> m >> r;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i < n; i++){
        int a, b;
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    dfs(r);
    build(1, n, 1);
    while(m--){
        int op, a, x;
        cin >> op >> a;
        if(op == 1){
            cin >> x;
            add(in[a], out[a], 1, x);
        }
        else{
            cout << query(in[a], out[a], 1) << "\n";
        }
    }
    return 0;
}

标签:int,tr,mid,dfs,DFS,节点
From: https://www.cnblogs.com/xiaofeng0432/p/18180318

相关文章

  • centos安装fastdfs
    安装前的准备检查Linux上是否安装了gcc、libevent、libevent-devel点击查看代码yumlistinstalled|grepgccyumlistinstalled|greplibeventyumlistinstalled|greplibevent-devel————————————————​如果没有安装,则需进行安装点击查看......
  • CF-877-E-dfs序+线段树
    877-E题目大意给定一颗\(n\)个节点的树,根为\(1\),点带权,权值要么为0,要么为1。\(q\)次询问,两种类型:\(get\spacex\):询问\(x\)的子树中有多少个\(1\)。\(pow\spacex\):将\(x\)子树中所有的值取反。Solutiondfs序+线段树模板题,把子树上的操作转化为区间上的操作。时间......
  • Codeforces 1044F DFS
    考虑到存在方案使得以\(u\)为起点还能走出原树的条件。能发现是以\(u\)为根,在原树上新添加的边只会是返祖边而不会有横叉边。这是因为如果有横叉边就肯定会在遍历到一边的点后先通过这条边走到另一边的点,就算上了这条边就不是原树了。那么考虑\((x,y)\),合法的\(u\)需要......
  • 通配符匹配|dfs,hash|题解
    [CQOI2014]通配符匹配题目描述几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户。最常见的通配符有两个,一个是星号(*),可以匹配0个及以上的任意字符:另一个是问号(?),可以匹配恰好一个任意字符。现在需要你编写一个程序,对于给定的文件名列表和一个包含通配符的......
  • 24/04/27 图论及 dfs 序相关
    \(\color{green}(1)\)CF721CJourney给定一张\(n\)个点\(m\)条边的有向无环图,边有边权。构造一条\(1\ton\)的路径使得其边权和\(\lek\)且经过的点数最多。\(n,m\le5\times10^3\),\(k\le10^9\)。最简单的想法是设状态\(f_{i,j}\)表示\(1\toi\)的边权......
  • 蓝桥杯-数的划分(DFS)
    0.题目问题描述将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5;1,5,1;5,1,1;问有多少种不同的分法。输入格式n,k输出格式一个整数,即不同的分法样例输入73样例输出4数据......
  • 深度优先搜索 Depth First Search (DFS)
    本篇篇幅较长,请做好心理准备!共三章节:1.深搜入门(一维方向数字选数类)2.深搜入门(二维方向迷宫类)3.深搜进阶(迷宫类问题--最少步数和输出路径)第一章:深搜入门(一维方向数字选数类)前置知识:函数、递归为了保证学习效果,请保证已经掌握前置知识之后,再来学习本章节!深度优......
  • 利用 Amazon EMR Serverless、Amazon Athena、Apache Dolphinscheduler 以及本地 TiDB
    引言在数据驱动的世界中,企业正在寻求可靠且高性能的解决方案来管理其不断增长的数据需求。本系列博客从一个重视数据安全和合规性的B2C金融科技客户的角度来讨论云上云下混合部署的情况下如何利用亚马逊云科技云原生服务、开源社区产品以及第三方工具构建无服务器数据仓库的解......
  • 数据结构与算法学习(1)——DFS(深度优先搜索)
    DFS基础深度优先搜索算法(英语:Depth-First-Search,缩写为DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发......
  • 分布式文件系统FastDFS安装教程
     转载链路地址https://www.cnblogs.com/handsomeye/p/9451568.html  前言centos7x642009、vmware16pro(网络仅主机模式)安装libfastcommon获取libfastcommon安装包:wgethttps://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz解压安......