首页 > 其他分享 >2024-04-21:用go语言,给一棵根为1的树,每次询问子树颜色种类数。 假设节点总数为n,颜色总数为m, 每个节点的颜色,依次给出,整棵树以1节点做头, 有k次查询,询问某个节点为头的子树,一共

2024-04-21:用go语言,给一棵根为1的树,每次询问子树颜色种类数。 假设节点总数为n,颜色总数为m, 每个节点的颜色,依次给出,整棵树以1节点做头, 有k次查询,询问某个节点为头的子树,一共

时间:2024-04-21 09:11:57浏览次数:17  
标签:子树 颜色 int 复杂度 var 节点

2024-04-21:用go语言,给一棵根为1的树,每次询问子树颜色种类数。

假设节点总数为n,颜色总数为m,

每个节点的颜色,依次给出,整棵树以1节点做头,

有k次查询,询问某个节点为头的子树,一共有多少种颜色。

1 <= n, m, k <= 10^5。

答案2024-04-21:

来自左程云

chatgpt

大体步骤如下:

大体过程描述:

1.数据结构初始化:定义全局变量和数组用来存储图的结构、节点颜色等信息,并初始化相关数组和变量。

2.输入处理:通过预定义的输入数组,按给定格式依次读取节点数n,建立树的连接关系,记录每个节点的颜色。

3.DFS遍历

  • 第一次DFS(dfs1):计算每个节点子树的大小,并标记每个节点的重节点。

  • 第二次DFS(dfs2):处理每个节点的子树,包括处理重节点和非重节点的不同子树,更新颜色计数和子树的颜色种类数。

4.颜色计数:通过add函数和delete函数实现颜色的增加与减少操作,维护当前节点子树中颜色种类的计数。

5.输出查询结果:对于每次查询,按照给定节点进行处理,并输出计算得到的颜色种类数。

时间复杂度:

  • DFS1:对整个树进行一次DFS,时间复杂度为O(n)。

  • DFS2:同样对整个树进行一次DFS,时间复杂度为O(n)。

  • add和delete函数:每个节点至多被遍历4次(每条边两次),因此每次add和delete的时间复杂度为O(n)。

  • 查询:对于每次查询,计算颜色种类数时需要遍历整个子树,时间复杂度为O(n)。

综上,总的时间复杂度为O(n)。

空间复杂度:

  • graph, color, size, heavy, cnt, ans:每个数组的长度为n,因此空间复杂度为O(n)。

  • 其他局部变量:不超过常数大小,可忽略。

综上,总的额外空间复杂度为O(n)。

Go完整代码如下:

package main

import (
	"fmt"
)

var MAXN int = 200005
var graph [][]int
var color []int
var size []int
var heavy []int
var cnt []int
var ans []int
var n, m int

func main() {
	graph = make([][]int, MAXN)
	for i := range graph {
		graph[i] = make([]int, 0)
	}
	color = make([]int, MAXN)
	size = make([]int, MAXN)
	heavy = make([]int, MAXN)
	cnt = make([]int, MAXN)
	ans = make([]int, MAXN)

	inputs := []int{5,
		1, 2,
		1, 3,
		2, 4,
		2, 5,
		1, 2, 2, 3, 3,
		5,
		1,
		2,
		3,
		4,
		5}
	ii := 0

	for ii < len(inputs) {
		n = inputs[ii]
		ii++

		for i := 1; i <= n; i++ {
			graph[i] = make([]int, 0)
		}

		for i := 1; i < n; i++ {
			a := inputs[ii]
			ii++
			b := inputs[ii]
			ii++
			graph[a] = append(graph[a], b)
			graph[b] = append(graph[b], a)
		}

		for i := 1; i <= n; i++ {
			c := inputs[ii]
			ii++
			color[i] = c
		}

		dfs1(1, 0)

		dfs2(1, 0, false)

		m = inputs[ii]
		ii++

		for i := 1; i <= m; i++ {
			q := inputs[ii]
			ii++
			fmt.Println(ans[q])
		}
	}
}

var total int

func dfs1(cur, father int) {
	size[cur] = 1
	for _, next := range graph[cur] {
		if next != father {
			dfs1(next, cur)
			size[cur] += size[next]
			if size[heavy[cur]] < size[next] {
				heavy[cur] = next
			}
		}
	}
}

func dfs2(cur, father int, isHeavy bool) {
	for _, next := range graph[cur] {
		if next != father && next != heavy[cur] {
			dfs2(next, cur, false)
		}
	}

	if heavy[cur] != 0 {
		dfs2(heavy[cur], cur, true)
	}

	add(cur, father, heavy[cur])
	ans[cur] = total

	if !isHeavy {
		delete(cur, father)
		total = 0
	}
}

func add(cur, father, except int) {
	cnt[color[cur]]++
	if cnt[color[cur]] == 1 {
		total++
	}

	for _, next := range graph[cur] {
		if next != father && next != except {
			add(next, cur, except)
		}
	}
}

func delete(cur, father int) {
	cnt[color[cur]]--
	for _, next := range graph[cur] {
		if next != father {
			delete(next, cur)
		}
	}
}

在这里插入图片描述

标签:子树,颜色,int,复杂度,var,节点
From: https://www.cnblogs.com/moonfdd/p/18148580

相关文章

  • JZ86 在二叉树中找到两个节点的最近公共祖先
    classSolution{public://用来判断是否找到节点boolflag=false;//dfs遍历得到路径,递归遍历,也就是先序遍历根左右//传入参数:节点,容器,要找的值voiddfs(TreeNode*root,vector<int>&path,into){//判断根节点的值是否是要找的......
  • VSCode非活跃预处理程序块Inactive颜色设置(底色字色透明度)
    VSCode非活跃预处理程序块——#if0非活跃预处理程序块#else活跃预处理程序块#endif#if1活跃预处理程序块#else非活跃预处理程序块#endif 效果 ......
  • 我的SCRT颜色设置
    //include_lib\system\debug.h/**LOG通过常量控制*/#elif(LOG_MODE==LOG_BY_CONST)#definelog_info(format,...)\if(LOG_IS_ENABLE(LOG_INFO))\printf("\e[1;47;35m""[%s%d]:""log_info(format,...)"......
  • FineReport11 报表技巧01- 单元格HTML显示tag颜色标签
    背景FineReport报表制作中,经常需要将某些单元格内容以彩色标签显示,其中根据不同对象内容进行不同展示,效果如下图所示:实现效果为:1、“年龄”列内容根据年龄段不同显示为不同颜色且带边框效果;2、“性别”列性别为“男”显示为蓝色,性别为“女”显示为红色,性别为“未知”显示为灰......
  • 递归获取某个节点的儿子节点
    java代码:publicList<Department>getAllChildrenDepartmentsFlat(LongparentId){List<Department>allDepartments=departmentRepository.findAll();//假设使用JPA的Repository来进行数据库操作List<Department>allChildren=newArrayLi......
  • 两种解法搞定链表相邻节点交换
    最近还是很喜欢用golang来刷算法题,更接近通用算法,也没有像动态脚本语言那些语法糖,真正靠实力去解决问题。下面这道题很有趣,也是一道链表题目,具体如下:24.SwapNodesinPairsSolvedMediumTopicsCompaniesGivenalinkedlist,swapeverytwoadjacentnodesandreturni......
  • Python 解决控制台输出颜色时出现乱码的问题 (windows平台)
    简介在python开发的过程中,经常会遇到需要打印各种信息。海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性。这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了。当然了,控制台的展示效果有限,并不能像前段一样炫酷,只能做一些简单的设置。不......
  • ROS2笔记2--工作空间、功能包、节点
    一、工作空间(Workspace)ROS工作空间是用于存放ros功能包的一个文件夹,通常以ws结尾。用于存放工程开发相关的所有文件,包括源代码、编译生成的文件以及配置我呢见等。在ROS中工作空间是使用Catkin编译系统来组织和管理代码的基础单元。每个工作空间通常包含一个或多个功能包,这些功能......
  • poco节点关系大公开!
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途一、前言在自动化测试的实践中,我们发现许多同学在使用Poco框架进行控件定位时,对于节点之间的关系理解不够深入。那么本周让我们来详细讲解Poco框架中的child&chil......
  • LeetCode- 19 删除链表的倒数第N个节点
    题目地址https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/参考实现/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){t......