题解 - CF613D Kingdom and its Cities
题解 - C F 613 D K i n g d o m a n d i t s C i t i e s \mathrm{CF613D \ Kingdom \ and \ its \ Cities} CF613D Kingdom and its Cities
- 一道 虚树+树形DP好题。
题目意思
戳这里
S o l \mathrm{Sol} Sol
- 这道题目的重点还是建虚树,如果不会建立虚树,虚树构建学习
- 然后我们就开始愉快地树形 D P DP DP了
- 设 f u f_u fu表示以 u u u为根节点最少选择点数
- 设 g u g_u gu表示以 u u u为根节点还没有处理地特殊点数量
- 对于转移:
- 如果这个点 u u u不是特殊点且 g u > 1 g_u>1 gu>1,那么就必须选。
- 如果这个点 u u u是特殊点,那么 f u = ( f u + g u ) , g u = 1 f_u=(f_u+g_u),g_u=1 fu=(fu+gu),gu=1,其中 g u = 1 g_u=1 gu=1因为还有根节点是特殊点。
- 对于其他就是: f u = ∑ f v , g u = ∑ g v f_u=\sum f_v,g_u=\sum g_v fu=∑fv,gu=∑gv
- 对于那些虚树上的点,如果 u u u以及 f a u fa_u fau都为特殊点,那么输出 − 1 -1 −1就可以了。
C o d e \mathrm{Code} Code
#include <bits/stdc++.h>
using namespace std;inline int read()
{int sum=0,ff=1; char ch=getchar();while(!isdigit(ch)){if(ch=='-') ff=-1;ch=getchar();}while(isdigit(ch))sum=sum*10+(ch^48),ch=getchar();return sum*ff;
}const int N=4e5+5;int n,m,cnt,head[N],siz[N],stak[N];
int ans,in[N],out[N],is[N],p[N],tim;
int dep[N],son[N],top[N],f[N],g[N],h[N];struct nood
{int nex,to;
};
nood e[N*2];inline void jia(int u,int v)
{e[++cnt].nex=head[u];head[u]=cnt;e[cnt].to=v;
}inline void dfs(int u,int fa)
{dep[u]=dep[fa]+1;in[u]=++tim;f[u]=fa;siz[u]=1;for ( int i=head[u];i;i=e[i].nex ){int v=e[i].to;if(v==fa) continue;dfs(v,u);siz[u]+=siz[v];if(siz[v]>siz[son[u]]) son[u]=v;}out[u]=tim;
}inline void dfs2(int u,int tp)
{top[u]=tp;if(son[u]) dfs2(son[u],tp);for ( int i=head[u];i;i=e[i].nex ){int v=e[i].to;if(v==f[u]||v==son[u]) continue;dfs2(v,v);}
}inline int LCA(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);x=f[top[x]];}if(dep[x]>dep[y]) swap(x,y);return x;
}inline void dp(int u)
{for ( int i=head[u];i;i=e[i].nex ){int v=e[i].to;dp(v);h[u]+=h[v];g[u]+=g[v];}if(is[u]) h[u]+=g[u],g[u]=1;else h[u]+=(g[u]>1),g[u]=(g[u]==1);
}inline int calc(int x,int gs)
{for ( int i=1;i<=gs;i++ ) if(is[p[i]]&&is[f[p[i]]]) return -1;dp(x);return h[x];
}inline bool cmp(int x,int y)
{return in[x]<in[y];
}int main()
{n=read();for ( int i=1;i<n;i++ ){int u,v;u=read(),v=read();jia(u,v);jia(v,u);}dfs(1,0);dfs2(1,1);memset(head,0,sizeof(head));cnt=0;int Q=read();for (;Q--;){int gs=read();for ( int i=1;i<=gs;i++ ) is[(p[i]=read())]=1;sort(p+1,p+gs+1,cmp);for ( int i=gs;i>1;i-- ) p[++gs]=LCA(p[i],p[i-1]);sort(p+1,p+gs+1,cmp);gs=unique(p+1,p+gs+1)-p-1;cnt=0;for ( int i=1,top=0;i<=gs;i++ ){while(top&&out[stak[top]]<in[p[i]]) top--;jia(stak[top],p[i]);stak[++top]=p[i];}printf("%d\n",calc(p[1],gs));for ( int i=1;i<=gs;i++ ) head[p[i]]=0,is[p[i]]=0,h[p[i]]=0,g[p[i]]=0;}return 0;
}
题解 - CF613D Kingdom and its Cities相关推荐
- CF613D Kingdom and its Cities
题目描述: luogu cf 题解: 虚树上dp. 建虚树没啥说的. 那么dp状态? 考虑dfs时返回一个值,代表这个子树上面需不需要隔断. 如果当前点可以占,那么有至少两个这种子树时应该选这个点并返 ...
- 【CF613D】Kingdom and its Cities(虚树,动态规划)
题面 洛谷 CF 翻译洛谷上有啦 题解 每次构建虚树,首先特判无解,也就是关键点中存在父子关系. 考虑 dp d p dp,设 f[i] f [ i ] f[i]表示解决 i i i子树以内的最小点数 ...
- CodeForces - 613D Kingdom and its Cities(虚树+贪心)
题目链接:点击查看 题目大意:给出一棵 n 个结点组成的树,有多组询问,每组询问给出 k 个点,现在可以删除不同于 k 个节点的 m 个节点,使得这 k 个节点两两不连通,要求最小化 m ,如果不可能 ...
- 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】
http://codeforces.com/problemset/problem/613/D 题意: 给出n个点的树,有q个询问,每次询问给出k个重要的点,问至少删掉多少个非重要的点,使得这个重要的点 ...
- 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】倍增lca
http://codeforces.com/problemset/problem/613/D 题意: 给出n个点的树,有q个询问,每次询问给出k个重要的点,问至少删掉多少个非重要的点,使得这个重要的点 ...
- 图论专题-学习笔记:虚树
图论专题-学习笔记:虚树 1. 前言 2. 详解 2.1 虚树定义 2.2 虚树构造 2.3 例题 3. 总结 4. 参考资料 1. 前言 虚树,主要是用于一类树上问题,这类问题通常是需要取一些关键点 ...
- 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...
- 音乐雷达 shazam算法_具有10亿首Shazam音乐识别功能的数据可视化
音乐雷达 shazam算法 While at university, I joined Shazam as part time web developer. I stayed at Shazam fo ...
- CSU 1116 Kingdoms
传送门 Description A kingdom has n cities numbered 1 to n, and some bidirectional roads connecting citi ...
最新文章
- mysql 中文乱码
- 深入Java中文编码乱码问题及最优解决方法
- Pytorch Document学习笔记
- c语言无限循环while(1)和for(;;)的区别
- Spark Streaming 实战案例(二) Transformation操作
- VMware Workstation 8下Ubuntu 13.04中安装VMware Tools出错
- Springboot整合zookeeper
- ASP.NET Core 中的 ORM 之 Entity Framework
- 特征图注意力_ICLR2017 | AT_注意力引导的知识蒸馏
- kafka的c/c++高性能客户端librdkafka简介/使用librdkafka的C++接口实现简单的生产者和消费者
- windows下eclipse模拟运行apk
- 周志华机器学习西瓜书速记第一章绪论
- sourcesafe的七个问题?
- Telink zigbee射频和功耗测试的方法
- 数据结构(C#)_排序算法(冒泡排序)
- spark scala求PV,UV,topN
- windows无法连接到某个wifi_Win7系统提示Windows无法连接到无线网络如何解决?
- C++青少年编程课程体系与教案
- 【新闻文本分类】(task4)使用gensim训练word2vec
- 12306官方抢票服务,铁路候补购票服务扩大到全部旅客列车!
热门文章
- 威联通 php配置,威联通(qnap) NAS docker 安装 IYUU 步骤
- 多个 EXCEL 文件如何合并成一个文件
- 解决某些MySQL数据库的表没了,建数据库也建不了的情况
- Win10 DirectX 8.1 安装与启用
- c语言出错英语显示怎么看,C语言程序设计 教小学生英语 里面有代码运行错误,怎么改...
- 考研计算机专业英语面试自我介绍,计算机研究生面试英文自我介绍
- 名帖234 俞和 行书《云锦帖》
- word的表格取消边框后还有虚线怎么办
- 二叉树翻转/镜像 (Java实现)
- 50 行代码爬取链家租房信息