链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3641
题意:一堆人共享信息的事,很好理解。。(略过。。)
思路:刚开始没想到并查集,结果T了。。后来用并查集。。WA了= =,怒而重写,过了。。
#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100005;
set<int>s[maxn];
map<string,int>m;
int n;
string way,na,nb;
int fa[maxn];
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
while(cin>>n){
int cnt=0;
for(int i=0;i<=n;i++){
fa[i] = i;
s[i].clear();
}
m.clear();
while(n--){
cin>>way;
if(way=="arrive"){
cin>>na;
m[na]=++cnt;
int a,b;
cin>>a;
while(a--){
cin>>b;
s[cnt].insert(b);
}
}
else if(way=="share"){
cin>>na>>nb;
int aa,bb;
aa=find(m[na]);
bb=find(m[nb]);
if(aa!=bb){
fa[aa]=bb;
set<int>::iterator it;
for(it = s[aa].begin();it!=s[aa].end();it++)
s[bb].insert(*it);
s[aa].clear();
}
}
else {
cin>>na;
int aa=find(m[na]);
cout<<s[aa].size()<<endl;
}
}
}
return 0;
}