F - Auxiliary Set HDU - 5927 (dfs判断lca)
题目链接:
F - Auxiliary Set
学习网址:https://blog.csdn.net/yiqzq/article/details/81952369
题目大意一棵节点数为n的有根数,根节点为1,一开始所有的点都是重点,接下来有q次询问,每次询问把m个点变为轻点,问你树中还有多少个重点。
重点应该满足的条件为:
1.它本身是重点。
2.它为两个重点的最近公共祖先。
每次询问之后在下次询问前,所有的点都恢复为重点。
具体思路:对于每个点保存他的深度。因为每次输入的数不重要的点,首先对于这些不重要的点按照深度从大到小进行排序, 然后先去处理深度大的。当处理深度大的时候,可以保证这个节点下面是没有不重要的点的,也就是这个节点的下面全都是重要的节点,那么这个点也肯定是符合的。然后往上更新的时候,如果当前的不重要节点下面没有点了,那么这个不重要节点的父亲往下的儿子数就应该减去1,也就是说这个分支下不存在重要的节点了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 2e5+;
int n,m;
vector<int>edge[maxn];
void addedge(int fr,int to)
{
edge[fr].push_back(to);
}
int sto[maxn];
int depth[maxn];
int son1[maxn],son2[maxn];
int father[maxn];
void init()
{
for(int i=; i<=n; i++)
{
edge[i].clear();
son1[i]=;
}
}
void dfs(int cur,int fa,int dep)
{
father[cur]=fa;
depth[cur]=dep+;
for(int i=; i<edge[cur].size(); i++)
{
int to=edge[cur][i];
if(to==fa)
continue;
son1[cur]++;
dfs(to,cur,dep+);
}
}
bool cmp(int t1,int t2)
{
return depth[t1]>depth[t2];
}
int main()
{
int T;
int Case=;
scanf("%d",&T);
while(T--)
{
int st,ed;
scanf("%d %d",&n,&m);
init();
for(int i=; i<n; i++)
{
scanf("%d %d",&st,&ed);
addedge(st,ed);
addedge(ed,st);
}
printf("Case #%d:\n",++Case);
dfs(,,);
while(m--)
{
int sz,ans;
scanf("%d",&sz);
ans=n-sz;
for(int i=; i<=sz; i++)
{
scanf("%d",&sto[i]);
son2[sto[i]]=son1[sto[i]];
}
sort(sto+,sto+sz+,cmp);
for(int i=; i<=sz; i++)
{
if(son2[sto[i]]>=)
ans++;
if(son2[sto[i]]==)
son2[father[sto[i]]]--;
}
printf("%d\n",ans);
}
}
return ;
}
F - Auxiliary Set HDU - 5927 (dfs判断lca)的更多相关文章
- HDU 3966 dfs序+LCA+树状数组
题目意思很明白: 给你一棵有n个节点的树,对树有下列操作: I c1 c2 k 意思是把从c1节点到c2节点路径上的点权值加上k D c1 c2 k 意思是把从c1节点到c2节点路径上的点权值减去k ...
- 蓝皮书:异象石 【dfs序+lca】
题目详见蓝皮书[算法竞赛:进阶指南]. 题目大意: 就是给你一颗树,然后我们要在上面进行三种操作: 1.标记某个点 或者 2.撤销某个点的标记 以及 3.询问标记点在树上连通所需的最短总边 ...
- hdu 5188 dfs+二分
get了很多新技能 当时想到了用dfs,但是排序用的是限制时间排序,一直没搞出来. 正解: 二分用时,dfs判断,为了顺利进行做题,需要按照做题开始时间排序 还可以用dp 题意: 作为史上最强的刷子之 ...
- HDU 5143 DFS
分别给出1,2,3,4 a, b, c,d个 问能否组成数个长度不小于3的等差数列. 首先数量存在大于3的可以直接拿掉,那么可以先判是否都是0或大于3的 然后直接DFS就行了,但是还是要注意先判合 ...
- hdu 5167(dfs)
Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- DFS判断连通图
因为是连通图,所以从任意一点出发,一定可以通过一遍深度优先遍历就能走过所有的点和边,就可以利用这个性质来很容易的通过DFS判断图是否为连通图 下面是具体算法:
- HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)
Auxiliary Set Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- HDU 5927 Auxiliary Set (dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5927 题意: 给你一棵树,其中有一些'不重要'的点,要是这些'不重要'的点的子树中有两个重要的点的LC ...
随机推荐
- SpringBoot文件上传
先建工程 只勾选web和freemarker模板 最后 先看一下最终目录结构 先修改pom文件,加入common-io依赖 然后修改Application.yml文件 spring: freemark ...
- node.js(基础四)_express基础
一.前言 本次内容主要包括: 1.express的基本用法 2.express中的静 ...
- thinkphp 实现分页
一.一个条件的查询数据 查询数据自然是先要显示出数据,然后根据条件进行查询数据 (1)显示出表的数据 这个方法我还是写在了HomeController.class控制器文件中 (1.1)写了一个方法s ...
- yum工具的使用
yum工具的使用 ---------- yum list|head -n 10会有一个报错:由于管道被破坏而退出-----------搜索名字为vim的rpm包yum search vim使用grep ...
- SpringMVC简单项目配置
一.首先,SpringMVC框架使用分层开发,分层是为了实现“高内聚,低耦合”.采用“分而治之”的思想,把问题划分开来各个解决,易于控制,延展和分配资源,最重要的是有利于后期项目维护.MVC是指Mod ...
- Tensorflow object detection API 搭建物体识别模型(二)
二.数据准备 1)下载图片 图片来源于ImageNet中的鲤鱼分类,下载地址:https://pan.baidu.com/s/1Ry0ywIXVInGxeHi3uu608g 提取码: wib3 在桌面 ...
- script nGrinder_TestRunnerInsertMysqlSingle.groovy
s 阿里巴巴Java开发规范手册.zip http://dl.iteye.com/topics/download/ffc4ddcf-8b65-3b3c-b146-96468e2baf40 /** 关于 ...
- vscode 编辑markdown文件
关于换行问题 在vscode中编写Markdown文件时,会遇到明明按回车换行了但是预览的时候却没有换行的情况,这时在需要换行的地方多按两次空格键,就会换行 预览markdown文件 编辑器右上角有个 ...
- Linux记录-linux系统常用监控指标
1.Linux运维基础采集项 做运维,不怕出问题,怕的是出了问题,抓不到现场,两眼摸黑.所以,依靠强大的监控系统,收集尽可能多的指标,意义重大.但哪些指标才是有意义的呢,本着从实践中来的思想,各位工程 ...
- Maven 本地仓库,远程仓库,中央仓库,Nexus私服,镜像 详解
一. 本地仓库 本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库.这样在你下次使用的时候就不需要从远程下 ...