DFS序列

news/2024/7/19 22:57:55 标签: 深度优先, 算法

什么是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.niftyadmin.cn/n/5474516.html

相关文章

python 自制黄金矿工游戏(设计思路+源码)

1.视频效果演示 python自制黄金矿工&#xff0c;细节拉满沉浸式体验&#xff0c;看了你也会 2.开发准备的工具 python3.8, pygame库(python3.5以上的版本应该都可以) 图片处理工具&#xff0c;美图秀秀 截图工具&#xff0c;电脑自带的 自动抠图网页&#xff1a;https://ko…

洛谷刷题 前缀和与差分-[P2004]领地选择(C++)

题目描述 作为在虚拟世界里统帅千军万马的领袖&#xff0c;小 Z 认为天时、地利、人和三者是缺一不可的&#xff0c;所以&#xff0c;谨慎地选择首都的位置对于小 Z 来说是非常重要的。 首都被认为是一个占地 CC 的正方形。小 Z 希望你寻找到一个合适的位置&#xff0c;使得首…

MySQL-相关约束

MySQL-约束 前提&#xff1a; 防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息。为了保证数据的完整性&#xff0c;SQL规范以约束的方式对表数据进行额外的条件限制。有以下考虑要点&#xff1a; ①实体完整性&#xff08;Entity In…

Open-Sora环境搭建推理测试

引子 Sora&#xff0c;2024年2月15日&#xff0c;OpenAI发布的人工智能文生视频大模型。支持60秒视频生成&#xff0c;震荡了国内国际学术圈、广告圈、AI教培圈。Sora最主要有三个优点&#xff1a;第一&#xff0c;“60s超长视频”&#xff0c;之前文本生成视频大模型一直无法真…

【算法】求平方根 - 二分法/牛顿迭代

题目 求一个数的平方根&#xff0c;要求返回小于等于平方根的正整数。 原理 二分法 遍历每次取中间数&#xff0c;大了就往小取&#xff0c;小了就往大取&#xff0c;直到取到正确的值。 牛顿迭代 求num的平方根&#xff0c;则是求 num / x 和 x 的均值&#xff0c;这个值…

SpringCloud和SpringCloudAlibaba总结

根据这两个总结&#xff0c;具体的细节还是在这个 Spring Cloud-CSDN博客 SpringCloudAlibaba-CSDN博客 SpringCloud主要由以下几个部分组成&#xff1a; 服务注册中心&#xff1a; Eureka&#xff0c;√ Zookeeper&#xff0c;√ Consul&#xff0c;√ Nacos负载均衡√ Ri…

嵌入式面向对象学习 RT-Thread I/O 设备管理框架 设备驱动层 案例测试

嵌入式面向对象 RT-Thread I/O 设备管理框架 设备驱动层 注&#xff1a;本文介绍性内容转载于《RT-Thread记录&#xff08;十、全面认识 RT-Thread I/O 设备模型&#xff09;》 注&#xff1a; 本次使用的开发板 &#xff1a; ​ 兆易创新GD32F407VET6开发板 ​ 雅特力科技…

【计算机网络】会话层

负责维护两个会话主机之间链接的建立、管理和终止&#xff0c;以及数据的交换。 会话控制&#xff1a;决策该由谁来传递数据 令牌管理&#xff1a;禁止双方同时执行一个关键动作 同步功能&#xff1a;在一个长的传输过程中设置一些断点&#xff0c;以便系统崩溃后能恢复至崩…