【APIO2010T2】巡逻-贪心+树形DP
来源:互联网 发布:许嵩如果当时知乎 编辑:程序博客网 时间:2024/06/05 00:27
测试地址:巡逻
做法:贪心,对于K=1的情况下,只需要找树的直径(树上最长的路径),设这个直径为len,则结果为2*(n-1)-len+1。对于K=2的情况,先找树的一个直径,将答案总数tot赋值为2*(n-1)-len+1,然后把直径上所有边赋值为-1,再求一遍直径,结果为tot-len+1。不过需要注意,直径最开始要赋值为0,因为如果直径为负数,还不如在一个点上绕自环。至于直径的求法,当然就是DFS啦!存储从一点到叶节点的最长的两条不重合的路径,并用下一层的信息修正上一层,也是类似树形DP的思想。
以下是本人代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,k,mx[100010]={0},smx[100010]={0},mxp[100010]={0},smxp[100010]={0};int first[100010]={0},tot=0,ans,mp,smp,mi;bool vis[100010]={0};struct edge {int v,d,next;} e[200010];void insert(int a,int b,int d){ e[++tot].v=b;e[tot].d=d;e[tot].next=first[a];first[a]=tot;}void dfs(int v){ vis[v]=1; mx[v]=smx[v]=0,mxp[v]=smxp[v]=v; for(int i=first[v];i;i=e[i].next) if (!vis[e[i].v]){ dfs(e[i].v); if (mx[e[i].v]+e[i].d>mx[v]) { smx[v]=mx[v],mx[v]=mx[e[i].v]+e[i].d; smxp[v]=mxp[v],mxp[v]=mxp[e[i].v]; } else if (mx[e[i].v]+e[i].d>smx[v]) { smx[v]=mx[e[i].v]+e[i].d,smxp[v]=mxp[e[i].v]; }}}bool del(int v){ bool flag=0; vis[v]=1; for(int i=first[v];i;i=e[i].next) if (!vis[e[i].v]){ if (del(e[i].v)) { e[i].d=-1; flag=1; }} if (v==mp||v==smp||flag) return 1; else return 0;}int main(){ scanf("%d%d",&n,&k); for(int i=1,a,b;i<n;i++) { scanf("%d%d",&a,&b);insert(a,b,1),insert(b,a,1); } dfs(1); int ans=0; for(int i=1;i<=n;i++) {if (mx[i]+smx[i]>ans){ mi=i; mp=mxp[i]; smp=smxp[i];}ans=max(ans,mx[i]+smx[i]); } if (k==1) printf("%d",2*(n-1)-ans+1); else { int basic=2*(n-1)-ans+1;ans=0;memset(vis,0,sizeof(vis)); del(mi);memset(vis,0,sizeof(vis));dfs(1);for(int i=1;i<=n;i++){ ans=max(ans,mx[i]+smx[i]);}printf("%d",basic-ans+1); } return 0;}
0 0
- 【APIO2010T2】巡逻-贪心+树形DP
- APIO2010 巡逻 树形DP
- 【bzoj1912】[Apio2010] patrol 巡逻 树形dp
- bzoj 1912 [Apio2010]patrol 巡逻 树形dp
- poj 1849 贪心 ||树形dp
- bzoj 1060(贪心+树形DP)
- 【Codeforces708C】【树形dp】【贪心】Centroids
- 51NOD1378 树形DP + 贪心
- BZOJ3037 创世纪 [贪心][树形DP]
- [BZOJ1912][Apio2010]patrol 巡逻(dfs+并查集+树形dp)
- HDU 4313 Matrix 贪心 || 树形dp
- hdu - 4313 - Matrix - 树形dp 或者 贪心
- spoj1435 - Vertex Cover(贪心or树形dp)
- poj 2057 树形DP+一点贪心
- Codeforces 77C 树形dp + 贪心
- 树形DP+贪心(乱搞)(HDU4714)
- hdu4313 贪心并查集 || 树形dp
- BZOJ 3829 Poi2014 FarmCraft 树形DP+贪心
- PL SQL删除对象语句
- Sqoop 加载数据到ORC表
- 图的遍历-深度优先遍历
- js预解析介绍
- 注释驱动的 Spring cache 缓存介绍
- 【APIO2010T2】巡逻-贪心+树形DP
- 移植Qt-4.8.5出现undefined reference to '__sync_sub_and_fetch_4'
- LOG的properties
- jquery判断两个数组中相同元素
- Jacobian
- Java基础之数组(2)
- 管道
- 关于Map集合的遍历方式
- tabletree table表格实现树状伸缩