原来的代码(#5 WA read 5, expected 4):
#include <iostream>
#define Max(a,b) (a)>(b)?(a):(b)
using namespace std;
int const maxn=1e4+3;
struct node{
int c,d,fa;
}a[maxn];
int n,m,w,u,v,f[maxn];
int Find(int x){
if(a[x].fa==x) return x;
return a[x].fa=Find(a[x].fa);
}
void join(int x,int y){
int fx=Find(x),fy=Find(y);
if(fx!=fy) a[fx].fa=fy,a[fy].c+=a[fx].c,a[fy].d+=a[fx].d;
}
int main(){
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;i++) a[i].fa=i,scanf("%d%d",&a[i].c,&a[i].d);
for(int i=1;i<=m;i++) scanf("%d%d",&u,&v),join(u,v);
for(int i=1;i<=n;i++)
for(int j=w;j>=a[Find(i)].c;j--)
f[j]=Max(f[j],f[j-a[Find(i)].c]+a[Find(i)].d);
printf("%d",f[w]);
return 0;
}
后来的代码:
#include <iostream>
#define Max(a,b) (a)>(b)?(a):(b)
using namespace std;
int const maxn=1e4+3;
struct node{
int c,d,fa;
}a[maxn];
int n,m,w,u,v,f[maxn];
int Find(int x){
if(a[x].fa==x) return x;
return a[x].fa=Find(a[x].fa);
}
void join(int x,int y){
int fx=Find(x),fy=Find(y);
if(fx!=fy) a[fx].fa=fy,a[fy].c+=a[fx].c,a[fy].d+=a[fx].d;
}
int main(){
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;i++) a[i].fa=i,scanf("%d%d",&a[i].c,&a[i].d);
for(int i=1;i<=m;i++) scanf("%d%d",&u,&v),join(u,v);
for(int i=1;i<=n;i++){
if(a[i].fa!=i) continue;//这里加了一句话
for(int j=w;j>=a[Find(i)].c;j--)
f[j]=Max(f[j],f[j-a[Find(i)].c]+a[Find(i)].d);
}
printf("%d",f[w]);
return 0;
}
求解答