题意:我有一个n个点,m条边的无向图,第i个点建立一个旅游站点的费用是c_i。特别地,这张图中的任意两点间不存在节点数超过10的简单路径。
为了把一切都做得完善,为了使我感到不那么孤独,我想要建造一些旅游站点使得每个点要么建立了旅游站点,要么与它有边直接相连的点里至少有一个点建立了旅游站点。我还希望这个建造方案总花费尽量少。
请求出这个花费。

czy大爷出的好题。
考场上有正解方向的想法,细节一脸懵逼。
首先15分的暴力DP(保证都是树)的思路可以应用到正解中。
10保证了每个连通块的最大深度不超过10,那么可以状压。
如同暴力DP一样,我们设0/1/2表示这个点未被覆盖/已被覆盖未选/已选。
然后考虑如何处理返祖边。
按照欧拉序遍历每个连通块,对于当前点x,枚举到状态s,考虑他的方案。

假如x不选择,那么如果x的祖先(包括他的父亲)有返祖边和他相连且状态为2,那么就可以转移到状态s+3dep[x]−1s+3^{dep[x]-1}含义是把x这个位置变为1.
否则就只能转移到状态s。

假如选择x,考虑返祖边,对于他的祖先(不包括他的父亲,或者说要单独拿出来处理),x状态肯定为2,他的祖先的状态也会因此而改变,原来为0的就会变成1.
这个地方单独记录一个ss表示选择以后他的祖先的状态改变,这里标解的实现非常巧妙,就是用一个桶来记录他的祖先状态,感觉非常perfect。
然后最后遍历他的儿子,注意到儿子会改变祖先的状态,所以我们在处理完他的子树以后要重新计算f,这里就很简单了。
f[x][s]=min(f[x][s+3dep[x]−1∗2],f[x][s+3dep[x]−1∗1])f[x][s]=min(f[x][s+3^{dep[x]-1}*2],f[x][s+3^{dep[x]-1}*1])
表示当前点选或者不选。
答案就是min(f[root][1],f[root][2])min(f[root][1],f[root][2]).
最后注意一下边界,那些地方是dep[x],那些地方是dep[x]-1,考虑一下要不要枚举父亲即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e5+5;
int n,m;
const int inf=0x3f3f3f3f;
const int M=6e4+5;
bool vis[N];
int head[N],next[N],go[N],ans;
int f[2][M],c[N],bin[20],fa[N],dep[N];
inline void pre(int x)
{vis[x]=1;dep[x]=dep[fa[x]]+1;for(int i=head[x];i;i=next[i]){int v=go[i];if (!vis[v]){fa[v]=x;pre(v);}}
}
int tot;
inline void add(int x,int y)
{go[++tot]=y;next[tot]=head[x];head[x]=tot;
}
inline void dfs(int x)
{int now=dep[x]&1;bool flag[12];memset(flag,0,sizeof(flag));for(int i=head[x];i;i=next[i]){int v=go[i];if (dep[v]<dep[x])flag[dep[v]-1]=1;}fo(i,0,bin[dep[x]])f[now][i]=inf;fo(s,0,bin[dep[x]-1]-1){if (f[now^1][s]>=inf)continue;int ss=s+1*bin[dep[x]-1]; bool bz=0;fo(i,0,dep[x]-2){if (flag[i]){if (!(ss/bin[i]%3))ss=ss+bin[i]*2;if ((s/bin[i]%3)==1)bz=1;}}f[now][ss]=min(f[now][ss],f[now^1][s]+c[x]);f[now][s+bin[dep[x]-1]*2*bz]=f[now^1][s];}for(int i=head[x];i;i=next[i]){int v=go[i];if (fa[v]==x){dfs(v);fo(s,0,bin[dep[x]]-1)f[now][s]=min(f[now^1][s+1*bin[dep[x]]],f[now^1][s+2*bin[dep[x]]]);}}
}
int main()
{freopen("absurdity.in","r",stdin);freopen("absurdity.out","w",stdout);scanf("%d%d",&n,&m);bin[0]=1;fo(i,1,11)bin[i]=bin[i-1]*3;fo(i,1,n)scanf("%d",&c[i]);fo(i,1,m){int x,y;scanf("%d%d",&x,&y);add(x,y),add(y,x);}int ans=0;fo(i,1,n){if (!vis[i]){fa[i]=i;pre(i);memset(f,0x3f,sizeof(f));f[0][0]=0;dfs(i);ans+=min(f[1][1],f[1][2]);}}printf("%d\n",ans);
}

JZOJ5442【NOIP2017提高A组冲刺11.1】荒诞 三进制状压+欧拉序相关推荐

  1. [JZOJ5459]【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

  2. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  3. jzoj_5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  4. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  5. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  6. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  7. JZOJ5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  8. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

  9. JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章

    Description nodgd写了一篇文章,自认为这是一篇好文章.nodgd的文章由n个小写英文字母组成.文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数.nodgd在文 ...

  10. JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书

    Description Pulumi生活在P城的角落,而他的朋友们gjdy,oyski,tutuwai等等生活在P城的靠中心位置. P城很大,但它拥有优秀的城市结构,同时P城重视文化教育的发展,P城共 ...

最新文章

  1. Activity管理(一):activity运行机制
  2. esnext:最后一个参数后面也允许加逗号了
  3. Struts2+Spring详解
  4. windows api 枚举进程pid
  5. php获取当前时间戳方法
  6. Delete带有子查询的sql优化,改为innerJoin解决
  7. java entitybuilder_Java MultipartEntityBuilder.setContentType方法代码示例
  8. 期末作业面向对象程序设计(Java)“猜拳游戏”
  9. Matlab之isprime与find函数
  10. 两步完成druid数据库连接池的密文配置
  11. Android:执行exec app_process启动jar失败原因
  12. 21条黄金法则,全面提升你的领导力
  13. php模板地图修改,让你一个地图拥有全部资源的修改方法
  14. 什么是区块链----概念
  15. Siri怎么重置主人声音
  16. 济宁商业学校计算机,济宁商业学校2021年招生录取分数线
  17. Cloudera Manager 5.14.X 安装部署(上)
  18. 去掉QQ迷你新闻的方法
  19. leetcode-1109. 航班预订统计(C++|差分)
  20. 气象数据的常用格式以及处理的工具

热门文章

  1. canvas 实现截图功能——截取图片的一部分
  2. 【C语言学习】————操作符、关键字
  3. 《自然语言处理实战:利用Python理解、分析和生成文本》读书笔记:第1章 NLP概述
  4. java做2048_java版实现2048游戏功能
  5. SNF快速开发平台--规则引擎介绍和使用文档
  6. Backbone Events 源码笔记
  7. NoteBook / 期货及衍生品基础(5)
  8. PHP获取以毫秒级为单位获取当前时间
  9. 使用Lens管理多云Kubernetes
  10. Android Ibeacon 算法,iBeacon定位算法