只做了很小的改动,90pts->100pts,求问为什么
查看原帖
只做了很小的改动,90pts->100pts,求问为什么
737158
yszkddzyh楼主2023/1/11 17:50

原来的代码(#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;
}

求解答

2023/1/11 17:50
加载中...