关于本题并查集的疑惑
查看原帖
关于本题并查集的疑惑
482728
Engulf楼主2022/1/24 20:21

对于本题,我一开始写的代码:

#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 解答。

2022/1/24 20:21
加载中...