ZOJ:3641 Information Sharing(並查集)

題意:不說了。。

思路:很明顯的並查集。數據量比較小,集合可以用set維護。唯一一個值得注意的地方是可能會爆內存,因此每次合併以後原來的set要清空。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <queue>
using namespace std;
typedef long long LL;
int cnt;
map<string,int> mp;
const int maxn=100005;
int father[maxn];
set<int> s[maxn];
void init(int i)
{
    father[i]=i;
}
int find(int p)
{
    return p==father[p]?p:father[p]=find(father[p]);
}
void unio(int a,int b)
{
    int fa=find(a),fb=find(b);
    if(fa!=fb)
    {
        father[fa]=fb;
        for(set<int>::iterator it=s[fa].begin(); it!=s[fa].end(); ++it)
        {
            s[fb].insert(*it);
        }
        s[fa].clear();
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        char a[20],b[20];
        mp.clear();
        cnt=0;
        while(n--)
        {
            scanf("%s",a);
            if(a[0]=='a')
            {
                scanf("%s",b);
                mp[string(b)]=++cnt;
                init(cnt);
                s[cnt].clear();
                int m;
                scanf("%d",&m);
                for(int i=0; i<m; ++i)
                {
                    int x;
                    scanf("%d",&x);
                    s[cnt].insert(x);
                }
            }
            else if(a[0]=='s')
            {
                char c[20];
                scanf("%s%s",b,c);
                int x=mp[string(b)],y=mp[string(c)];
                unio(x,y);
            }
            else
            {
                scanf("%s",b);
                int f=find(mp[string(b)]);
                printf("%d\n",s[f].size());
            }
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章