ZOJ-3641-Information Sharing
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3641
每个人有几个信息,不同的人的信息可以共享,并查集即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<map>
#include<set>
using namespace std;
#define N 100005
int f[N];
set<int>s[N];
map<string,int>m;
void init()
{
int i=0;
for(i=0;i<N;i++)
{
f[i]=i;
s[i].clear();
}
m.clear();
}
int main()
{
int n,t;
int i,j,q,cur,p1,p2,p3;
char com[20],str2[20],str3[20];
while(scanf("%d",&n)!=EOF)
{
init();
t=0;
while(n--)
{
scanf("%s",com);
if(com[0]=='a')
{
scanf("%s",str2);
m[str2]=t;
scanf("%d",&q);
while(q--)
{
scanf("%d",&cur);
s[t].insert(cur);
}
t++;
}
else if(com[0]=='c')
{
scanf("%s",str2);
p1=m[str2];
while(f[p1]!=p1)
p1=f[p1];
m[str2]=p1;
printf("%d\n",s[p1].size());
}
else
{
scanf("%s %s",str2,str3);
p2=m[str2];
p3=m[str3];
while(f[p2]!=p2)
p2=f[p2];
while(f[p3]!=p3)
p3=f[p3];
if(p2==p3)
continue;
while(!s[p2].empty())
{
cur=*s[p2].begin();
s[p3].insert(cur);
s[p2].erase(cur);
}
m[str2]=p3;
m[str3]=p3;
f[p2]=p3;
}
}
}
return 0;
}