B. Arpa’s weak amphitheater and Mehrdad’s valuable Hoses
并查集+ dp
#include <bits/stdc++.h>
using namespace std;
const int N = 1010 ;
int b[N] , w[N] , p[N] ,f[N];
int n , m, ww ;
int x , y ;
vector<int>ve[N] ;
int find(int x )
{
if(p[x] != x ) p[x] = find(p[x]) ;
return p[x] ;
}
int main()
{
cin>>n>>m>>ww;
for(int i = 1 ; i <= n ; i ++ ) cin>>w[i] ;
for(int i = 1 ; i <= n ; i ++ ) cin>>b[i] ;
for(int i = 1 ; i <= n ; i ++ ) p[i] =i ;
while(m -- )
{
cin>>x >>y;
int px = find(x) , py = find(y) ;
p[px] = py;
}
for(int i = 1 ; i <= n ; i ++ )
{
ve[find(i)].push_back(i) ;
}
for(int i = 1 ; i <= n ; i ++ )
{
if(find(i) != i ) continue ;
for(int j = ww ; j >= 0 ;j--)
{
int sum1 = 0 ,sum2 = 0 ;
for(auto k :ve[i])
{
sum1 += w[k] ;
sum2 += b[k] ;
if(j >= w[k]) f[j] = max(f[j] , f[j - w[k]]+ b[k] ) ;
}
if(j >= sum1 )
{
f[j] = max(f[j] , f[j - sum1] + sum2) ;
}
}
}
cout<<f[ww] <<endl;
return 0;
}