题目链接
用了一个映射表维护人员序号
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;
int p, n, fa[maxn], size[maxn];
map<string, int>amap;
int num(string nam){
if(amap.count(nam))
return amap[nam];
amap.insert(pair<string, int>(nam, p));
return p++;
}
void init(){
p = 0;
for(int i = 0; i <= 2 * n; i++)
fa[i] = i,size[i] = 1;
}
int get(int a){
if(a == fa[a])
return a;
return fa[a] = get(fa[a]);
}
bool sam(int a, int b){
if(get(a) == get(b))
return true;
return false;
}
int merge(int a, int b){
a = get(a);
b = get(b);
if(!sam(a, b)){
fa[a] = b;
size[b] += size[a];
size[a] = size[b];
}
return size[b];
}
int main(){
cin>>n;
init();
string a, b;
for(int i = 0; i < n; i++)
{
cin>>a>>b;
cout<<merge(num(a), num(b))<<endl;
}
return 0;
}