ABC E 疑问
  • 板块学术版
  • 楼主george0929
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/7 21:53
  • 上次更新2024/12/8 10:04:24
查看原帖
ABC E 疑问
377969
george0929楼主2024/12/7 21:53

这两种写法有什么不同之处吗?为什么第一份 WA,第二份 AC?

1:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k;
int f[200005],cnta[200005],cntb[200005];
struct node{
	int u,v,w;
}e[200005];
bool cmp(node a,node b){
	return a.w<b.w;
}
int fd(int x){
	if(f[x]==x) return x;
	return f[x]=fd(f[x]);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		cin>>e[i].u>>e[i].v>>e[i].w;
	}
	for(int i=1;i<=k;i++){
		int x;
		cin>>x;
		cnta[x]++;
	}
	for(int i=1;i<=k;i++){
		int x;
		cin>>x;
		if(cnta[x]) assert(0);
		else cntb[x]++;
	}
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=n;i++) f[i]=i;
	int ans=0;
	for(int i=1;i<=m;i++){
		int x=fd(e[i].u),y=fd(e[i].v);
		if(x==y) continue;
		if(cnta[x]&&cnta[y]){
			cnta[x]+=cnta[y];
		}else if(cntb[x]&&cntb[y]){
			cntb[x]+=cntb[y];
		}else if(cnta[x]&&cntb[y]){
			int tmp=min(cnta[x],cntb[y]);
			ans+=tmp*e[i].w;
			if(cnta[x]>cntb[y]) cnta[x]-=cntb[y];
			else cntb[x]=cntb[y]-cnta[x],cnta[x]=0;
		}else{
			int tmp=min(cntb[x],cnta[y]);
			ans+=tmp*e[i].w;
			if(cntb[x]>cnta[y]) cntb[x]-=cnta[y];
			else cnta[x]=cnta[y]-cntb[x],cntb[x]=0;
		}
		f[y]=x;
	}
	cout<<ans;
	return 0;
} 

2:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k;
int f[200005],cnta[200005],cntb[200005];
struct node{
	int u,v,w;
}e[200005];
bool cmp(node a,node b){
	return a.w<b.w;
}
int fd(int x){
	if(f[x]==x) return x;
	return f[x]=fd(f[x]);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		cin>>e[i].u>>e[i].v>>e[i].w;
	}
	for(int i=1;i<=k;i++){
		int x;
		cin>>x;
		cnta[x]++;
	}
	for(int i=1;i<=k;i++){
		int x;
		cin>>x;
		cntb[x]++;
	}
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=n;i++) f[i]=i;
	int ans=0;
	for(int i=1;i<=m;i++){
		int x=fd(e[i].u),y=fd(e[i].v);
		if(x==y) continue;
		cnta[x]+=cnta[y];
		cntb[x]+=cntb[y];
		int tmp=min(cnta[x],cntb[x]);
		ans+=tmp*e[i].w;
		cnta[x]-=tmp;
		cntb[x]-=tmp;
		f[y]=x;
	}
	cout<<ans;
	return 0;
} 
2024/12/7 21:53
加载中...