首页 > 其他分享 >DFS秒解一

DFS秒解一

时间:2024-03-09 13:56:12浏览次数:16  
标签:int 解一 样例 DFS flag num 节点 根时

[YsOI2020] 植树(洛谷)

题目背景

Ysuperman 响应号召,决定在幼儿园里植树。

题目描述

Ysuperman 有一棵 \(n\) 个节点的无根树 \(T\)。如果你不知道树是什么,TA 很乐意告诉你,树是一个没有环的无向联通图。

既然树是无根的,那就没有办法种植。Ysuperman 研究了很久的园艺,发现一个节点如果可以成为根,它必须十分平衡,这意味着以它为根时,与它直接相连的节点,他们的子树大小都相同

你作为幼儿园信息组一把手,Ysuperman 给你一棵树,你能在 \(1s\) 内找到所有可能成为根的节点吗?

输入格式

第一行一个正整数 \(n\),表示树的节点个数。

此后 \(n-1\) 行,每行两个正整数 \(u_i,v_i\),表示树上有一条直接连接 \(u_i,v_i\) 的边。保证每条边只会给出一次。

输出格式

不超过 \(n\) 个从小到大的整数,用空格隔开,表示每一个可能成为根的节点。

样例 #1

样例输入 #1

2
1 2

样例输出 #1

1 2

样例 #2

样例输入 #2

4
1 2
2 3
3 4

样例输出 #2

1 4

样例 #3

样例输入 #3

9
1 2
1 3
4 1
5 1
1 6
1 9
8 1
1 7

样例输出 #3

1 2 3 4 5 6 7 8 9

提示

样例说明

样例说明 \(1\)。

以 \(1\) 为根时,与 \(1\) 直接相连的点有 \(\{2\}\),因为只有一个所以大小全部相同。

以 \(2\) 为根时,与 \(2\) 直接相连的点有 \(\{1\}\),因为只有一个所以大小全部相同。

所以答案为 \(1,2\)。

样例说明 \(2\)

以 \(1\) 为根时,与 \(1\) 直接相连的点有 \(\{2\}\),因为只有一个所以大小全部相同。

以 \(2\) 为根时,与 \(2\) 直接相连的点有 \(\{1,3\}\),子树大小分别为 \(\{1,2\}\),不相同。

以 \(3\) 为根时,与 \(3\) 直接相连的点有 \(\{2,4\}\),子树大小分别为 \(\{2,1\}\),不相同。

以 \(4\) 为根时,与 \(4\) 直接相连的点有 \(\{3\}\),因为只有一个所以大小全部相同。

所以答案为 \(1,4\)。


数据范围

本题采用捆绑测试。

\(\rm{subtask}\) \(n\) 分数
\(1\) \(\le 5000\) \(40\)
\(2\) \(\le 10^6\) \(60\)

对于 \(100\%\) 的数据,满足 \(1 \le n\le 10^6\)。


提示

由于输入输出量较大,你可能需要快速输入/输出。








解答

注意

  • root数组是判断当前节点是否可以作为根
  • num是计算当前节点子树大小
  • 最后在for循环外面加加是当前节点也加1
  • flag的妙用
  • 无向图,数组开两倍
#include <iostream>
#include <cstring>
using namespace std;
const int N = 2e6 + 10;
bool st[N];
bool root[N];
int num[N];
int h[N], e[N], ne[N], idx;
int n;

void add(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int u)
{
	root[u] = 1;
	int flag = 0;
	for (int i = h[u]; i != -1; i = ne[i])
	{
		int j = e[i];
		if (!st[j])
		{
			st[j] = true;
			num[u] += dfs(j);
			if (!flag) flag = num[j];
			if (flag != num[j]) root[u] = 0;
		}
	}

	num[u]++;

	// 这个作用就是判断当前节点作为根节点是否满足
	// n - num[u]是另一个分支
	// flag是一个分支,相当于是构造了二叉树
	// 看题解的图
	if (u != 1 && flag && flag != n - num[u]) root[u] = 0;
	return num[u];
}

int main()
{
	cin >> n;
	int n1 = n - 1;
	memset(h, -1, sizeof h);
	while (n1--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		add(a, b), add(b, a);
	}

	st[1] = true;
	dfs(1);

	for (int i = 1; i <= n; i++)
		if (root[i])
			printf("%d ", i);

	return 0;
}

标签:int,解一,样例,DFS,flag,num,节点,根时
From: https://www.cnblogs.com/xingzhuz/p/18062629

相关文章

  • 每天一道蓝桥杯Day1 分考场(dfs+结论)
    题意:这道题第一眼咋看以为是图论,但是要抽象成图论的话就会变成:给定一个无向图,要求对点染色,使得任意相邻点之间颜色不能相同,试问最少的颜色数是多少?发现转化成图论后好像也没有什么图论算法可以解决,这个转化不是很有效。往往不知道怎么下手时可以试着考虑极端情况,比如考虑上界......
  • 想做大模型开发前,先来了解一下MoE
    为了实现大模型的高效训练和推理,混合专家模型MoE便横空出世。大模型发展即将进入下一阶段但目前仍面临众多难题。为满足与日俱增的实际需求,大模型参数会越来越大,数据集类型越来越多,从而导致训练难度大增,同时也提高了推理成本。为了实现大模型的高效训练和推理,混合专家模型MoE便......
  • dfs剪枝(排除等效冗余)
    一、剪枝优化1.优化搜索顺序:有限考虑分支较少的搜索方式,常见的比如从大到小排序2.排除等效冗余:排除等效的情况,本题就是很好的例子,稍后解释3.可行性剪枝4.最优性剪枝二、本题的排除等效冗余1.如果是木棒的第一段就搜索失败了,则一定搜不到方案2.如果是木棒的最后一段搜索失败......
  • DFS在二叉树上的表现
    原题跳转:洛谷B3642二叉树的遍历题目内容:二叉树的遍历题目描述有一个\(n(n\le10^6)\)个结点的二叉树。给出每个结点的两个子结点编号(均不超过\(n\)),建立一棵二叉树(根节点的编号为\(1\)),如果是叶子结点,则输入00。建好树这棵二叉树之后,依次求出它的前序、中序、后序列遍......
  • hdfs文件传输到ods层的脚本
     #!/usr/bin/python3#coding=utf-8importsysfrombaseimportget_yesterday,APPimportsubprocessdate=get_yesterday()tables=['ods_log_inc','ods_activity_info_full','ods_activity_rule_full','ods_base_categ......
  • CentOS7 安装FastDFS配置详解
    一、介绍FastDFS是一个开源的高性能分布式文件系统。它的主要功能包括:文件存储,文件同步和文件访问(文件上传和文件下载),它可以解决高容量和负载平衡问题。FastDFS应该满足基于照片共享站点和视频共享站点等文件的网站的要求。FastDFS具有两个角色:tracker和storage。tracker负责调......
  • 关于dfs序求lca的一点思考
    最近学了一点黑科技,这就是一个。有一个结论比如这就是一个dfn序。在代码中,常常对beg和ed都开一个数组。如果一个点是x,y的lca记为g,那么有以下结论\(beg[g]<min(beg[x],beg[y]),ed[g]>max(ed[x],ed[y])\)感性理解即可。所以我们就可以在符合的点找深度最大的。这是一种思路,常常......
  • hdfs基本命令
    创建目录hadoopfs–mkdir[-p]<path>查看目录下的内容hadoopfs–ls[-h][-R][<path>]-h人性化显示文件大小-R递归查看指定目录及子目录上传文件hadoopfs–put[-f][-p]<localsrc><dst>-f覆盖目标文件(若文件已存在)-p保留访问和修改时间、......
  • 深度优先搜索DFS、广度优先搜索BFS
    深度优先搜索DFS基本概念深度优先搜索(Depth-FirstSearch,DFS)是十分常见的图搜索方法之一。深度优先搜索会沿着一条路径一直搜索下去,在无法搜索时,回退到刚刚访问过的节点。它从初始节点出发,按预定的顺序扩展到下一个节点,然后从下一节点出发继续扩展新的节点,不断递归执行这个过......
  • DFS算法模板(2488:A Knight's Journey)
    DFS算法(C++版本)题目一:链接:http://bailian.openjudge.cn/practice/2488/解析思路:骑士找路就是基本的DFS,用递归不断找到合适的路,找不到就回头直到找到合适的路。该题难点:要是实现字典序,也就是同样的两种选择,要走到A1而不是B1。所以就有了{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1......