求助并查集时间复杂度
查看原帖
求助并查集时间复杂度
974277
水星湖psgqwq楼主2024/7/1 23:09

rt,过了

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2e5 + 5;
int n, m, q, fa[N];
set<int> s[N], t[N];
int find(int x) {
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}

void merge(int x, int y) {
    y = find(y), x = find(x);
    if(s[x].size() < s[y].size()) {
        fa[x] = y;
        for(int i : s[x]) s[y].insert(i);
        for(int i : t[x]) t[y].insert(i);
    }
    else {
        fa[y] = x;
        for(int i : s[y]) s[x].insert(i);
        for(int i : t[y]) t[x].insert(i);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m >> q;
    for(int i = 1; i <= n * 2; i++) fa[i] = i, t[i].insert(i);
    for(int i = 1, u, v; i <= m; i++) {
        cin >> u >> v;
        s[u].insert(v);
        s[v].insert(u);
    }
    while(q--) {
        int u, v; cin >> u >> v;
        u = find(u), v = find(v);
        bool f = 0;
        if(t[u].size() <= t[v].size()) {
            for(int i : t[u]) 
                if(s[v].find(i) != s[v].end()) 
                    f = 1;
        }
        if(t[v].size() <= t[u].size()) {
            for(int i : t[v]) 
                if(s[u].find(i) != s[u].end()) 
                    f = 1;
        }
        if(s[u].size() <= s[v].size()) {
            for(int i : s[u]) 
                if(t[v].find(i) != t[v].end()) 
                    f = 1;
        }
        if(s[v].size() <= s[u].size()) {
            for(int i : s[v]) 
                if(t[u].find(i) != t[u].end()) 
                    f = 1;
        }

        if(!f) cout << "APPROVE" << endl, merge(u, v);
        else cout << "REFUSE" << endl;
    }

    return 0;
}

2024/7/1 23:09
加载中...