• PAT-1107 Social Clusters (30 分) 并查集模板


    1107 Social Clusters (30 分)

    When register on a social network, you are always asked to specify your hobbies in order to find some potential friends with the same hobbies. A social cluster is a set of people who have some of their hobbies in common. You are supposed to find all the clusters.

    Input Specification:

    Each input file contains one test case. For each test case, the first line contains a positive integer N (≤1000), the total number of people in a social network. Hence the people are numbered from 1 to N. Then N lines follow, each gives the hobby list of a person in the format:

    K**i: h**i[1] h**i[2] ... h**i[K**i]

    where K**i (>0) is the number of hobbies, and h**i[j] is the index of the j-th hobby, which is an integer in [1, 1000].

    Output Specification:

    For each case, print in one line the total number of clusters in the network. Then in the second line, print the numbers of people in the clusters in non-increasing order. The numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

    Sample Input:

    8
    3: 2 7 10
    1: 4
    2: 5 3
    1: 4
    1: 3
    1: 4
    4: 6 8 1 5
    1: 4
    

    Sample Output:

    3
    4 3 1
    

    题目大意:有n个人,每个人喜欢k个活动,如果两个人有任意一个活动相同,就称为他们处于同一个社交网络。求这n个人一共形成了多少个社交网络。

    第一个喜欢这个活动的称为教主,之后喜欢这个活动的人和教主unite即可.

    1.并查集写错了,返回一个等号写成了两个等号.

    2.找每组属于谁的时候可能还没有压缩路径,所以应该统计find(i)而不是par[i],,找分为几组的时候才可以用par[i]==i

    #include <iostream>
    #include<bits/stdc++.h>
    #define each(a,b,c) for(int a=b;a<=c;a++)
    #define de(x) cout<<#x<<" "<<(x)<<endl
    using namespace std;
    
    const int maxn=1000+5;
    const int inf=0x3f3f3f3f;
    
    int par[maxn];
    int Rank[maxn];
    int jiaozhu[maxn];
    multiset<int>MS;
    void init(int n)
    {
        for(int i=1;i<=n;i++)///初始化小错误
        {
            par[i]=i;
            Rank[i]=0;
        }
    }
    int find(int x)
    {
        return par[x]==x?x:par[x]=find(par[x]);///并查集的父节点满足par[x]==x,如果不是的话也要把par[x]更新,返回的是find(par[x])同时进行了路径的压缩
    }
    priority_queue<int>Q;
    void unite(int x,int y)
    {
        //de(x);
        //de(y);
        x=find(x);
        y=find(y);
    
        if(x==y)return;
        if(Rank[x]<Rank[y])
        {
            par[x]=y;///军衔小,认y当爹
        }
        else
        {
            par[y]=x;
            if(Rank[x]==Rank[y])Rank[x]++;///本来是兄弟,x却当了爹
        }
    }
    int root_cnt[maxn];
    /**
    8
    3: 2 7 10
    1: 4
    2: 5 3
    1: 4
    1: 3
    1: 4
    4: 6 8 1 5
    1: 4
    */
    int ans[maxn];
    int cur=0;
    int cmp(int a,int b){return a>b;}
    int main()
    {
        int n;
        scanf("%d",&n);
        init(n);
        cur=0;
        each(i,1,n)
        {
            int k;
            scanf("%d: ",&k);
            while(k--)
            {
                int temp;
                scanf("%d",&temp);
                if(jiaozhu[temp]==0)
                {
                    jiaozhu[temp]=i;
                }
                else
                {
                    unite(jiaozhu[temp],i);
    
                }
            }
        }
        each(i,1,n)
        {
            root_cnt[find(i)]++;
        }
        for(int i=1;i<=n;i++)
        {
            if(root_cnt[i]!=0)
            {
                ans[cur++]=root_cnt[i];
            }
        }
        sort(ans,ans+cur,cmp);
        printf("%d
    ",cur);
        each(i,0,cur-1)
        {
            printf("%d",ans[i]);
            printf(i==cur-1?"
    ":" ");
        }
    }
    
    
  • 相关阅读:
    Oracle 左连接、右连接、全外连接、(+)号作用
    ORA-01940:无法删除当前已链接的用户(转)
    博客正式开通
    python扫描内网存活主机(scapy与nmap模块)
    Python学习之扫描网段主机与开启端口(避坑)
    Python学习之服务器与客户端的交互
    python渗透测试编程之kali linux2的AptanaStudio3安装
    Shellcodeloader免杀过火绒
    Cracer之Waf绕过
    30 Day Challenge Day 16 | Leetcode 692. Top K Frequent Words
  • 原文地址:https://www.cnblogs.com/Tony100K/p/11773848.html
Copyright © 2020-2023  润新知