BZOJ2427: [HAOI2010]软件安装
2016-12-28 15:09
351 查看
题目链接
(注意:对于任意一颗子树,选不了根下面的就都不能选)。
(哎。。自己硬是把对的改成错的交了。。)
【分析】
既然相互有依赖关系,那么缩点之后,就得到若干点和森林,建立树根,连向每一个单点和入度为0的点。树形dp。(注意:对于任意一颗子树,选不了根下面的就都不能选)。
(哎。。自己硬是把对的改成错的交了。。)
【代码】
#include <cstdio> #include <iostream> #include <queue> #include <vector> #include <algorithm> #include <cstring> #include <cmath> #include <stack> #define N 1005 #define M 1005 #define INF 1000000000 using namespace std; typedef long long ll; typedef pair<ll,ll> pa; int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,ind,scc,cnt; int b[M],p ,nextedge[M]; int dfn ,low ,Belong ; int w ,v ,W ,V ,in ,dp[105][505]; bool Instack ; stack<int>st; vector<int>g ; void Add(int x,int y) { cnt++; b[cnt]=y; nextedge[cnt]=p[x]; p[x]=cnt; } void Input_Init() { n=read(),m=read(); for(int i=1;i<=n;i++) v[i]=read(); for(int i=1;i<=n;i++) w[i]=read(); for(int i=1;i<=n;i++) { static int x; x=read(); if(x) Add(x,i); } } void Tarjan(int x) { dfn[x]=low[x]=++ind; st.push(x);Instack[x]=1; for(int i=p[x];i;i=nextedge[i]) { int v=b[i]; if(!dfn[v]) { Tarjan(v); low[x]=min(low[x],low[v]); } else if(Instack[v]) low[x]=min(low[x],dfn[v]); } if(dfn[x]==low[x]) { scc++;int now=-1; while(now!=x) { now=st.top();st.pop(); Belong[now]=scc; Instack[now]=0; W[scc]+=w[now];V[scc]+=v[now]; } } } void Get_Scc(){ for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); } void Build_Graph() { for(int i=1;i<=n;i++) for(int j=p[i];j;j=nextedge[j]) { int v=b[j]; if(Belong[i]!=Belong[v]) g[Belong[i]].push_back(Belong[v]),in[Belong[v]]++; } for(int i=1;i<=scc;i++) if(!in[i]) g[scc+1].push_back(i); } void Tree_Dp(int x) { for(int i=V[x];i<=m;i++) dp[x][i]=W[x]; for(int i=0;i<g[x].size();i++) { int v=g[x][i]; Tree_Dp(v); for(int j=m;j>=V[x];j--) for(int k=V[x];k<=j;k++) dp[x][j]=max(dp[x][j],dp[v][j-k]+dp[x][k]); } } int main() { Input_Init(); Get_Scc(); Build_Graph(); Tree_Dp(scc+1); printf("%d\n",dp[scc+1][m]); return 0; }
相关文章推荐
- BZOJ 2427: [HAOI2010]软件安装|树形动规|tarjan
- 软件安装 [HAOI2010,Bzoj2427]
- |BZOJ 2427|树形DP|强连通分量|[HAOI2010]软件安装
- bzoj 2427: [HAOI2010]软件安装
- 【BZOJ2427】[HAOI2010]软件安装 Tarjan+树形背包
- BZOJ 2427 [HAOI2010]软件安装 Tarjan+树上动态规划
- 【bzoj2427】【HAOI2010】【软件安装】【缩点+dp】
- BZOJ 2427: [HAOI2010]软件安装
- BZOJ 2427 HAOI 2010 软件安装 Tarjan+树上DP
- bzoj 2427: [HAOI2010]软件安装
- bzoj2427: [HAOI2010]软件安装
- [bzoj2427][HAOI2010]软件安装 Tarjan+树形DP
- BZOJ 2427: [HAOI2010]软件安装 Tarjan缩点 + DP
- bzoj 2427 HAOI 2010 软件安装 (dp+tarjan缩点)
- BZOJ 2427: [HAOI2010]软件安装
- bzoj2427 [HAOI2010]软件安装 ( 树形背包 + tarjan )
- [HAOI2010][BZOJ2427] 软件安装|tarjan|树型dp
- bzoj 2427: [HAOI2010]软件安装(tarjan缩点+树形dp)
- 【BZOJ2427】【HAOI2010】软件安装
- [bzoj2427][HAOI2010]软件安装——强连通分量+树形DP