baim. • 4个月前
`#include
using namespace std;
int n,m; int P[N],M[N],L[N],tmp[SZ],h[SZ],f[N][105][SZ],g[SZ]; struct Edge {
int u,v,w,next;
}e[N*N]; int pos=1,head[N],in[N]; void addEdge(int u,int v,int w) {
e[++pos]={u,v,w,head[u]};
head[u]=pos;++in[v];
} void DP(int u) {
if(!head[u])
{
L[u]=min(L[u],m/M[u]);
for(int i=0; i<=L[u]; i++)
for(int j=i; j<=L[u]; j++)
f[u][i][j*M[u]]=(j-i)*P[u];
return;
}
L[u]=INF;
for(int i=head[u]; i; i=e[i].next)
{
int v=e[i].v; DP(v);
L[u]=min(L[u],L[v]/e[i].w);
M[u]+=e[i].w*M[v];
}
L[u]=min(L[u],m/M[u]);
for(int l=0; l<=L[u]; l++)
{
memset(g,0xc0,sizeof(g));
g[0]=0;
for(int i=head[u]; i; i=e[i].next)
{
int v=e[i].v,w=e[i].w;
for(int j=0; j<=m; j++)
tmp[j]=g[j],g[j]=-INF;
for(int j=0; j<=m; j++)
for(int k=0; tmp[j]>=0&&j+k<=m; k++)
g[j+k]=max(g[j+k],tmp[j]+f[v][l*w][k]);
}
for(int j=0; j<=l; j++)
for(int k=0; k<=m; k++)
f[u][j][k]=max(f[u][j][k],g[k]+(l-j)*P[u]);
}
} signed main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n >> m;
memset(f,0xc0,sizeof(f));
for(int i=1,l; i<=n; i++)
{
char ch;
cin >> P[i] >> ch;
if(ch=='A')
{
cin >> l;
for(int j=1,v,w; j<=l; j++)
cin >> v >> w,addEdge(i,v,w);
}
else cin >> M[i] >> L[i];
}
for(int u=1; u<=n; u++)
{
if(!in[u]) // 森林
{
DP(u);
for(int i=0; i<=m; i++)
tmp[i]=h[i],h[i]=0;
for(int i=0; i<=m; i++)
for(int j=0; i+j<=m; j++)
h[i+j]=max(h[i+j],tmp[i]+f[u][0][j]);
}
}
int res=-INF;
for(int i=0; i<=m; i++)
res=max(res,h[i]);
cout << res << '\n';
return 0;
}`
评论: