zoukankan      html  css  js  c++  java
  • L3-003. 社交集群(并查集)

    L3-003. 社交集群

    时间限制
    1000 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

    在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。

    输入格式:

    输入的第一行给出正整数N(<=1000),即社交网络中的用户总数(则用户从1到N编号)。随后N行,每行按下列格式列出每个人的兴趣爱好:

    Ki: hi[1] hi[2] ... hi[Ki]

    其中Ki(>0)是第i个人的兴趣的数量,hi[j]是第i个人的第j项兴趣的编号,编号范围为[1, 1000]内的整数。

    输出格式:

    首先在第一行输出整个网络中集群的数量,然后在第二行按非递增的顺序输出每个集群中用户的数量。数字间以1个空格分隔,行首尾不得有多余空格。

    输入样例:
    8
    3: 2 7 10
    1: 4
    2: 5 3
    1: 4
    1: 3
    1: 4
    4: 6 8 1 5
    1: 4
    
    输出样例:
    3
    4 3 1
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<vector>
    using namespace std;
    vector<int>v[1005];
    map<int,int>mp;
    int pra[1005];
    int find(int x)
    {
        if(x==pra[x]) return x;
        return pra[x]=find(pra[x]);
    }
    void unite(int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x==y) return ;
        pra[y]=x;
    }
    bool cmp(int x,int y)
    {
        return x>y;
    }
    int main()
    {
    
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            pra[i]=i;
            int k;
            cin>>k;
            char c;
            cin>>c;
            for(int j=1;j<=k;j++)
            {
                int x;
                cin>>x;
                v[i].push_back (x);
            }
        }
        for(int i=1;i<=n;i++)
        {
            mp.clear();
            for(int p=0;p<v[i].size ();p++)
                if(!mp[v[i].at(p)]) mp[v[i].at(p)]=1;
            
            for(int j=i+1;j<=n;j++)
            {
                for(int p=0;p<v[j].size ();p++)
                {
                    if(mp[v[j].at(p)]) 
                    {
                        unite(i,j);
                        break;
                    }
                }
            }
        }
        int k=1;
        mp.clear ();
        int a[1005];
        memset(a,0,sizeof a);
        for(int i=1;i<=n;i++)
        {
            int x=find(i);
            if(!mp[x]) 
            {
                mp[x]=k++;
                a[mp[x]]=1;
            }
            else a[mp[x]]++;
        }
        sort(a+1,a+k,cmp);
        cout<<k-1<<endl;
        for(int i=1;i<=k-1;i++)
        {
            cout<<a[i];
            if(i!=k-1) cout<<" ";
        }
    }


  • 相关阅读:
    关于虚函数,构造函数,非构造函数之间的交叉调用
    关于虚函数,类的内存分布以及类的成员函数调用原理
    以数组作为形参
    opengl渲染管线梳理
    C++ struct,class的内存对齐
    关于虚函数的原理
    利用Attribute和IErrorHandler处理WCF全局异常
    HandleErrorAttribute
    Using native JSON
    iis8不支持 aspnet_regiis.exe -iru 命令的解决办法
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/8678513.html
Copyright © 2011-2022 走看看