题解 - 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相关推荐

  1. CF613D Kingdom and its Cities

    题目描述: luogu cf 题解: 虚树上dp. 建虚树没啥说的. 那么dp状态? 考虑dfs时返回一个值,代表这个子树上面需不需要隔断. 如果当前点可以占,那么有至少两个这种子树时应该选这个点并返 ...

  2. 【CF613D】Kingdom and its Cities(虚树,动态规划)

    题面 洛谷 CF 翻译洛谷上有啦 题解 每次构建虚树,首先特判无解,也就是关键点中存在父子关系. 考虑 dp d p dp,设 f[i] f [ i ] f[i]表示解决 i i i子树以内的最小点数 ...

  3. CodeForces - 613D Kingdom and its Cities(虚树+贪心)

    题目链接:点击查看 题目大意:给出一棵 n 个结点组成的树,有多组询问,每组询问给出 k 个点,现在可以删除不同于 k 个节点的 m 个节点,使得这 k 个节点两两不连通,要求最小化 m ,如果不可能 ...

  4. 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】

    http://codeforces.com/problemset/problem/613/D 题意: 给出n个点的树,有q个询问,每次询问给出k个重要的点,问至少删掉多少个非重要的点,使得这个重要的点 ...

  5. 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】倍增lca

    http://codeforces.com/problemset/problem/613/D 题意: 给出n个点的树,有q个询问,每次询问给出k个重要的点,问至少删掉多少个非重要的点,使得这个重要的点 ...

  6. 图论专题-学习笔记:虚树

    图论专题-学习笔记:虚树 1. 前言 2. 详解 2.1 虚树定义 2.2 虚树构造 2.3 例题 3. 总结 4. 参考资料 1. 前言 虚树,主要是用于一类树上问题,这类问题通常是需要取一些关键点 ...

  7. 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...

  8. 音乐雷达 shazam算法_具有10亿首Shazam音乐识别功能的数据可视化

    音乐雷达 shazam算法 While at university, I joined Shazam as part time web developer. I stayed at Shazam fo ...

  9. CSU 1116 Kingdoms

    传送门 Description A kingdom has n cities numbered 1 to n, and some bidirectional roads connecting citi ...

最新文章

  1. mysql 中文乱码
  2. 深入Java中文编码乱码问题及最优解决方法
  3. Pytorch Document学习笔记
  4. c语言无限循环while(1)和for(;;)的区别
  5. Spark Streaming 实战案例(二) Transformation操作
  6. VMware Workstation 8下Ubuntu 13.04中安装VMware Tools出错
  7. Springboot整合zookeeper
  8. ASP.NET Core 中的 ORM 之 Entity Framework
  9. 特征图注意力_ICLR2017 | AT_注意力引导的知识蒸馏
  10. kafka的c/c++高性能客户端librdkafka简介/使用librdkafka的C++接口实现简单的生产者和消费者
  11. windows下eclipse模拟运行apk
  12. 周志华机器学习西瓜书速记第一章绪论
  13. sourcesafe的七个问题?
  14. Telink zigbee射频和功耗测试的方法
  15. 数据结构(C#)_排序算法(冒泡排序)
  16. spark scala求PV,UV,topN
  17. windows无法连接到某个wifi_Win7系统提示Windows无法连接到无线网络如何解决?
  18. C++青少年编程课程体系与教案
  19. 【新闻文本分类】(task4)使用gensim训练word2vec
  20. 12306官方抢票服务,铁路候补购票服务扩大到全部旅客列车!

热门文章

  1. 威联通 php配置,威联通(qnap) NAS docker 安装 IYUU 步骤
  2. 多个 EXCEL 文件如何合并成一个文件
  3. 解决某些MySQL数据库的表没了,建数据库也建不了的情况
  4. Win10 DirectX 8.1 安装与启用
  5. c语言出错英语显示怎么看,C语言程序设计 教小学生英语 里面有代码运行错误,怎么改...
  6. 考研计算机专业英语面试自我介绍,计算机研究生面试英文自我介绍
  7. 名帖234 俞和 行书《云锦帖》
  8. word的表格取消边框后还有虚线怎么办
  9. 二叉树翻转/镜像 (Java实现)
  10. 50 行代码爬取链家租房信息