#include <iostream>
#include <map>
#include <string>
using namespace std;
//题意:给出每一组字符串,输出当前形成朋友的个数
//如第一组:aa bb 输出2
//第二组:bb cc 输出3
//思路:并差集求解
//使用map<string, int>对每个字符串进行标志计数,以便于后边并差集操作
#define NSIZ 100010
int parent[NSIZ];
int myrank[NSIZ];
map<string, int> mp;
void make_set(int n)
{
int i;
for(i = 0;i < n; ++i)
{
parent[i] = i;
myrank[i] = 1;
}
}
int find_set(int x)
{
if(x != parent[x])
{
parent[x] = find_set(parent[x]);
}
return parent[x];
}
void union_set(int x, int y)
{
x = find_set(x), y = find_set(y);
if(x != y)
{
if(myrank[x] < myrank[y])
{
parent[x] = y;
myrank[y] += myrank[x];
}
else
{
parent[y] = x;
myrank[x] += myrank[y];
}
}
}
int main()
{
int t, n, m;
int i, j, x, y;
int fx, fy;
int num;
char str1[32];
char str2[32];
while(scanf("%d", &t) != EOF )
{
while(t--)
{
//init
mp.clear();
num = 1;
scanf("%d", &n);
if(!n)
{
printf("0\n");
continue;
}
//初始化并差集结构
make_set(NSIZ);
for(i = 0; i < n;++i)
{
scanf("%s %s", str1, str2);
if(mp.find(str1) == mp.end())
{
x = num;
mp[str1] = num++;
}
else
{
x = mp[str1];
}
if(mp.find(str2) == mp.end())
{
y = num;
mp[str2] = num++;
}
else
{
y = mp[str2];
}
fx = find_set(x);
fy = find_set(y);
if(fx == fy)
{
printf("%d\n", myrank[fx]);
}
else
{
union_set(x, y);
fx = find_set(x);
printf("%d\n", myrank[fx]);
}
}
}
}
return 0;
}
hdu3172Virtual Friends【并差集】
最新推荐文章于 2013-10-08 23:10:32 发布