这两种写法有什么不同之处吗?为什么第一份 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;
}