记录编号 343500 评测结果 AAAAAAAAAA
题目名称 搭配购买 最终得分 100
用户昵称 GravatarO(1) 是否通过 通过
代码语言 C++ 运行时间 0.758 s
提交时间 2016-11-09 12:58:18 内存使用 0.92 MiB
显示代码纯文本
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int pre[100001],w[100001],v[100001],c[100001];
int find(int x)
{
	int r=x;
	while(r!=pre[r])
	   r=pre[r];
	
	int i=x,j;
	while(i!=j)
	{
		j=pre[i];
		pre[i]=r;
		i=j;
	}
	return r;
}
void mix(int x,int y)
{
	int fx=find(x),fy=find(y);
	if(fx!=fy)
	{
		w[fy]+=w[fx];
		v[fy]+=v[fx];
		w[fx]=0;
		v[fx]=0;
		pre[fx]=fy;
	}
}
int main()
{
	ofstream fout("buy.out");
	ifstream fin("buy.in");
	int n,m,ww,i,j,k;
	fin>>n>>m>>ww;
	for(i=1;i<=n;i++)
	{
		fin>>w[i]>>v[i];
		pre[i]=i;
	}
	for(i=1;i<=m;i++)
	{
		fin>>j>>k;
		mix(j,k);
	}
	for(i=1;i<=n;i++)
	{
		if(v[i]==0)
		  continue;
		for(j=ww;j>=w[i];j--)
		  c[j]=max(c[j],c[j-w[i]]+v[i]);
	}
	fout<<c[ww]<<endl;
}