DFS序列

news2024/11/17 12:51:53

什么是DFS序

DFS序是指对一棵树进行DFS时,每个节点被访问到的顺序。DFS序分成两个部分:进入该节点的顺序和退出该节点的顺序。

如何求DFS序

对于DFS中当前节点

1:计数++

2:进入当前节点的顺序等于当前计数

3:想所有子节点继续搜索

4:退出当前节点的序列等于当前计数

模板代码

void dfs(int t,int f){//t代表当前节点的编号,f代表父节点的编号
    in[t]=++cnt;//in 进入该节点的顺序,cnt:计数
    for(int i=head[t];i;i=edge[i].next){
        if(edge[i].n!=f){

            dfs(edge[i].n,t);
        }
    
    }
    out[t]=cnt;//out:退出该节点的顺序
}

DFS的性质

某些连续的入序对应树中的节点是一条链(编号是有顺序的,且连在一起的),某节点入序和出序之间对应的节点一定在其子树中。(访问到某个节点的子树,那么该节点的入序一定是小于这个节点的子树的入序)(如果是出序那么,访问到该节点的子树,该节点的出序一定是大于或等于这个节点子树的出序)

如果一个节点的入序为2,出序为8,那么所有2~8的入序或出序是这个节点或者是这个节点的子树

DFS是有序的

例题

问题描述

给一棵含有 n 个结点的有根树,根结点为 11,编号为 i 的点有点权 ai​(i∈[1,n])。现在有两种操作,格式如下:

  • 1 x y:该操作表示将点x 的点权改为 y。
  • 2 x:该操作表示查询以结点 x 为根的子树内的所有点的点权的异或和。

现有长度为 m 的操作序列,请对于每个第二类操作给出正确的结果。

输入格式

输入的第一行包含两个正整数n,m,用一个空格分隔。

第二行包含 n 个整数a1​,a2​,…,an​,相邻整数之间使用一个空格分隔。

接下来 n−1 行,每行包含两个正整数 ui​,vi​,表示结点 ui​ 和 vi​ 之间有一条边。

接下来 m 行,每行包含一个操作。

输出格式

输出若干行,每行对应一个查询操作的答案。

样例输入

4 4
1 2 3 4
1 2
1 3
2 4
2 1
1 1 0
2 1
2 2

样例输出 

4
5
6

 

package xuanze;
import java.util.*;
import java.util.*;
import java.io.*;
public class chapter4 {

	public static void main(String[] args) throws IOException  {
		// TODO Auto-generated method stub
			BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

			String[] temp = reader.readLine().split(" ");

			n = Integer.parseInt(temp[0]);

			m = Integer.parseInt(temp[1]);

			temp = reader.readLine().split(" ");

			for (int i = 1; i <= n; ++i) {

			a[i] = Integer.parseInt(temp[i - 1]);

			e[i]=new ArrayList<>();

			}

			for (int i = 0; i < n - 1; ++i) {

			temp = reader.readLine().split(" ");

			int u = Integer.parseInt(temp[0]);

			int v = Integer.parseInt(temp[1]);

			e[u].add(v);

			e[v].add(u);

			}

			dfs(1, 0);

			for (int i = 1; i <= n; ++i) {

			add(in[i], a[i]);

			}

			for (int i = 0; i < m; ++i) {

				temp = reader.readLine().split(" ");

				int op = Integer.parseInt(temp[0]);	
			
				int x = Integer.parseInt(temp[1]);

				if (op == 1) {

						int y = Integer.parseInt(temp[2]);
						
						int v = rangeSum(in[x] - 1, in[x]);

						add(in[x], y ^ v);

				} else {

					writer.write(rangeSum(in[x] - 1, out[x]) + "\n");

				}

			}
			

			reader.close();

			writer.flush();

			writer.close();
			
		}
		
	


		static int N = 100010;

		static int n, m, tot;

		static int[] a = new int[N], in = new int[N], out = new int[N], b = new int[N];

		static List<Integer>[] e = new List[N];

		static void add(int x, int v) {

			for (; x <= n; x += x & (-x)) {

				b[x] ^= v;
			}

		}

		static int sum(int x) {

		int ans = 0;

		if (x == 0) return 0;

		for (; x > 0; x -= x & (-x)) {

		ans ^= b[x];

		}

		return ans;

		}

		static int rangeSum(int l, int r) {

		return sum(r) ^ sum(l);

		}

		static void dfs(int u, int fa) {

		in[u] = ++tot;

		for (int v : e[u]) {

		if (v == fa) continue;

		dfs(v, u);

		}

		out[u] = tot;

		}
}

(注:此代码出于蓝桥云,非本人所写,宝宝么)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云可观测 2024 年 3 月产品动态

本月可观测热文回顾 文章一览&#xff1a; 全新架构&#xff01;日志服务 SLS 自研免登录方案发布 AIOps 智能运维&#xff1a;有没有比专家经验更优雅的错/慢调用分析工具&#xff1f; 一文看懂如何做好 SQL 质量监控 使用 SPL 高效实现 Flink SLS Connector 下推 功能快…

pandas用法-详解教程

pandas用法-详解教程 一、生成数据表二、数据表信息查看三、数据表清洗四、数据预处理五、数据提取六、数据筛选七、数据汇总八、数据统计九、数据输出 一、生成数据表 1、首先导入pandas库&#xff0c;一般都会用到numpy库&#xff0c;所以我们先导入备用&#xff1a; impor…

深度学习理论基础(六)Transformer多头注意力机制

目录 一、自定义多头注意力机制1. 缩放点积注意力&#xff08;Scaled Dot-Product Attention&#xff09;● 计算公式● 原理 2. 多头注意力机制框图● 具体代码 二、pytorch中的子注意力机制模块 深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿…

docker基础学习指令

文章目录 [toc] docker基础常用指令一、docker 基础命令二、docker 镜像命令1. docker images2. docker search3. docker pull4. docker system df5. docker rmi1. Commit 命令 三、 docker 容器命令1. docker run2. docker logs3. docker top4. docker inspect5. docker cp6. …

Mybatis报错:Unsupported conversion from LONG to java.sql.Timestamp

Mybatis在封装结果集的时候&#xff0c;如果方法返回的是对象&#xff0c;则会去调用这个对象的无参构造方法。 如果实体类标注了Builder注解&#xff0c;则此注解会把默认的构造方法全部改成私有的&#xff0c;则Mybatis在通过无参构造方法反射创建对象时&#xff0c;就会找不…

#QT项目实战(天气预报)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a; 3.记录&#xff1a; &#xff08;1&#xff09;调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…

Python学习之-魔术方法

前言&#xff1a; Python 中的魔术方法&#xff08;Magic Methods&#xff09;&#xff0c;也称作特殊方法&#xff08;Special Methods&#xff09;&#xff0c;是那些被双下划线包围的方法&#xff0c;例如 init。这些方法在 Python 中有特殊的含义&#xff0c;它们并不需要…

ThingsBoard通过MQTT发送遥测数据

MQTT基础 客户端 MQTT连接 遥测上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…

程序猿成长之路之数据挖掘篇——频繁项集挖掘介绍

频繁项集挖掘可以说是数据挖掘中的重点&#xff0c;下面我们来分析以下频繁项集挖掘的过程和目标 如果对数据挖掘没有概念的小伙伴可以查看上次的文章 https://blog.csdn.net/qq_31236027/article/details/137046475 什么是频繁项集&#xff1f; 在回答这个问题之前&#xff…

蓝桥杯第101题 拉马车 C++ Java Python

目录 题目 思路和解题方法 复杂度: c 代码 Java 版本&#xff08;仅供参考&#xff09; Python 版本&#xff08;仅供参考&#xff09; 代码细节 C 版本: Java 版本: Python 版本: 题目 思路和解题方法 这个游戏是一个简单的纸牌游戏&#xff0c;两个玩家轮流出牌&am…

Springboot相关知识-图片描述(学习笔记)

学习java过程中的一些笔记&#xff0c;觉得比较重要就顺手记录下来了~ 目录 一、前后端请求1.前后端交互2.简单传参3.数组集合传参4.日期参数5.Json参数6.路径参数7.响应数据8.解析xml文件9.统一返回类10.三层架构11.分层解耦12.Bean的声明13.组件扫描14.自动注入 一、前后端请…

(免费分享)基于springboot,vue问卷调查系统

用户注册、用户登录、创建调查问卷、编辑问卷问题和选型&#xff08;支持题型&#xff1a;单选、多选、单行文本、多行文本、数字、评分、日期、文本描述&#xff09;、保存和发布问卷、停止问卷调查、游客填写调查问卷&#xff08;一个IP地址只能填写一次&#xff09; 技术&a…

4.3 IO day5

1&#xff1a;实现文件夹的拷贝功能 注意判断被拷贝的文件夹是否存在&#xff0c;如果不存在则提前创建&#xff0c;创建文件夹的函数为 mkdir 不考虑递归拷贝的问题 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h…

蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐

蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y,…

清明作业 c++

1.封装一个类&#xff0c;实现对一个数求累和阶乘质数 #include <iostream>using namespace std; int mproduct(int a){if(a>1){return a*mproduct((a-1));}else{return 1;} } class number{int a; public:number():a(5){};number(int a):a(a){}void set(int a){thi…

开源的页面生成器:拖拽即可生成小程序、H5页面和网站

星搭精卫 MtBird 是一款低代码可视化页面生成器&#xff0c;可以帮助用户以可视化的形式搭建网页、小程序和表单等应用。 使用这个生成器&#xff0c;不需要代码就可以生成小程序、H5页面和网站&#xff0c;拖拽操作、样式配置快速生成页面应用&#xff0c;数据可视化接入&…

2024年【道路运输企业安全生产管理人员】找解析及道路运输企业安全生产管理人员作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员找解析参考答案及道路运输企业安全生产管理人员考试试题解析是安全生产模拟考试一点通题库老师及道路运输企业安全生产管理人员操作证已考过的学员汇总&#xff0c;相对有效帮助道路运输…

C++高频面试知识总结 part3

哈希 1.哈希表为什么快&#xff1f;2.哈希冲突解决方法3.哈希表扩容流程4.哈希表扩容太多次&#xff0c;需要遍历所有元素&#xff0c;如何优化&#xff1f;5.渐进式扩容为何可以正确访问哈希表&#xff1f; 1.哈希表为什么快&#xff1f; 哈希表&#xff08;Hash table&#…

告别旧IP,更换网络ip地址教程分享

在数字化世界中&#xff0c;IP地址作为每个网络设备的标识符&#xff0c;扮演着至关重要的角色。它不仅是设备在网络中的“门牌号”&#xff0c;还影响着网络连接的稳定性、安全性和数据传输效率。因此&#xff0c;在某些情况下&#xff0c;更换网络IP地址成为必要操作。虎观代…

平台规则的改变会影响低价治理结果吗

许多品牌在做低价链接投诉时&#xff0c;会用一套自己的标准去做&#xff0c;但如果无视平台规则&#xff0c;会出现非常多不好的结果&#xff0c;比如帐号投诉成功率被拉低&#xff0c;会直接影响后续链接的投诉时效和成功率&#xff0c;同时因为不尊重平台规则&#xff0c;而…