关于并查集
  • 板块学术版
  • 楼主_299817_
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/7/5 16:36
  • 上次更新2023/11/3 11:28:59
查看原帖
关于并查集
501470
_299817_楼主2023/7/5 16:36
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<unordered_map>
#include<map>
#define sort stable_sort
#define map unordered_map
using namespace std;
typedef long long ll;

int n, m;
int op;
int fa[10010];

int getf(int now){
    if(fa[now] == now){
        return now;
    }
    fa[now] = getf(fa[now]);
    return fa[now];
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    int x, y;
    for(int i = 1; i <= n; i++){
        fa[i] = i;
    }
    for(int i = 1; i <= m; i++){
        cin >> op >> x >> y;
        if(op == 1){
            int now = getf(x);
            fa[now] = getf(y);
        }else{
            if(getf(x) == getf(y)){
                cout << "Y" << endl;
            }else{
                cout << "N" << endl;
            }
        }
    }
    return 0;
}

模板题P3367,但是求这份代码的最劣复杂度

从我自己的主观上来说是 O(nm)O(nm) 的,但是注意到 getf 函数里有这么一句话 fa[now] = getf(fa[now]);,所以按理来说不可能所有时候并查集都是一条链,所以这份代码的复杂度是多少捏

谢谢

2023/7/5 16:36
加载中...