以试试,玄关

P3367 【模板】并查集

lucy2012 @ 2024-07-15 17:18:51

以逝世。MLE。

#include<bits/stdc++.h>
using namespace std;
int n,m,f[10010];
int find(int x){
    if(f[x]!=x)
        return f[x]=find(f[x]);
}
void toger(int a,int b){
    int ba=find(a),bb=find(b);
    if(ba==bb)
        return;
    f[a]=bb;
    return;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        f[i]=i;
    }
    for(int i=1;i<=m;i++){
        int z,x,y;
        cin>>z>>x>>y;
        if(z==1){
            toger(x,y);
        }else{
            int bx=find(x),by=find(y);
            if(bx==by)
                cout<<"Y"<<endl;
            else
                cout<<"N"<<endl;
        }
    }
    return 0;
}

by E_M_T @ 2024-07-15 17:20:14

@lucy2012 《f[a]=bb》


by xuchuhan @ 2024-07-15 17:22:18

@lucy2012

find函数改为:

int find(int x){
    if(f[x]!=x)
        return f[x]=find(f[x]);
    return x;
}

toger函数中f[a]=bb;改为f[ba]=bb;


by lzm0107 @ 2024-07-15 17:22:36

@lucy2012 find在写什么


by lucy2012 @ 2024-07-15 17:25:59

@xuchuhan 20分辣。 @E_M_T 这个哪里错啦?QwQ @lzm0107 我不知道。。


by E_M_T @ 2024-07-15 17:26:47

@lucy2012 f[ba]=bb。

哥们你到底学过并查集吗。/jy


by xuchuhan @ 2024-07-15 17:27:30

@lucy2012 应该改了这两个地方就A了呀


by King_and_Grey @ 2024-07-15 17:30:04

@lucy2012

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,f[10010];
int p1,p2,p3;
int find(int k){
    if(f[k] == k){
        return k;
    }
    return f[k] = find(f[k]);
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
        f[i] = i;
    for(int i = 1;i <= m;i++){
        cin >> p1 >> p2 >> p3;
        if(p1 == 1){
            f[find(p2)] = find(p3);
        }else{
            if(find(p2) == find(p3)){
                cout << "Y\n";
            }else{
                cout << "N\n";
            }
        }
    }
    return 0;
}

你到底学过并查集吗,哥们?


by lucy2012 @ 2024-07-15 17:30:32

@E_M_T 额,刚学玩。。 @xuchuhan 以ac


by lucy2012 @ 2024-07-15 17:31:40

@greyandking 刚学完有点不熟练,虽然已经练了一题但还是很菜啦。。我已经调好了。


|