记录编号 108499 评测结果 AAAAAAAAAA
题目名称 机器人搬运 最终得分 100
用户昵称 Gravatar→震世逆空波→ 是否通过 通过
代码语言 C++ 运行时间 0.034 s
提交时间 2014-07-04 20:34:46 内存使用 4.13 MiB
显示代码纯文本
#include <cstring>
#include <cstdio>

const int max_n=1001;

using namespace std;

int n,w0,k;
int a,b;
int p[max_n];//price 
int w[max_n];//weight 
int fa[max_n];//father 
int f[max_n];//f[w]值 
int t[max_n][max_n];//分组记录 

void in();
void out();
void Union(int x,int y);
void bag();
int find_f(int x);

int main()
{
	freopen("robots.in","r",stdin);
	freopen("robots.out","w",stdout);
	
	in();
	out();
	return 0;
}

void in()
{
	scanf("%d%d%d",&n,&w0,&k);
	for (int i = 1 ; i <= n ; i ++ )
	{
		scanf("%d%d",&p[i],&w[i]);
		fa[i]=i;
	}
	while( k -- )
	{
		scanf("%d%d",&a,&b);
		Union(a,b);
	}
	for (int i = 1;i<=n;i ++ )
	{
		a=find_f(i);
		t[a][++t[a][0]]=i;
	}
}

void out()
{
	bag();
	printf("%d\n",f[w0]);
}

void bag()
{
	for (int k = 1;k <= n;k ++ )
	{
		if (t[k][0] > 0)
		{
			for (int j = w0;j >= 0;j --)
			{
				for (int i = 1 ;i <= t[k][0];i ++ )
				{
					a = t[k][i];
					if (j>=w[a] && f[j]<f[j-w[a]]+p[a])
						f[j]=f[j-w[a]]+p[a];
				}
			}
		}
	}
}

void Union(int x,int y)
{
	int r1=find_f(x);
	int r2=find_f(y);
	if (r1 != r2) fa[r2]=r1;
}

int find_f(int x)
{
	if (fa[x] == x)return x;
	fa[x]=find_f(fa[x]);
	return fa[x];
}