为什么数组开小了会WA而不是RE
查看原帖
为什么数组开小了会WA而不是RE
737158
yszkddzyh楼主2023/1/23 11:54

rt,提交记录,3WA,3RE,用的克鲁斯卡尔

原来的代码:

#include <iostream>
#include <algorithm>
#define ll long long
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int maxn=2e3+1,maxm=3e3+1,inf=1e9+1;
struct node{
	int be,to,nxt,w;
	node():w(inf){}
	friend bool operator<(const node a,const node b){return a.w<b.w;}
}e[maxm];
int n,m,u,v,w,tot,sum,fa[maxn],head[maxn];
ll ans;
void link(int x,int y,int z){
	e[++tot].be=x;
	e[tot].to=y;
	e[tot].w=Min(e[tot].w,z);
	e[tot].nxt=head[x];
	head[x]=tot;
}
int Find(int x){
	if(x==fa[x]) return x;
	return fa[x]=Find(fa[x]);
}
void Union(int x,int y){
	int fx=Find(x),fy=Find(y);
	if(fx!=fy) fa[fx]=fy;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++) scanf("%d%d%d",&u,&v,&w),link(u,v,w);
	sort(e+1,e+m+1);
	for(int i=1;i<=m&&sum<n-1;i++)
		if(Find(e[i].be)!=Find(e[i].to))
			Union(e[i].be,e[i].to),sum++,ans+=e[i].w;
	if(sum!=n-1) printf("orz");
	else printf("%lld",ans);
	return 0;
}

后来的代码:

#include <iostream>
#include <algorithm>
#define ll long long
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int maxn=5e3+1,maxm=2e5+1,inf=1e9+1;
struct node{
	int be,to,nxt,w;
	node():w(inf){}
	friend bool operator<(const node a,const node b){return a.w<b.w;}
}e[maxm];
int n,m,u,v,w,tot,sum,fa[maxn],head[maxn];
ll ans;
void link(int x,int y,int z){
	e[++tot].be=x;
	e[tot].to=y;
	e[tot].w=Min(e[tot].w,z);
	e[tot].nxt=head[x];
	head[x]=tot;
}
int Find(int x){
	if(x==fa[x]) return x;
	return fa[x]=Find(fa[x]);
}
void Union(int x,int y){
	int fx=Find(x),fy=Find(y);
	if(fx!=fy) fa[fx]=fy;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++) scanf("%d%d%d",&u,&v,&w),link(u,v,w);
	sort(e+1,e+m+1);
	for(int i=1;i<=m&&sum<n-1;i++)
		if(Find(e[i].be)!=Find(e[i].to))
			Union(e[i].be,e[i].to),sum++,ans+=e[i].w;
	if(sum!=n-1) printf("orz");
	else printf("%lld",ans);
	return 0;
}
2023/1/23 11:54
加载中...