LINK:城市规划

以前ls 让写的时候由于看不懂题目+以为在图中的环上dp非常困难所以放弃治疗了。

现在终于能把题目看懂了 泪目...

题目其实就是在说 给出一张图这个有一个非常好的性质 满足每个点都最多存在于一个无向边组成的环中。

这种图可以称之为仙人掌 但是比仙人掌的性质还要好 不仅只满足每条边最多在一个环中 每个点也在一个环中。

题目是想让在图中占领一些点 使得其周围的点都不能再被占领 且这些点的相邻点也不能被占领。

比独立集的要求要严格一点。每个点都有权值 求使得占领点的权值和最大值。

还是考虑dp.

f[i][j]表示以i这个点0自己没被占领儿子也没被占领 1表示自己被占领了 2表示儿子被占领的最大值.

考虑在环上的时候发现和其他环外部的点没有任何影响 所以直接在换上dp即可。

考虑 如果是仙人掌上呢 可以发现和这种图情况一模一样 不过把一个点下方吊的环变成了点罢了。

所以可以发现这种dp适用于 仙人掌图 而不仅限于题中给的条件。

没想到这道题还挺奇葩 转移没有想象中那么简单。

考虑f[x][2]的转移 发现只能有一个儿子占 且这个儿子在转移的时候还可以轮换。

这在环上dp的时候是要分类讨论一大堆的。

但是 题解区给出了一个非常简明的分类讨论。

设calc(l,r)表示l和r都不选的最大值 这个东西也很好做 然后依靠这个东西我们可以很简便的分类讨论出来很多东西。

这里我强行使用了题目中的性质 这个代码并不适用于仙人掌图 如果想的话可以加以修改得以适应。

const int MAXN=1000010;
int n,m,top,len,cnt,sum,ans;
int f[MAXN][3],g[MAXN][3],v[MAXN];
int a[MAXN],dfn[MAXN],b[MAXN],s[MAXN],low[MAXN],w[MAXN];
int lin[MAXN],ver[MAXN<<2],nex[MAXN<<2];
inline void add(int x,int y)
{
ver[++len]=y;
nex[len]=lin[x];
lin[x]=len;
}
inline int calc(int l,int r)//l 和 r 不能选的最大值.
{
if(l>r)return 0;
g[l-1][0]=-INF;g[l-1][1]=g[l-1][2]=0;
rep(l,r,i)
{
g[i][0]=max(g[i-1][0],g[i-1][2])+f[b[i]][0];
g[i][1]=f[b[i]][1]+g[i-1][0];
g[i][2]=max(f[b[i]][0]+g[i-1][1],f[b[i]][2]+max(g[i-1][0],g[i-1][2]));
}
return max(g[r][0],g[r][2]);
}
inline void solve(int x)//处理环
{
f[x][2]=max(f[x][2]+calc(2,sum),f[x][0]+f[b[2]][1]+f[b[3]][0]+calc(4,sum));
f[x][2]=max(f[x][2],f[x][0]+f[b[sum]][1]+f[b[sum-1]][0]+calc(2,sum-2));
f[x][1]=f[x][1]+f[b[2]][0]+f[b[sum]][0]+calc(3,sum-1);//calc(3,sum-1);
f[x][0]+=calc(2,sum);
}
inline void dfs(int x,int fa)
{
dfn[x]=low[x]=++cnt;v[x]=fa;
s[++top]=x;f[x][1]=a[x];
int ww=0,cc=0;
go(x)
{
if(!dfn[tn])
{
dfs(tn,x);
low[x]=min(low[x],low[tn]);
if(low[tn]==dfn[x])cc=tn;
if(low[tn]>dfn[x])
{
f[x][0]+=max(f[tn][0],f[tn][2]);
f[x][1]+=f[tn][0];
ww=max(ww,f[tn][1]-max(f[tn][0],f[tn][2]));
}
}else if(v[x]!=tn)low[x]=min(low[x],dfn[tn]);
}
f[x][2]=f[x][0]+ww;
if(cc)
{
int y=0;sum=0;
b[++sum]=x;
while(y!=cc)
{
y=s[top--];
b[++sum]=y;
}
solve(x);
}
if(low[x]>dfn[v[x]])--top;
}
int main()
{
freopen("1.in","r",stdin);
get(n);get(m);
rep(1,n,i)get(a[i]);
rep(1,m,i){int get(x);int get(y);add(x,y);add(y,x);}
rep(1,n,i)if(!dfn[i])dfs(i,0),ans+=max(f[i][0],max(f[i][1],f[i][2]));
put(ans);return 0;
}

环上分类讨论dp好题~!

luogu 2478 [SDOI2010]城市规划 仙人掌上dp.的更多相关文章

  1. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)

    题目链接 类似求树的直径,可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链.次长链,用每个点子节点不同子树的 max{最长链}+max{次长链} 更新答案.(不需要存次长链,求解过 ...

  2. bzoj 1023: [SHOI2008]cactus仙人掌图 2125: 最短路 4728: 挪威的森林 静态仙人掌上路径长度的维护系列

    %%% http://immortalco.blog.uoj.ac/blog/1955 一个通用的写法是建树,对每个环建一个新点,去掉环上的边,原先环上每个点到新点连边,边权为点到环根的最短/长路长度 ...

  3. Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)

    Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流) Description 10年一度的银河系赛车大赛又要开始了.作为全 ...

  4. [正经分析] DAG上dp两种做法的区别——拓扑序与SPFA

    在下最近刷了几道DAG图上dp的题目. 要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点. 第二道是洛谷上的NOI导刊题目<最长路 ...

  5. bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp

    一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...

  6. DAG上dp思想

    DAG上DP的思想 在下最近刷了几道DAG图上dp的题目.要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点.第二道是洛谷上的NOI导刊题 ...

  7. zoj1232Adventure of Super Mario(图上dp)

    题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成 ...

  8. 从《彩色圆环》一题探讨一类环上dp的解法

    清橙A1202 bzoj2201 bsoj4074 试题来源 2010中国国家集训队命题答辩 问题描述 小A喜欢收集宝物.一天他得到了一个圆环,圆环上有N颗彩色宝石,闪闪发光.小A很爱惜这个圆环,天天 ...

  9. BZOJ 1023: [SHOI2008]cactus仙人掌图 | 在仙人掌上跑DP

    题目: 求仙人掌直径 http://www.lydsy.com/JudgeOnline/problem.php?id=1023 题解: 首先给出仙人掌的定义:满足所有的边至多在一个环上的无向联通图 我 ...

随机推荐

  1. CentOS7下安装和配置SVN

    1. 由于是在CentOS7最小化安装的操作系统环境安装SVN,我们首先排除一些环境因素.在此首先关闭了防火墙,安装了vim文本编辑工具.   2. 使用yum install -y subversi ...

  2. 关于Pop!_OS 19.04有线网络始终正在连接

    一开始使用Pop!_OS时就遇到这个问题,开机进入系统后明明网络没问题,WiFi正常可用, 但是插入网线后有线网络始终显示正在连接,然后可能过一会儿还会弹出来网络激活失败. 但是有可能在使用很久之后再 ...

  3. Linux系统中到底应该怎么理解系统的平均负载

    02 | 基础篇:到底应该怎么理解“平均负载”? 每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况.比如像下面这样,我在命令行里输入了 upt ...

  4. Maven 专题(九):后记

    尚硅谷视频链接:https://www.bilibili.com/video/av84877781/看视频的时候,根据自己的需要,访问量多的不一定是好的,适合自己的才是最好的,总的来说,尚硅谷的视频质 ...

  5. 从零搭建Spring Cloud Gateway网关(三)——报文结构转换

    背景 作为网关,有些时候可能报文的结构并不符合前端或者某些服务的需求,或者因为某些原因,其他服务修改报文结构特别麻烦.或者需要修改的地方特别多,这个时候就需要走网关单独转换一次. 实现 话不多说,直接 ...

  6. bzoj4318OSU!*

    bzoj4318OSU! 题意: 一个长度为n的序列,每个元素有一定概率是1,不是1就是0.连续x个1可以贡献x^3的分数,问期望分数. 题解: 期望dp.f1[i]表示连续到i的期望长度,f2[i] ...

  7. HTTP版本比较

    HTTP2.0优势 1.采用二进制格式传输数据,而非http1.1文本格式,二进制格式在协议的解析和优化扩展上带来了跟多的优势和可能 2.对消息头采用Hpack进行压缩传输,能够节省消息头占用的网络流 ...

  8. C#/VB.NET 在Word中添加条码、二维码

    本文介绍如何通过C# 和VB.NET代码实现在Word文档中添加条码和二维码.代码中将分为在Word正文段落中.页眉页脚中等情况来添加. 使用工具:Free Spire.Office for .NET ...

  9. java opencsv解析csv文件

    记一次使用opencsv解析csv文件时碰到的坑 最近在开发过程中需要解析csv文件,公司用的解析工具是opencsv,在根据opencsv的官方文档去解析时发现csv文件中含有繁体字,使用其自带的C ...

  10. 转载 npm 安装vue出现的问题

    npm  安装 vue或者express  出现 npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATUREnpm ERR! errno UNABLE_TO_VERIF ...