题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5927

题意:

给你一棵树,其中有一些’不重要‘的点,要是这些’不重要‘的点的子树中有两个重要的点的LCA是这个点,那么这个点就是重要的点。每次询问 问你重要的点有多少?

思路:

用不重要的点建图,要是这个不重要点上的相邻子树至少有两个有重要的点不在同一子树上,那么这个不重要的点才变成重要的点。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
const int N = 1e5 + ;
vector <int> G[N];
int d[N], a[N], par[N], d2[N], cnt, son[N];
bool vis[N];
//son[u]表示u节点相邻的子树个数
//原图:d[u]表示以u节点为root的子树节点个数
//不重要点建的图:d2[u]表示以u节点为root的子树节点个数
//cnt表示不重要的点的个数 void init(int n) {
for(int i = ; i <= n; ++i) {
G[i].clear();
vis[i] = false;
}
} void dfs1(int u, int p) {
d[u] = ;
par[u] = p;
son[u] = ;
for(int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(v == p)
continue;
dfs1(v, u);
d[u] += d[v];
++son[u];
}
} void dfs2(int u) {
d2[u] = ;
vis[u] = true;
int num = , num2 = ;
for(int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(!vis[v])
dfs2(v);
d2[u] += d2[v];
if(d[v] > d2[v]) {
++num;
}
num2++;
}
if(num + (son[u] - num2) > ) //符合条件 (不同子树中重要点)>=2;
return ;
else
cnt++;
} int main()
{
int t, n, m, u, v, q;
scanf("%d", &t);
for(int ca = ; ca <= t; ++ca) {
scanf("%d %d", &n, &m);
init(n);
for(int i = ; i < n; ++i) {
scanf("%d %d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
printf("Case #%d:\n", ca);
dfs1(, );
init(n);
while(m--) {
scanf("%d", &q);
for(int i = ; i <= q; ++i) {
scanf("%d", a + i);
vis[a[i]] = true;
}
for(int i = ; i <= q; ++i) {
if(vis[par[a[i]]]) {
G[par[a[i]]].push_back(a[i]);
}
}
for(int i = ; i <= q; ++i) {
vis[a[i]] = false;
}
cnt = ;
for(int i = ; i <= q; ++i) {
if(!vis[a[i]]) {
dfs2(a[i]);
}
}
for(int i = ; i <= q; ++i) {
vis[a[i]] = false;
G[a[i]].clear();
}
printf("%d\n", n - cnt);
}
}
return ;
}

HDU 5927 Auxiliary Set (dfs)的更多相关文章

  1. HDU 5927 Auxiliary Set 【DFS+树】(2016CCPC东北地区大学生程序设计竞赛)

    Auxiliary Set Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  2. hdu 5927 Auxiliary Set 贪心

    Auxiliary Set Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Pr ...

  3. hdu 5927 Auxiliary Set

    传送门 分析:感觉这道题有点意思.就写一篇mark一下吧. 现场比赛的时候去枚举了儿子用了线段树+dfs序,和预想的一样T了. 可以换一个想法,从儿子对父亲的贡献来思考. 在点中先假设一个节点的每一个 ...

  4. F - Auxiliary Set HDU - 5927 (dfs判断lca)

    题目链接: F - Auxiliary Set HDU - 5927 学习网址:https://blog.csdn.net/yiqzq/article/details/81952369题目大意一棵节点 ...

  5. HDOJ(HDU).2660 Accepted Necklace (DFS)

    HDOJ(HDU).2660 Accepted Necklace (DFS) 点我挑战题目 题意分析 给出一些石头,这些石头都有自身的价值和重量.现在要求从这些石头中选K个石头,求出重量不超过W的这些 ...

  6. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  7. HDOJ(HDU).1241 Oil Deposits(DFS)

    HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...

  8. HDOJ(HDU).1035 Robot Motion (DFS)

    HDOJ(HDU).1035 Robot Motion [从零开始DFS(4)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DF ...

  9. HDU 1501 Zipper 【DFS+剪枝】

    HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...

随机推荐

  1. DOM应用

    父级.removeChild(子节点);父级.appendChild(子节点);父级.insertBefore(子节点, 在谁之前); 创建元素: <script> window.onlo ...

  2. 指针数组vs数组指针 指针函数vs函数指针

    在分辨这些重要的概念时,我们先回顾一下前面所讲的C之三值合一,由于三个值所求出的地址是相同的,所以经常有传言说他们都是首元素的地址.这种说法是不正确的.为什么说它是不正确的呢? 首先定义一个指针,将三 ...

  3. 编译busybox错误

    为了制作一个文件系统,首先要用busybox编译出文件系统所需要的应用程序.在下载了busybox-1.13.0.tar.bz2后,编译出现如下错误: In file included from /o ...

  4. HDU 5326 work (回溯,树)

    题意:给一棵树,每个结点的子树下的结点都是它的统治对象,问有多少个统治对象数目为k的结点? 思路:每个结点都设一个cnt来记数,只要将每个结点往上回溯,直到树根,经过的每个结点都将计数器加1.最后再扫 ...

  5. zipline

    history 多只股票时会返回某几只股票停牌没数据 if not symbol(stock) in data: 聚宽 多只股票如果某几只没有发行 600485: nan 多只股票如果某几只停牌 60 ...

  6. 部署在IIS服务器的asp.net 网站,禁止访问指定类型文件

    网站上的一些文件不希望用户访问,可以通过下面的方式简单实现.不需写代码(在IIS6下试验过). 第一步,在IIS中实现映射. 哪些文件需要特殊处理. 通俗的将就是将哪种类型的文件交给特定的工厂来处理. ...

  7. SPY++的使用

    百度百科Spy++ 使用的是VS2010.net自带的功能,可以从开始菜单中打开.

  8. Android Retrofit实现原理分析

    retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...

  9. 通过反射执行get、set方法

    Class clazz = sourceObj.getClass(); 1.获取所有属性 BeanInfo beanInfo = Introspector.getBeanInfo(clazz); Pr ...

  10. MySQL与Oracle 差异比较之三函数

    函数 编号 类别 ORACLE MYSQL 注释 1 数字函数 round(1.23456,4) round(1.23456,4) 一样:ORACLE:select round(1.23456,4) ...