代码如下:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n,m,w,a,b,bp[114514],ans;
struct CLOUDE{
int co,vl,plc;
}cl[114514],cld[114514],qp;
vector<int>con[114514];
queue<CLOUDE>q;
bool f[114514];
int main() {
cin >>n>>m>>w;
for(int i=1;i<=n;i++)cin >>cl[i].co >>cl[i].vl ;
for(int i=1;i<=m;i++){
cin >>a>>b;
con[a].push_back(b);
con[b].push_back(a);
}
for(int i=1;i<=n;i++){
cl[i].plc =i;
cld[i].plc =i;
}
for(int i=1;i<=n;i++){
qp.co =cl[i].co ,qp.vl =cl[i].vl ,qp.plc =cl[i].plc ,
q.push(qp);
for(int j=1;j<=n;j++)f[j]=false;
while(!q.empty()){
int cst=q.front().co,val=q.front().vl,pl=q.front().plc;
q.pop();
if(f[pl])continue;
f[pl]=true;
cld[i].co +=cst;
cld[i].vl +=val;
for(int j=0;j<con[pl].size();j++)q.push(cl[con[pl][j]]);
}
}
for(int k=1;k<=n;k++)
for(int i=w;i>=cld[k].co;i--)
bp[i]=max(bp[i],bp[i-cld[k].co ]+cld[k].vl );
ans=bp[1];
for(int i=2;i<=w;i++)ans=max(ans,bp[i]);
cout <<ans<<endl;
return 0;
}