#include <bits/stdc++.h>
using namespace std;
int findParent(int parent[], int i)
{
int tmpi = i;
while(parent[i]>=0) i = parent[i];
//路径压缩
while(tmpi!=i){
int tmpParent = parent[tmpi];
parent[tmpi] = i;
tmpi = tmpParent;
}
return i;
}
int unionParent(int parent[], int i, int j)
//返回根节点
{
int rooti = findParent(parent, i);
int rootj = findParent(parent, j);
if(rootj==rooti) return rooti;
int tmpCount= parent[rooti] + parent[rootj];
if(parent[rooti]>parent[rootj]){
parent[rooti] = rootj;
parent[rootj] = tmpCount;
return rootj;
}
else{
parent[rootj] = rooti;
parent[rooti] = tmpCount;
return rooti;
}
}
int main()
{
int num;
cin>>num;
for(int i=0;i<num;i++){
int relations;
cin>>relations;
map<string,int> dic;
int Sum=0;
int parent[relations+3];
memset(parent, -1, sizeof(parent));
for(int i=0;i<relations;i++){
string tmp1, tmp2;
cin>>tmp1>>tmp2;
if(!dic.count(tmp1)){
dic[tmp1] = Sum++;
}
if(!dic.count(tmp2)){
dic[tmp2] = Sum++;
}
int tmpRoot = unionParent(parent, dic[tmp1], dic[tmp2]);
cout<< -1*parent[tmpRoot]<<endl;
}
}
return 0;
}
EOJ_1082_Virtual Friends
最新推荐文章于 2024-07-25 18:34:51 发布