传送门

解题思路

一道基环树上$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)的更多相关文章

  1. 洛谷 P1453 城市环路 ( 基环树树形dp )

    题目链接 题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域--城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市 ...

  2. luogu P1453 城市环路

    题目描述 整个城市可以看做一个N个点,N条边的单圈图(保证图连通),唯一的环便是绕城的环路.保证环上任意两点有且只有2条路径互通.图中的其它部分皆隶属城市郊区. 现在,有一位名叫Jim的同学想在B市开 ...

  3. [bzoj2878][Noi2012]迷失游乐园(基环树dp)

    [bzoj2878][Noi2012]迷失游乐园(基环树dp) bzoj luogu 题意:一颗数或是基环树,随机从某个点开始一直走,不走已经到过的点,求无路可走时的路径长期望. 对于一棵树: 用两个 ...

  4. bzoj1791[IOI2008]Island岛屿(基环树+DP)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1791 题目大意:给你一棵n条边的基环树森林,要你求出所有基环树/树的直径之和.n< ...

  5. 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在 ...

  6. BZOJ1040:骑士(基环树DP)

    Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中 ...

  7. 基环树DP

    基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...

  8. BZOJ3037 创世纪[基环树DP]

    实际上基环树DP的名字是假的.. 这个限制关系可以看成每个点有一条出边,所以就是一个内向基环树森林. 找出每个基环树的环,然后对于树的部分,做DP,设状态选或不选为$f_{x,0/1}$,则 $f_{ ...

  9. [CSP-S模拟测试]:卡常题/b(基环树+DP)

    题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...

随机推荐

  1. mybatis 3 批量插入返回主键 Parameter 'id' not found

    @Insert("<script>INSERT INTO scp_activity_gift (activity_id,type,gift_id,status,limit_num ...

  2. jquery网页定位导航特效

    <!DOCTYPE html> <html lang="en"> <head> <script src="http://code ...

  3. QTP,自己主动化測试学习笔记,六月九号

    測试自己主动化实现的两个难点设计--功能分解 实现--对象的识别 測试自己主动化实现的两个难点-功能分解 清晰画出业务流程图 依据业务流程分解业务功能.能够被复用的功能也要被分解出来. 依照路径覆盖的 ...

  4. Visual Studio Git代码管理环境部署

    Visual Studio 2010 部署Git代码管理环境. 第一:首先做Git的安装和环境部署 1.下载并安装Git软件,在windows环境下的Git叫做“msysGit”,官网地址为https ...

  5. Mybatis与Spring整合(CURD)

    项目采用Maven构建,用Junit进行测试,数据库是Mysql,连接池是c3p0,未测试缓存部分 1.Maven的“pom.xml”文件 <project xmlns="http:/ ...

  6. JAVA读取PROPERTIES文件方式一

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  7. js实现图片资源、blob、base64的各种场景转换

    文件转babase64 function getImgToBase64(url,callback){//将图片转换为Base64 var canvas = document.createElement ...

  8. 2019-10-9-dotnet-不申请额外数组空间合并多个只读数组列表

    title author date CreateTime categories dotnet 不申请额外数组空间合并多个只读数组列表 lindexi 2019-10-09 15:15:10 +0800 ...

  9. 【学术篇】一些水的不行的dp

    最近做了几道非常水非常水的dp...... 之后刷的一些水dp也会写在这里...... 此篇题目难度不递增!!! Emmmm....... 1.luogu1043数字游戏 以前看过这个题几遍,没做这个 ...

  10. Dubbo的服务请求失败怎么处理

    dubbo启动时默认有重试机制和超时机制. 超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败, 重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认 ...