60分求解
  • 板块P2814 家谱
  • 楼主Zhang_Wenfu
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/23 11:49
  • 上次更新2024/1/23 15:33:09
查看原帖
60分求解
1031191
Zhang_Wenfu楼主2024/1/23 11:49
#include <iostream>
using namespace std;
int cnt;
char mode;
string fname,sname,name;

struct people{
    int fa,ind;
    string name;
};
people sett[50010];

int search(string n){
    for (int i = 1;i <= 50009;i++) if (sett[i].name == n) return i;
    return 0;
}

int find(int s){
    if (sett[s].fa == s) return s;
    else{
        return sett[s].fa=find(sett[s].fa);
    }
}

void marge(int a,int b){
    int a_=find(a);
    int b_=find(b);
    sett[a_].fa=b_;
}

int main(){
    for (int i = 1;i <= 50009;i++) sett[i].ind=i;
    for (int i = 1;i <= 50009;i++) sett[i].fa=i;
    while (1){
        cnt++;
        cin >> mode;
        if (mode == '$') break;
        if (mode == '?'){
            cin >> name;
            cout << name << " " << sett[sett[search(name)].fa].name << endl;
        }
        else if (mode == '#'){
            cin >> fname;
            sett[cnt].name=fname;
        }else if (mode == '+'){
            cin >> sname;
            sett[cnt].name=sname;
            marge(sett[cnt].ind,search(fname));
        }
    }
    return 0;
}
2024/1/23 11:49
加载中...