记录编号 |
318637 |
评测结果 |
AAAAAAAAAA |
题目名称 |
搭配购买 |
最终得分 |
100 |
用户昵称 |
Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.261 s |
提交时间 |
2016-10-09 19:27:33 |
内存使用 |
0.54 MiB |
显示代码纯文本
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<cstdlib>
#define Begin freopen("buy.in","r",stdin);freopen("buy.out","w",stdout);
#define End fclose(stdin);fclose(stdout);
using namespace std;
const int maxn=15000;
int n,m,tot,w[maxn],v[maxn],root[maxn],f[maxn];
void Init();
int Findroot(int x){
if(root[x]!=x)root[x]=Findroot(root[x]);
return root[x];
}
int main(){
Begin;
Init();
//system("pause");
return 0;
}
void Init(){
scanf("%d%d%d",&n,&m,&tot);
for(int i=1;i<=n;i++){
root[i]=i;scanf("%d%d",&w[i],&v[i]);
}
int cnt=0;
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
int rx=Findroot(x),ry=Findroot(y);
if(rx==ry)continue;
else {
if(rx>ry)swap(rx,ry);
root[ry]=rx;
w[rx]+=w[ry];v[rx]+=v[ry];
w[ry]=0;v[ry]=0;
}
}
for(int i=1;i<=n;i++){
if(w[i]==0)continue;
for(int j=tot;j>=w[i];j--){
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
printf("%d\n",f[tot]);
}