【codeforces Round#801 Div2 D题 Tree Queries】树形贪心结论
题目链接
题意:
给你一棵树,你需要执行多次询问来确定一个节点x的位置,对于每一次询问,你需要选择一个节点,能得到这个节点与x节点的距离是多少,问至少需要多少次询问才能确定x的位置。
分析:
有一个结论,就是选所有叶节点一定能表示出所有的节点,现在咱们来证明一下。选所有叶节点的话,叶节点的直接父节点就能唯一确定,那么咱们就把这些直接父节点作为新的叶节点来再唯一确定父节点的父节点,那么就能唯一确定所有的节点了,那么很显然选叶子节点是一定比选父节点优的,因为叶节点只有一个分支,不确定性更小,所以说如果最优解中有非叶子节点的话咱们可以替换成叶子节点而不影响最优性的,采用了交换论证的思想。当然咱们不能选所有的叶子节点,因为多余了,做法就是当遇到分叉的时候,这个分叉下面的叶子节点只删一个,这样子就能保证所有的节点都能唯一确定了。下面请看代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 200010,M = N+N;
int n,cnt;
int du[N],h[N],e[M],ne[M],idx;
void add(int a,int b){du[a]++;e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
bool st[N];
void dfs(int u,int fa){for(int i=h[u];i!=-1;i=ne[i]){int j = e[i];if(j == fa) continue;if(!st[j] && du[j] > 2){cnt++;st[j] = true;return;}else if(st[j] && du[j] > 2) return;else dfs(j,u);}
}
void solve(){scanf("%d",&n);for(int i=1;i<=n;i++) h[i] = -1,st[i] = false,du[i] = 0; idx=0;cnt=0;int ans = 0;for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);} int t1 = 0;for(int i=1;i<=n;i++){if(du[i] == 1) dfs(i,0),ans++;else if(du[i] == 2) t1++;}if(ans + t1 == n) printf("1\n");elseprintf("%d\n",ans-cnt);
}
int main(){int _;scanf("%d",&_);while(_--){solve();}return 0;
}
【codeforces Round#801 Div2 D题 Tree Queries】树形贪心结论相关推荐
- codeforces round 416 div2补题
第一题,水题 A. Vladik and Courtes #include<bits/stdc++.h> using namespace std; int main() {long lon ...
- codeforces round 421 div2 补题 CF 820 A-E
A Mister B and Book Reading O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef lon ...
- codeforces round 418 div2 补题 CF 814 A-E
A An abandoned sentiment from past 水题 #include<bits/stdc++.h>using namespace std;int a[300],b[ ...
- codeforces round 422 div2 补题 CF 822 A-F
A I'm bored with life 水题 #include<bits/stdc++.h> using namespace std; typedef long long int LL ...
- codeforces round 420 div2 补题 CF 821 A-E
A Okabe and Future Gadget Laboratory 暴力 #include<bits/stdc++.h> using namespace std; typedef l ...
- Codeforces Round #801 (Div. 2)A~C
Codeforces Round #801 (Div. 2)A~C Problem - A - Codeforces Michael and Joe are playing a game. The g ...
- Codeforces Round #675 (Div. 2) F. Boring Queries 区间lcm + 主席树
传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的序列aaa,qqq个询问,每次询问[l,r][l,r][l,r]内的lcmlcmlcm是多少,对1e9+71e9+71e9+7取模. n ...
- Codeforces Round #630 (Div. 2) F. Independent Set 树形dp
传送门 文章目录 题意: 思路: 题意: 给你一棵树,求这棵树的边导出子图中独立集的数量和,独立集大小可以为000. 思路: 先考虑普通的独立集数量怎么求,无非就是分情况讨论一下选根还是不选根,而这个 ...
- Codeforces Round #297 (Div. 2)C. Ilya and Sticks 贪心
Codeforces Round #297 (Div. 2)C. Ilya and Sticks Time Limit: 2 Sec Memory Limit: 256 MB Submit: xxx ...
最新文章
- JS弹出窗口窗口的位置和大小
- win7网络的计算机名称,Win7指定的网络名不再可用快速解决教程
- 当NLP遇见OCR:如何提升智能文档分析效果?
- 一种新的穿透防火墙的数据传输技术
- ftp上传和下载命令
- 缺钱还是车库放不下?王思聪两台顶级座驾上架二手市场,要价比新车还贵!...
- 纯新手DSP编程--5.21--DSP/BIOS使用
- 网络编程 - 实现文件传送
- 通力法评 | 《证券基金经营机构信息技术管理办法》解读
- JS正则表达式详解[转]
- 信息安全实验——使用john软件破解Windows密码
- 牛客网在线判题出现“请检查是否存在数组越界等非法访问情况”的情况
- PHP轻量级博客 typecho插件安装教程
- 关于linux系统安装zabbix报错的解决方案
- QT将10进制转换为2进制与16进制
- 2016 Multi-University Training Contest 3 1010 Rower Bo
- 使用组策略将用户文件夹重定向到D盘
- 【5G核心网】 5GC核心网之网元PCF
- 自学计算机基础知识本科,没有专业基础自学考试计算机本科会很吃力吗?
- Labelme标注的json数据转化为coco格式的数据