Hỏi ý tưởng để hoàn thành bài toán ứng dụng thuật toán Union Find

Chả là em có bài tập này, em đã sắp hoàn thành được, chỉ thiếu cái là không in được nhóm trưởng ra. Em đã thử dùng vòng lặp, và định lấy ra key của map mà không được. Mọi người có thể cho em gợi ý, hay ý tưởng gì để em hoàn thành nó không ạ? em cảm ơn

#include <iostream>
#include <vector>
#include<bits/stdc++.h>
#include<map>
using namespace std;
const int N= 2*1e5+1;
int id[N];
int sz[N];

int Root(int p ){
    while(id[p] != p){
        id[p]= id[id[p]];
        p= id[p];
    }
    return p;
}

void Union (int p, int q){
    int rp= Root(p);
    int rq= Root(q);
    if(rp == rq)
        return;
    if(sz[rp] >= sz[rq]){
        id[rq]= rp;
        sz[rp]+= sz[rq];
    }else{
        id[rp]= rq;
        sz[rq]+= sz[rp];
    }
}

void Init(int n){
    for(int i=0; i<n;i++){
        id[i]= i;
        sz[i]= 1;
    }
}



int main(){
    int f;
    cin>>f;
    Init(f*2);
    string name1, name2;
    
    map<string,int> nameID;
    int i = 0;
    int x = 1;
    while(f--){    
        cin>>name1>>name2;
        if(nameID.count(name1) == 0 ){
            nameID[name1] = i;
            i++;
        }
        if(nameID.count(name2) == 0 ){
            nameID[name2] = i;
            i++;
        }if(nameID.count(name1) == 0 && nameID.count(name2) == 0){
            // cout<<x<<endl;
            // for(auto itr = nameID.begin(); itr != nameID.end(); ++itr) {
            //     if(nameID[itr] == Root(nameID[name1])){
            //         cout<<itr<<endl;
            //     }
            // }
            cout<<x<<endl;#so nhom
            cout<<sz[Root(nameID[name1])]<<endl;#so thanh vien trong nhom
            x++;
        }
        Union(nameID[name1], nameID[name2]);
        
    }
    if(x == 1){
         cout<<x<<endl;#so nhom
        cout<<sz[Root(nameID[name1])]<<endl;#so thanh vien trong nhom
    }
    return 0;
}

Đây là code của em đã thử nhưng không thành :frowning:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?