您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: