首页 > 其他分享 >1946C - Tree Cutting

1946C - Tree Cutting

时间:2024-04-02 19:05:00浏览次数:20  
标签:int Tree mid dfs fa Cutting tot ans 1946C

CF难度:1600

从题意中看是一道比较经典的树形DP问题,题目要求的是把一棵树切k次,求被分割的树中最小的节点x的最大值是多少,因此可以采用二分写法,对于每一个树中,满足mid的节点个数是否等于k个。

题目链接:Tree Cutting

对于每个二分,都用一遍dfs遍历树,因此check函数可以这么写:

bool check(int mid){
	tot=0;
	int z=dfs(1,-1);//每次二分重新遍历一遍树
	if(z<mid)tot--;//最后还有ans,判断是否能分割树
	if(tot<k)return false;
	else return true;
}

dfs函数采用递归的写法,加入了ans,判断遍历到该节点是否能满足以该x为根节点形成的树的节点个数>=mid,如果可以,tot++;

int dfs(int x,int fa){
	int ans=1;
	for(const auto &y:g[x]){
		if(y==fa)continue;
		ans+=dfs(y,x);
	}
	if(ans>=mid){
		ans=0;
		tot++;
	}
	return ans;
}

注意建双向边

代码附上:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N =1e5+5;
vector<int>g[N];
int n,k,tot=0,mid;

int dfs(int x,int fa){//fa防止死循环
	int ans=1;
	for(const auto &y:g[x]){
		if(y==fa)continue;
		ans+=dfs(y,x);
	}
	if(ans>=mid){
		ans=0;
		tot++;
	}
	return ans;
}

bool check(int mid){
	tot=0;
	int z=dfs(1,-1);//每次二分重新遍历一遍树
	if(z<mid)tot--;//最后还有ans,判断是否能分割树
	if(tot<k)return false;
	else return true;
}

void solve(){
	cin>>n>>k;
	
	for(int i=1;i<=n;i++)g[i].clear();
	
	for(int i=1;i<n;i++){
		int x,y;cin>>x>>y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	
	int l=0,r=n+1;
	while(l<r){
		mid=(l+r+1)/2;
		if(check(mid))l=mid;
		else r=mid-1;
	}
	
	cout<<l<<"\n";
	
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

标签:int,Tree,mid,dfs,fa,Cutting,tot,ans,1946C
From: https://blog.csdn.net/2302_81761369/article/details/137281669

相关文章

  • WPF实现树形表格控件(TreeListView)
    前言本文将探讨如何利用WPF框架实现树形表格控件,该控件不仅能够有效地展示复杂的层级数据,还能够提供丰富的个性化定制选项。我们将介绍如何使用WPF提供的控件、模板、布局、数据绑定等技术来构建这样一个树形表格。一、运行效果1.1默认样式1.2自定义样式二、代码实现......
  • 前端自动部署报错“http://registry.npm.taobao.org/****/download/array-tree-filter
    自动部署时报错我试过更改淘宝镜像为https://registry.npmmirror.com但都不生效报错如下图:代码中的配置文件如下如上配置在其他测试环境均正常,只在生产环境报错求大佬帮忙看看是什么原因呀......
  • CF1935F Andrey's Tree (树上乱搞)
    题意:有一颗n个节点的数,需要解决以下问题:先去掉节点v和与其相连的边;然后在剩余的图上加若干条边,在(x,y)之间连边的代价是∣x−y∣。求使得图连通的最小代价。计算删除顶点v后,每个顶点1≤v≤n至少需要花费多少金币才能使图形重新成为一棵树,以及需要添加哪些边。做法:首先可......
  • [hdu6647]Bracket Sequences on Tree 解题报告
    oj:https://gxyzoj.com/d/hzoj/p/3575因为自己的脑残原因,调了8个小时啊!!!切入正题Part1假定1为根,可以发现,如果u的两棵子树同构,则他们遍历的顺序不影响答案所以,就可以将子树按哈希值分类,这道题就变成了一个可重复组合问题,设\(f_i\)表示以1为根时i的方案数,\(a_i\)表示某一种哈......
  • 客快物流大数据项目(九十三):ClickHouse的ReplacingMergeTree深入了解 ClickHouse清除重
    ​ClickHouse的ReplacingMergeTree深入了解为了解决MergeTree相同主键无法去重的问题,ClickHouse提供了ReplacingMergeTree引擎,用来对主键重复的数据进行去重。删除重复数据可以使用optimize命令手动执行,这个合并操作是在后台运行的,且无法预测具体的执行时间。在使用optimize命......
  • 【前端】- 在使用Element UI 的el-tree组件时,从底层去研究如何去实现一键展开/关闭【t
    第一步:首先我们先去查看elementui官方文档,发现并没有提供这个方法,没办法,只能手写一个了,先给大家看看功能点击前效果:点击后效果:第二步:废话不多说直接上代码,然后我们简单解释下代码页面部分:这里是简单的数结构渲染,不多讲,$refs.Reftree获取的是el-tree的实例,具体作用请看下......
  • F. 0, 1, 2, Tree!
    原题链接题解1.模拟+贪心,我们一个一个点添加,一层一层遍历,每个节点对当前层的接口数的贡献是-1如果是节点2,对下一层接口数贡献为2,节点1贡献为1如果当前层接口数用完了就下一层,初始值层0设为1在时间复杂度合理的情况下无所不用其极code#include<bits/stdc++.h>#definelllo......
  • 【容器源码篇】Set容器(HashSet,LinkedHashSet,TreeSet的特点)
    文章目录⭐容器继承关系......
  • Ant Design Vue Tree 选中子节点同时半选中父级节点
    需要实现的效果:1、子菜单如果不是全部选中,一级菜单半选。2、子菜单全选,一级菜单选中。3、一级菜单选择,二级菜单全选。4、没有二级菜单,则只控制一级菜单。主要用到的属性是checked和halfCheckedKeys,通过手动控制那些菜单选中,那些半选中实现功能。**页面截图:**完整代码如......
  • 【Bitmap Index】B-Tree索引与Bitmap位图索引的锁代价比较研究
    通过以下实验,来验证Bitmap位图索引较之普通的B-Tree索引锁的“高昂代价”。位图索引会带来“位图段级锁”,实际使用过程一定要充分了解不同索引带来的锁代价情况。1.为比较区别,创建两种索引类型的测试表1)在表t_bitmap上创建位图索引SEC@ora11g>createtablet_bitmap(idnumber(1......