acm.hdu.edu.cn/showproblem.php?pid=3172
萌萌哒并查集水题!唯一需要注意一点点的是使用map容器为名字赋予一个编号便于操作!
AC代码:
#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <map>
using namespace std;
map <string, int> mm;
const int MAX = 100010;
char s1[MAX][25],s2[MAX][25];
int father[MAX],rank[MAX];
void Init(int n){
for(int i=1; i<=n; i++){
father[i] = i;
rank[i] = 1;
}
}
int Find(int x){
if(x != father[x])
father[x] = Find(father[x]);
return father[x];
}
void Union(int x, int y){
int xx = Find(x), yy = Find(y);
if(xx != yy){
father[yy] = xx;
rank[xx] += rank[yy];
// cout << x << ' ' << rank[x] << endl;
}
}
int main(){
int cas;
while(scanf("%d",&cas) != EOF){
while(cas--){
int n,pos = 0;
scanf("%d",&n);
mm.clear();
for(int i=0; i<n; i++){
scanf("%s%s",s1[i],s2[i]);
if(mm.find(s1[i]) == mm.end())
mm[s1[i]] = ++pos;
if(mm.find(s2[i]) == mm.end())
mm[s2[i]] = ++pos;
}
Init(pos);
for(int i=0; i<n; i++){
// cout << mm[s1[i]] << " " << mm[s2[i]] << endl;
Union(mm[s1[i]], mm[s2[i]]);
printf("%d\n",rank[Find(mm[s1[i]])]);
}
}
}
return 0;
}