题意

给一个n个点的无向图,其中有一个隐藏点X,可以进行一组询问S来确定S是n个节点中的哪个点。S包括k个询问节点。询问返回的值也为k个值,每个值为X点到每个询问节点的最短路距离,求k最小为多少。

提示

1. 对于k个节点来说,最优的结构肯定是选择所有的叶子节点

2. 对于一个节点来说,假如它连了m条链(包括单个叶子节点),可以只标记m-1条链的叶子节点即可

3. 满足1,2条件以后,可以尝试再去询问点,发现均无法全部检测到,原因是:假如去点m-2条链,剩下的两条链,相同深度部分对于其他的节点来说是无法判断的,他们是等价的

方法

可以树形DP,一下,或者从每个叶子节点开始搜索一下,这里主要将树形DP的方法:

dp[i]代表除了i的子树部分外已经确定有询问点以后,子树i的内部确定所需要的询问点的最小值

只需要从度大于2的点开始DP一次就好了,因为假如度等于2的话,假如这个点连了一条直链,另一个点连了个非直链,那么必须得确保根节点选了以后才对,而两个非直链则不需要选根节点,因为显然根节点没连叶子节点,不需要选。而从度>2的点开始选,那么那么必有一个点子树内部是选了的,推出这个根节点是选了的,就满足了DP的定义(外部已经有确定的点),可以DP

代码

#include<bits/stdc++.h>

using namespace std;
vector<int> g[200004]; int dfs(int x, int fa) {
int ans = 0, cnt = 0;
for (auto k: g[x]) {
if (k == fa)continue;
int sum = dfs(k, x);
if (sum == 0)cnt++;
ans += sum;
}
return ans + max(0, cnt - 1);
} void run() {
int n;
cin >> n;
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].emplace_back(y);
g[y].emplace_back(x);
}
if (n == 1) {
cout << "0" << '\n';
return;
}
for (int i = 1; i <= n; i++) {
if (g[i].size() > 2) {
cout << dfs(i, 0) << '\n';
return;
}
}
cout << 1 << '\n';
} int main() {
int t;
cin >> t;
while (t --)
run();
return 0;
}

Codeforces1695 D1.+D2 Tree Queries的更多相关文章

  1. hz2016的noip模拟赛(d1 + d2)

    QAQ怕不是真的凉凉 d1 205 + d2 170 = 375 感觉难度和noip差不多 那么这可是有够凉的 官方题解 D1 D2 D1 T1 某地的ENLIGHTENED总部总部有N个Agent, ...

  2. Codeforces 960D - Full Binary Tree Queries

    960D - Full Binary Tree Queries 思路: 用move1[i]记录第i层第1种操作移动的个数(对这一层的个数取模) 用move2[i]记录第i层第2种操作移动的个数(对这一 ...

  3. AC日记——825G - Tree Queries

    825G - Tree Queries 思路: 神题,路径拆成半链: 代码: #include <cstdio> #include <cstring> #include < ...

  4. Codeforces Round #527 (Div. 3) 总结 A B C D1 D2 F

    传送门 A 贪心的取 每个字母n/k次 令r=n%k 让前r个字母各取一次 #include <bits/stdc++.h> using namespace std; typedef lo ...

  5. CF 1130A 1130B 1130C1129A1 1129A2 1129B(Round542A B C D1 D2 E)题解

    A : Be Positive 题目地址:https://codeforces.com/problemset/problem/1130/A 题解:让你求是否满足一个d使得数列长为n的a数组的每个数除以 ...

  6. oracle函数 months_between(d1,d2)

    [功能]:返回日期d1到日期d2之间的月数. [参数]:d1,d2 日期型 [返回]:数字 如果d1>d2,则返回正数 如果d1<d2,则返回负数 [示例] select sysdate, ...

  7. CF1328E Tree Queries

    CF1328E Tree Queries 应该还是比较妙的 题意 给你一个树,然后多次询问 每次询问给出一堆节点,问你是否能找到一个从根出发的链,是的对于给出的每个节点,都能找出链上的点,是的他们的距 ...

  8. E. Tree Queries 解析(思維、LCA)

    Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...

  9. CF-1328 E. Tree Queries

    E. Tree Queries 题目链接 题意 给定一个树,每次询问一组点,问是否存在一条从根到某点的路径,使得该组点到该路径的最短距离不超过1 分析 从根到达某点的路径,如果覆盖到了某个点,那么一定 ...

随机推荐

  1. 【面试题】JSON.stringify()妙用,你真的知道吗?

    JSON.stringify()妙用 点击打开视频讲解更加详细 语法:JSON.stringify(value, replacer , space) value:将要序列化成 一个JSON 字符串的值 ...

  2. synchronized原理剖析

    synchronized原理剖析 并发编程存在什么问题? 1️⃣ 可见性 可见性:是指当一个线程对共享变量进行了修改,那么另外的线程可以立即看到修改后的最新值. 案例演示:一个线程A根据 boolea ...

  3. Excel 数学函数(三):RAND 和 RANDBETWEEN

    Excel 主要有 RAND 和 RANDBETWEEN 这两个函数生成随机数.RAND 默认生成 0~1 的随机数:RANDBETWEEN 有两个参数:bottom 和 top,bottom 代表函 ...

  4. 刷题记录:Codeforces Round #731 (Div. 3)

    Codeforces Round #731 (Div. 3) 20210803.网址:https://codeforces.com/contest/1547. 感觉这次犯的低级错误有亿点多-- A 一 ...

  5. PHP代码审计学习-php安全基础

    PHP代码审计-php安全基础 php.ini选项 register_globals php>=4.2.0,php.ini 的 register_globals 选项的默认值预设为 Off,当 ...

  6. CF-1562B- Scenes From a Memory

    Problem - 1562B - Codeforces 题意:给定一个字符串,每次操作可以选择这个字符串中的一种字符,将他们全部都减1,最多K次操作,问可以形成的字典大小最小的字符串. 题解:首先我 ...

  7. C# using()的本质

    " 程序世界没有秘密,所有答案都在源码里 " 01.点明观点 C#中,非托管资源使用之后必须释放,而using()是使用非托管资源的最佳方式,可以确保资源在代码块结束之后被正确释放 ...

  8. 第四十一篇:Vue生命周期(二)

    好家伙,书接上回 上图:(Vue官网中Vue实例图片的下半张) 以下为解释: 5.1.1. mounted执行完后,表示整个Vue实例已经初始化完毕了; 此时,组件已经脱离了创建阶段;进入到运行阶段 ...

  9. 面试~jvm(JVM内存结构、类加载、双亲委派机制、对象分配,了解垃圾回收)

    一.JVM内存结构 ▷ 谈及内存结构各个部分的数据交互过程:还可以再谈及生命周期.数据共享:是否GC.是否OOM 答:jvm 内存结构包括程序计数器.虚拟机栈.本地方法栈.堆.方法区:它是字节码运行时 ...

  10. python3实现:进程遇Error定时重启

    import os import time # 停止HFish def stopHFish(): # while True: try: # 找到HFish进程号 HFish_id = int(os.p ...