题目:

给定一颗树··在保证有k个点与其它点连接的情况下问最少保留多少条边····

树的节点树n和k均小于100000;

题解:

很容易看出来我们要尽量保留那种一条边连两个节点的情况····

然后考试的时候我以为这就完了··xjb贪完心后错了一大半····

下次一定要写对拍了,艹

贪心的时候我们要沿着叶子节点来贪心···这样就能保证正确性了···证明的话就不细说了··不信的话打个对拍看看···

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
int T,n,K,fst[N],nxt[N*],go[N*],tot,cnt,keep;
bool del[N];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline void comb(int a,int b)
{
nxt[++tot]=fst[a],fst[a]=tot,go[tot]=b;
nxt[++tot]=fst[b],fst[b]=tot,go[tot]=a;
}
inline void pre()
{
cnt=tot=keep=;
memset(fst,,sizeof(fst));
memset(del,false,sizeof(del));
}
inline void dfs(int u,int fa)
{
for(int e=fst[u];e;e=nxt[e])
{
int v=go[e];if(v==fa) continue;
dfs(v,u);
if(!del[v]&&!del[u])
{
if(keep<K)
{
keep+=;cnt++;
del[v]=del[u]=true;
}
}
}
}
int main()
{
//freopen("a.in","r",stdin);
T=R();int a;
while(T--)
{
n=R(),K=R();pre();
for(int i=;i<n;i++) a=R(),comb(i+,a);
dfs(,);
if(keep>=K) cout<<cnt<<"\n";
else cout<<cnt+(K-keep)<<"\n";
}
return ;
}

最新文章

  1. C++ 知道虚函数表的存在
  2. [数据库事务与锁]详解六: MySQL中的共享锁与排他锁
  3. ObjC 巧用反射和KVC实现JSON快速反序列化成对象
  4. 在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker
  5. delphi 2007 远程调试
  6. Flink - DataStream
  7. idea快捷键(转)
  8. angularjs directive学习心得
  9. bzoj1266
  10. iOS开发经验总结(下)
  11. 【JDK1.8】JUC——LockSupport
  12. app Inventor
  13. 迭代和JDB(课下作业,选做)
  14. 「HGOI#2019.4.19省选模拟赛」赛后总结
  15. 微信小程序 wx.request
  16. 关于maven:调整你的maven的jdk版本为 xxxx
  17. Shader中ColorMask的使用
  18. (转)Unity中protobuf的使用方法
  19. js 正则积累
  20. day4 正则表达式(regular)

热门文章

  1. JS Math方法、逻辑
  2. JS事件类型--1
  3. Python语言编写脚本时,对日期控件的处理方式
  4. 学习jQuery的免费资源:电子书、视频、教程和博客
  5. strlen、strcpy、strcat的实现
  6. C# 使用Epplus导出Excel [4]:合并指定行
  7. Template 基础篇-函数模板(待看
  8. guava笔记
  9. UVA - 11134 Fabled Rooks问题分解,贪心
  10. 思维题:UVa1334-Ancient Cipher