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. List的isEmpty与==null的区别

    集合的判空一般判定方法 ArrayList<Person> list = null; System.out.println(null == list);//return true Syst ...

  2. 什么是electron

    Electron 是什么 定义 Electron是一个能让你使用传统前端技术(Nodejs, Javascript, HTML, CSS)开发一个跨平台桌面应用的框架.这里所说的桌面应用指的是在Win ...

  3. 三分钟了解 Python3 的异步 Web 框架 FastAPI

    快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...

  4. LintCode笔记 - 145.大小写转换 - 极简之道 - 最短代码

    这道题目一眼就能看出是送分题,当然在这里也不谈高难度的实现逻辑,肯定有同学会想直接用自带函数实现不就可以了吗? 对的,就是这么简单,然而今天的重点是如何把代码简写到最短. 本文章将带你把代码长度从 一 ...

  5. 《SpringBoot判空处理》接开@valid的面纱

    一.事有起因 我们在与前端交互的时候,一般会遇到字段格式校验及非空非null的校验,在没有SpringBoot注解的时候, 我们可能会在service进行处理: if(null == name){ t ...

  6. Django- 开发通用且万能的的权限框架组件

    本节内容 需求讨论 权限设计 代码设计 自定义权限钩子 业务场景分析 假设我们在开发一个培训机构的 客户关系管理系统,系统分客户管理.学员管理.教学管理3个大模块,每个模块大体功能如下 客户管理销售人 ...

  7. 5分钟带你快速入门和了解 OAM Kubernetes

    什么是 OAM? OAM 的全称为开放应用模型(Open Application Model),由阿里巴巴宣布联合微软共同推出. OAM 解决了什么问题? OAM 本质是为了解耦K8S中现存的形形色色 ...

  8. [斯坦福大学2014机器学习教程笔记]第六章-决策界限(decision boundary)

    这一节主要介绍的是决策界限(decision boundary)的概念,这个概念可以帮组我们更好地理解逻辑回归的假设函数在计算什么. 首先回忆一下上次写的公式. 现在让我们进一步了解这个假设函数在什么 ...

  9. python也能玩视频剪辑!moviepy操作记录总结

    前几篇文章咱们介绍了一下图片的处理方式,今天咱们说说视频的处理.python能够支持视频的处理么?当然是肯定的,人生苦读,我用python.万物皆可python. moviepy库安装 今天咱们需要使 ...

  10. 日志套餐篇 - log4j2 logback全量套餐

    日志套餐篇 - log4j2 logback全量套餐 前情提要: Log4j Log4j2 logback是当下主流的日志框架 slf4j则是新一代的日志框架接口,logback直接实现了slf4j接 ...