记录编号 22307 评测结果 AAAAAAAAAA
题目名称 情敌 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.064 s
提交时间 2010-11-18 15:43:16 内存使用 9.57 MiB
显示代码纯文本
#include <stdio.h>

#define MAXN 55
#define MAXV 105
#define oo 0x7fffffff

typedef long long LL;

LL N,M,V1,V2,sum;
LL d[MAXN][MAXV][MAXV],dd[MAXN][MAXV][MAXV];
LL adj[MAXN][MAXN];
bool nen[MAXN];
LL w[MAXN],v[MAXN];
LL fo[MAXN];
LL tmp=0;

inline void add(const LL &a,const LL &b)
{
	adj[a][++adj[a][0]]=b;
	nen[b]=true;
}

inline void Max(LL &a,LL b)
{
	if (b>a) a=b;
}

inline void dp(LL u)
{
	for(LL j=0;j<v[u];j++)
		for(LL k=0;k<=V2;k++)
			d[u][j][k]=-oo;
	for(LL j=v[u];j<=V1;j++)
		for(LL k=0;k<=V2;k++)
			d[u][j][k]=d[fo[u]][j-v[u]][k]+w[u];
	for(LL k=1;k<=adj[u][0];k++)
	{
		LL i=adj[u][k];
		fo[i]=tmp;
		tmp=i;
		for(LL j=0;j<=V1;j++)
			for(LL k=0;k<=V2;k++)
			{
				d[i][j][k]=d[fo[i]][j][k];
				if (j>=v[i])
					Max(d[i][j][k],d[fo[i]][j-v[i]][k]+w[i]);
				if (k>=2*v[i])
					Max(d[i][j][k],d[fo[i]][j][k-2*v[i]]+w[i]);
			}
	}	
	for(LL j=0;j<=V1;j++)
		for(LL k=0;k<=2*v[u];k++)
			dd[u][j][k]=-oo;
	for(LL j=0;j<=V1;j++)
		for(LL k=v[u]*2;k<=V2;k++)
			dd[u][j][k]=d[fo[u]][j][k-v[u]*2]+w[u];
	for(LL k=1;k<=adj[u][0];k++)
	{
		LL i=adj[u][k];
		for(LL j=0;j<=V1;j++)
			for(LL k=0;k<=V2;k++)
			{
				dd[i][j][k]=dd[fo[i]][j][k];
				if (k>=2*v[i])
					Max(dd[i][j][k],dd[fo[i]][j][k-2*v[i]]+w[i]);
			}
	}
	for(LL j=0;j<=V1;j++)
		for(LL k=0;k<=V2;k++)
		{
			Max(d[u][j][k],d[tmp][j][k]);
			Max(d[u][j][k],d[fo[u]][j][k]);
			Max(d[u][j][k],dd[u][j][k]);
		}
}

int main()
{
	freopen("rival.in","r",stdin);
	freopen("rival.out","w",stdout);
	scanf("%lld%lld",&V1,&V2);
	scanf("%lld%lld",&N,&M);
	for(LL i=1;i<=N;i++)
	{
		scanf("%lld%lld",w+i,v+i);
		sum+=w[i];
	}
	for(LL i=0;i<M;i++)
	{
		LL c,tot;
		scanf("%lld%lld",&c,&tot);
		for(LL j=0;j<tot;j++)
		{
			LL x;
			scanf("%lld",&x);
			add(c,x);
		}
	}
	fo[1]=tmp;
	for(LL i=1;i<=N;i++)
		if (!nen[i]&&adj[i][0]==0)
		{
			fo[i]=tmp;
			tmp=i;
			for(LL j=0;j<=V1;j++)
				for(LL k=0;k<=V2;k++)
				{
					d[i][j][k]=d[fo[i]][j][k];
					if (j>=v[i])
						Max(d[i][j][k],d[fo[i]][j-v[i]][k]+w[i]);
					if (k>=2*v[i])
						Max(d[i][j][k],d[fo[i]][j][k-2*v[i]]+w[i]);
				}
		}
		else if (adj[i][0])
		{
			fo[i]=tmp;
			tmp=i;
			dp(i);
			tmp=i;
		}
	printf("%lld\n",sum-d[tmp][V1][V2]);
	return 0;
}