JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线
来源:互联网 发布:伊藤网络超市 编辑:程序博客网 时间:2024/06/01 08:56
Description
企鹅国的网吧们之间由网线互相连接,形成一棵树的结构。现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料。但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把这K只企鹅安排到不同的机房(两只企鹅在同一个机房会吵架),然后拆掉一些网线,但是需要保证每只企鹅至少还能通过留下来的网线和至少另一只企鹅联机游戏。
所以他们想知道,最少需要保留多少根网线?
Input
第一行一个整数T,表示数据组数;
每组数据第一行两个整数N,K,表示总共的机房数目和企鹅数目。
第二行N-1个整数,第i个整数Ai表示机房i+1和机房Ai有一根网线连接(1≤Ai≤i)。
Output
每组数据输出一个整数表示最少保留的网线数目。
Sample Input
2
4 4
1 2 3
4 3
1 1 1
Sample Output
2
2
Data Constraint
对于30%的数据:N≤15;
对于50%的数据:N≤300;
对于70%的数据:N≤2000;
对于100%的数据:2≤K≤N≤100000,T≤10。
Solution
一眼贪心。
显然最优的情况一定是一条边匹配两个点,如果能这样匹配就直接直接输出了。
但是有可能树的形状不能满足这样的匹配,于是剩下的点就只能用一条一条的边匹配了。
处理匹配的话就从下往上贪心地匹配即可。
时间复杂度
O(T∗N) 。
Code
#include<cstdio>#include<cstring>using namespace std;const int N=1e5+1;int tot,ans;int first[N],next[N],en[N];bool bz[N];inline int read(){ int X=0,w=1; char ch=0; while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();} while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar(); return X*w;}inline void insert(int x,int y){ next[++tot]=first[x]; first[x]=tot; en[tot]=y;}inline void dfs(int x,int y){ for(int i=first[x];i;i=next[i]) if(en[i]!=y) { dfs(en[i],x); if(!bz[x] && !bz[en[i]]) bz[x]=true,ans++; }}int main(){ int T=read(); while(T--) { int n=read(),k=read(); memset(first,tot=ans=0,sizeof(first)); memset(bz,false,sizeof(bz)); for(int i=2;i<=n;i++) insert(read(),i); dfs(1,0); if(ans<<1>=k) printf("%d\n",(k>>1)+(k&1)); else printf("%d\n",ans+(k-ans*2)); } return 0;}
阅读全文
1 0
- JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线
- Jzoj5455【NOIP2017提高A组冲刺11.6】拆网线
- JZOJ5455. 【NOIP2017提高A组冲刺11.6】拆网线
- JZOJ 5440. 【NOIP2017提高A组冲刺11.1】背包
- JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列
- 【JZOJ 5442】【NOIP2017提高A组冲刺11.1】荒诞
- 【JZOJ 5441】【NOIP2017提高A组冲刺11.1】序列
- JZOJ 5442. 【NOIP2017提高A组冲刺11.1】荒诞
- 【JZOJ 5445】【NOIP2017提高A组冲刺11.2】失格
- JZOJ 5443. 【NOIP2017提高A组冲刺11.2】字典序
- jzoj【NOIP2017提高A组冲刺11.2】失格
- JZOJ 5444. 【NOIP2017提高A组冲刺11.2】救赎
- JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格
- JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格
- 【JZOJ 5451】【NOIP2017提高A组冲刺11.4】Genocide
- 【JZOJ 5449】【NOIP2017提高A组冲刺11.4】Pacifist
- 【JZOJ 5452】【NOIP2017提高A组冲刺11.5】轰炸
- JZOJ 5452. 【NOIP2017提高A组冲刺11.5】轰炸
- ab命令做压测测试
- 限制登陆终端pts
- 1117: 查找数组元素
- SPOJ COT2(树上莫队)
- BZOJ 1042: [HAOI2008]硬币购物【容斥】【01背包】
- JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线
- 函数:使用函数重载及默认参数实现程序
- python---post请求
- 日常办公提升效率软件(chrome插件、Octave、BOINC、FLIQLO)
- JUnit报错问题汇总
- Android 获得设备状态信息、Mac地址、IP地址
- 机器学习入门方法
- PMM 命令详解
- Mybatis-generator