博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP2017提高A组冲刺11.6】拆网线
阅读量:7008 次
发布时间:2019-06-28

本文共 1122 字,大约阅读时间需要 3 分钟。

 

syq大兄弟吐槽题目不小心yy出了正解..

最优的选法就是选两个两个相互独立的,欸这不就是最大匹配吗?那多的企鹅就新加一条边呗?不够的就除以2上取整呗?

欸?AC了?

树也是一个二分图,最大匹配=最小点覆盖=N-最大独立集,树上的最大独立集就是没有上司的舞会,没了。

#include
#include
#include
using namespace std;inline int rd(){ int ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f;}const int MAXN=100005;struct Edge{ int next,to;}e[MAXN<<1];int ecnt,head[MAXN];inline void add(int x,int y){ e[++ecnt].next = head[x]; e[ecnt].to = y; head[x] = ecnt;}int n,m,T;int f[MAXN][2];void dfs(int x,int pre){ f[x][1]=1; for(int i=head[x];i;i=e[i].next){ int v=e[i].to; if(v==pre) continue; dfs(v,x); f[x][1]+=f[v][0]; f[x][0]+=max(f[v][0],f[v][1]); }}void solve(){ memset(f,0,sizeof(f)); memset(head,0,sizeof(head)); ecnt=0; n=rd();m=rd(); for(int i=2;i<=n;i++){ int x=rd(); add(i,x);add(x,i); } dfs(1,0); int ans=n-max(f[1][1],f[1][0]); if(ans*2>=m) cout<<(m+1)/2<

 

转载于:https://www.cnblogs.com/ghostcai/p/9439646.html

你可能感兴趣的文章
从SVD到PCA——奇妙的数学游戏
查看>>
Go正则匹配
查看>>
scala视频课程
查看>>
Elasticsearch与Solr搜索引擎选型调研文档
查看>>
Ubuntu下使用Eclipse菜单栏无法显示的问题的解决办法
查看>>
MyBatis笔记(九)——动态SQL与模糊查询
查看>>
HTML5框架、背景和实体
查看>>
Hello Girl
查看>>
AngularJS+Satellizer+Node.js+MongoDB->Instagram-16
查看>>
Angular 2 系列: 组件
查看>>
Java IO
查看>>
java虚拟机内存区域的划分与详解
查看>>
nginx.conf 和default.conf 讲解
查看>>
Linux下修改Mysql数据库存放路径
查看>>
lua中冒号(:)与点号(.)的区别
查看>>
使SQL用户只能看到自己拥有权限的库
查看>>
Java并发编程初级篇(十五):使用公平锁
查看>>
【小家java】对java中null、void、Void的理解学习
查看>>
Spring Cloud 入门教程(一): 服务注册与发现(Eureka)(Greenwich.RELEASE)
查看>>
企业项目管理软件选型指南
查看>>