LUOGU P1453 城市环路(基环树+dp)
解题思路
一道基环树上$dp$的题,这种题比较套路吧,首先第一遍$dfs$把环找出来,然后对于环上的每一个点都向它子树内做一次树形$dp$,$f[i][0/1]$表示到了$i$这个点选或不选的最大值,转移和没有上司的舞会那道题差不多,就是求一个带权最大独立集。然后再在环上做一次树形$dp$,$g[i][0/1][0/1]$表示以$i$为根的子树中$i$选不选,最后一维记录的是起始节点选不选,因为终止节点和起始节点只能选一个,然后就胡乱$dp$一下。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector> using namespace std;
const int MAXN = ; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
} int n,p[MAXN],head[MAXN],cnt,end;
int to[MAXN<<],nxt[MAXN<<],stk[MAXN],top;
double f[MAXN][],ans,g[MAXN][][],k;
bool vis[MAXN],b[MAXN],flag,in[MAXN];
vector<int> v; inline void add(int bg,int ed){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt;
} void dfs(int x,int fa){
if(b[x]) {
while(stk[top]!=x){
v.push_back(stk[top]);
vis[stk[top]]=;top--;
}
v.push_back(x);
vis[x]=;flag=;
return ;
}
b[x]=;stk[++top]=x;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(u==fa) continue;
dfs(u,x);if(flag) return;
top--;b[u]=;
}
} void dp_l(int x,int fa){
f[x][]=p[x]*k;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(u==fa || vis[u]) continue;
dp_l(u,x);
f[x][]+=f[u][];
f[x][]+=max(f[u][],f[u][]);
}
} void dp_h(int x,int fa){
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(!vis[u] || u==fa) continue;
if(in[u]) {end=x;g[x][][]=f[x][];g[x][][]=f[x][];return;}
in[u]=;dp_h(u,x);
if(u==end) {
g[x][][]=g[u][][]+f[x][];
g[x][][]=g[u][][]+f[x][];
g[x][][]=g[u][][]+f[x][];
}
else {
g[x][][]=max(g[u][][],g[u][][])+f[x][];
g[x][][]=g[u][][]+f[x][];
g[x][][]=max(g[u][][],g[u][][])+f[x][];
g[x][][]=g[u][][]+f[x][];
}
if(end) return;
}
} int main(){
n=rd();int x,y;
for(int i=;i<=n;i++) p[i]=rd();
for(int i=;i<=n;i++){
x=rd()+,y=rd()+;
add(x,y),add(y,x);
}
scanf("%lf",&k);
dfs(,);
vector<int>::iterator it=v.begin();int S=*it;
for(;it<v.end();it++) dp_l(*it,);in[S]=;
dp_h(S,);ans=max(max(g[S][][],g[S][][]),g[S][][]);
printf("%.1lf",ans);
return ;
}
LUOGU P1453 城市环路(基环树+dp)的更多相关文章
- 洛谷 P1453 城市环路 ( 基环树树形dp )
题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...
- luogu P1453 城市环路
题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...
- [bzoj2878][Noi2012]迷失游乐园(基环树dp)
[bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...
- bzoj1791[IOI2008]Island岛屿(基环树+DP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...
- 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在 ...
- BZOJ1040:骑士(基环树DP)
Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...
- 基环树DP
基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...
- BZOJ3037 创世纪[基环树DP]
实际上基环树DP的名字是假的.. 这个限制关系可以看成每个点有一条出边,所以就是一个内向基环树森林. 找出每个基环树的环,然后对于树的部分,做DP,设状态选或不选为$f_{x,0/1}$,则 $f_{ ...
- [CSP-S模拟测试]:卡常题/b(基环树+DP)
题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...
随机推荐
- 《DSP using MATLAB》Problem 8.46
下雨了,大风降温,一地树叶,终于进入冬季了 代码: %% ----------------------------------------------------------------------- ...
- !!!myeclipse 上加载本地图片问题,无法加载问题
出现无法加载本地图片的问题, 原因就是把图片放到了本地项目中的image了,但是myeclipse上没有刷新 这样以后 本地的图片比在线的要快 低级错误,诶!
- licecap图片区域问题
之前一直好用的licecap最近突然没法用了,结果发现是屏幕分辨率的文本大小的问题,因为选了特大的.发现制作成的gif图片的区域有问题.后来改回中等的,就可以了.
- Spring Cloud Eureka 注册安全一定要做到位!
/eureka/ 参考配置如下: defaultZone: http://javastack:javastack@eureka1:8761/eureka/, http://javastack:java ...
- OC开发系列-成员变量的作用域
成员变量的作用域 OC中成员变量有四种作用域,同时每一种作用域对应着响应的关键字. * @private:自能在当前类的实现@implementation中访问 * @protected: 可以在当前 ...
- 2018-10-8-3分钟教你搭建-gitea-在-Centos-服务器
title author date CreateTime categories 3分钟教你搭建 gitea 在 Centos 服务器 lindexi 2018-10-08 09:54:39 +0800 ...
- Hive中SQL查询转换成MapReduce作业的过程
- VBA文件对话框的应用(VBA打开文件、VBA选择文件、VBA选择文件夹)
在VBA中经常要用到文件对话框来进行打开文件.选择文件或选择文件夹的操作.用Microsoft Office提供的文件对话框比较方便.用法如下Application.FileDialog(fileDi ...
- CF421D Bug in Code
题意:n个人每人选择了另外不相同的两个人.问有多少对(x,y)使得这n个人中至少有p个选择了至少其中之一? 标程:那就不写了吧. 题解:容斥 统计Ax表示有多少个人选择了x. 一般来说有Ax+Ay&g ...
- c# 给文件/文件夹 管理用户权限
public class PermissionManager { /// <summary> /// 为文件添加users,everyone用户组的完全控制权限 /// </summ ...