DMOJ · ds2

Disjoint Set Test

This C++ solution uses disjoint set union for DMOJ ds2 Disjoint Set Test. Read the reasoning, inspect the code, or try your own test case below.

ds2Graphs & treesDisjoint set unionC++48 lines
Solution077of 248
Open official problem ↗ Download C++ file ↓ Search the library → Open full Code Lab ↗ Report an issue ↗

Approach

Disjoint set union

Disjoint Set Test asks for the selected input-edge indices of a spanning tree or Disconnected Graph; the code uses DSU in input order.

Graphs & trees

Problem and code

Useful links.

Written by benbenyaojifen. Try the problem first, then compare your approach with the code.

Open official problem ↗View exact source file ↗
Implementation

Disjoint_Set_Test.cpp

C++

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int INF = 0x3f3f3f3f; //❄️
    vector<int> parent, rk;
    int find(int x) {
        if(parent[x] == x) return x;
        return parent[x] = find(parent[x]);
    }
    void unite(int x, int y){
        x = find(x); y = find(y);
        if (rk[x] > rk[y]) {
            parent[y] = x;
        } else if(rk[y] > rk[x]) {
            parent[y] = x;
        } else {
            parent[y] = x;
            rk[x]++;
        }
    }
    int main() {
        ios::sync_with_stdio(0); cin.tie(0); 
        int n, m; cin >> n >> m;
        vector<pair<int, int>> edge;
        parent.resize(n + 1); rk.resize(n + 1);
        for (int i = 0; i < parent.size(); i++) parent[i] = i;
        for (int i =  0; i < m; i++) { 
            int u, v; cin >> u >> v;
            edge.emplace_back(u, v);
        }
        vector<int> ans;
        int cnt = 0;
        for(int i = 0; i < m; i++) {
            auto[x, y] = edge[i];
            if (find(x) != find(y)) {
                cnt++;
                unite(x, y);
                ans.push_back(i + 1);
            }
            if (cnt == n - 1) break;
        }
        if(cnt < n - 1){
            cout << "Disconnected Graph" << '\n';
            return 0;
        }
        for (int i = 0; i < ans.size(); i++) cout << ans[i] << "\n";
        return 0;
    }
        

Did this explanation save you time? I'm a Grade 11 student building this free library to make difficult algorithms easier to understand.

Buy me a coffee ↗Keep studying →

Test this problem

Run your code here.

Paste your code, run a test case, compare the output, or trace selected values.

Full trace, comparison & stress testing ↗
StatusReady
Output
No run yet.
Diagnostics
No diagnostics yet.

Each run is isolated and has strict limits. Passing one test does not guarantee the judge will accept the solution.