题目链接
题目思路
并查集构图,再用01背包解决
代码实现
#include<bits/stdc++.h>
using namespace std;
const int Max=1e6;
int n,m,c;
int fa[Max],dp[Max],cost[Max],value[Max];
void init()
{
for(int i=1;i<=n;i++)
fa[i]=i;
}
int find(int x)
{
if(fa[x]!=x)
{
fa[x]=find(fa[x]);
}
return fa[x];
}
void merge(int x,int y)
{
int fx=find(x),fy=find(y);
fa[find(x)]=fy;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m>>c;
init();
for(int i=2;i<=n;i++)
{
cin>>cost[i]>>value[i];
}
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
merge(u,v);
}
memset(dp,0,sizeof dp);
for(int i=2;i<=n;i++)
{
if(find(i)==find(1))
{
for(int j=c;j>=cost[i];j--)
dp[j]=max(dp[j],dp[j-cost[i]]+value[i]);
}
}
cout<<dp[c]<<endl;
}
}
京公网安备 11010502036488号