WA code:
#include <bits/stdc++.h>
using namespace std;
int fa[10005],c[10005],d[10005],dp[10005];//重量dp
int n,m,w,u,v;
inline void init()
{
for(int i=1;i<=10005;i++)
{
fa[i]=i;
}
}
inline int find_fa(int x)
{
if(fa[x]!=x) fa[x]=find_fa(fa[x]);
return fa[x];
}
inline void union_fa(int x,int y)
{
x=find_fa(x);
y=find_fa(y);
if(x!=y) fa[x]=y;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>w;
init();
for(int i=1;i<=n;i++)
{
cin>>c[i]>>d[i];
}
for(int i=1;i<=m;i++)
{
cin>>u>>v;
union_fa(u,v);
}
for(int i=1;i<=n;i++)
{
if(fa[i]!=i)
{
c[fa[i]]+=c[i];
d[fa[i]]+=d[i];
c[i]=d[i]=0;
}
}
for(int i=1;i<=n;i++)
{
if(c[i]==0 && d[i]==0) continue;
for(int j=w;j>=c[i];j--)
{
dp[j]=max(dp[j],dp[j-c[i]]+d[i]);
}
}
cout<<dp[w];
return 0;
}
AC code:
#include <bits/stdc++.h>
using namespace std;
int fa[10005],c[10005],d[10005],dp[10005];//重量dp
int n,m,w,u,v;
inline void init()
{
for(int i=1;i<=10005;i++)
{
fa[i]=i;
}
}
inline int find_fa(int x)
{
if(fa[x]!=x) fa[x]=find_fa(fa[x]);
return fa[x];
}
inline void union_fa(int x,int y)
{
x=find_fa(x);
y=find_fa(y);
if(x!=y) fa[x]=y;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>w;
init();
for(int i=1;i<=n;i++)
{
cin>>c[i]>>d[i];
}
for(int i=1;i<=m;i++)
{
cin>>u>>v;
union_fa(u,v);
}
for(int i=1;i<=n;i++)
{
if(fa[i]!=i)
{
c[find_fa(i)]+=c[i];//只改了此处
d[find_fa(i)]+=d[i];
c[i]=d[i]=0;
}
}
for(int i=1;i<=n;i++)
{
if(c[i]==0 && d[i]==0) continue;
for(int j=w;j>=c[i];j--)
{
dp[j]=max(dp[j],dp[j-c[i]]+d[i]);
}
}
cout<<dp[w];
return 0;
}
为什么两个不一样啊QAQ