对于本题,我一开始写的代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int fa[2005];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int a,int b){
int x=find(a),y=find(b);
if(x!=y){
fa[x]=y;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n*2;i++)fa[i]=i;
for(int i=1;i<=m;i++){
int x,y;char op;cin>>op>>x>>y;
if(op=='F'){
merge(x,y);
}else{merge(x,y+n);merge(x+n,y);}
}
int cnt=0;
for(int i=1;i<=n;i++){if(fa[i]==i)cnt++;}
cout<<cnt;
return 0;
}
只得 10 分。
学习题解后,发现要写成这样:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int fa[1005<<1];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int a,int b){
int x=find(a),y=find(b);
if(x!=y){
fa[x]=y;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n*2;i++)fa[i]=i;
for(int i=1;i<=m;i++){
int x,y;char op;cin>>op>>x>>y;
if(op=='F'){
fa[find(x)]=find(y);
}else{
fa[find(x+n)]=find(y);
fa[find(y+n)]=find(x);
}
}
int cnt=0;
for(int i=1;i<=n;i++){if(fa[i]==i)cnt++;}
cout<<cnt;
return 0;
}
才能 AC。
为什么我把 merge
写成函数就 WA?望 dalao 解答。