L3-003 社交集群 (30 分)(并查集)

简介: L3-003 社交集群 (30 分)(并查集)

当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。


输入格式:

输入在第一行给出一个正整数 N(≤1000),为社交网络平台注册的所有用户的人数。于是这些人从 1 到 N 编号。随后 N 行,每行按以下格式给出一个人的兴趣爱好列表:


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


其中Ki(>0)是兴趣爱好的个数,hi[j]是第j个兴趣爱好的编号,为区间 [1, 1000] 内的整数。


输出格式:

首先在一行中输出不同的社交集群的个数。随后第二行按非增序输出每个集群中的人数。数字间以一个空格分隔,行末不得有多余空格。


输入样例:

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


输出样例:

1. 3
2. 4 3 1


思路:把兴趣爱好的编号标记为拥有这个兴趣爱好的人的编号,标记的时候判断一下,如果当前兴趣爱好的编号已经标记过了,就说明当前的人与之前标记的人具有相同的爱好,然后把他们合并一个集合里面

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int p[N],cnt[N],vis[N];
vector<int>ans;
int find(int x)
{
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,k,x;
    char op;
    cin>>n;
    for(int i=1;i<=n;i++) p[i]=i;
    for(int i=1;i<=n;i++)
    {
        cin>>k>>op;
        while(k--)
        {
            cin>>x;
            if(vis[x]) p[find(vis[x])]=find(i);
            else vis[x]=i;
        }
    }
    for(int i=1;i<=n;i++)
        cnt[find(i)]++;
    for(int i=1;i<=n;i++)
        if(cnt[i]) ans.push_back(cnt[i]);
    sort(ans.rbegin(),ans.rend());//逆序
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++)
    {
        if(i) cout<<' ';
        cout<<ans[i];
    }
    return 0;
}


目录
相关文章
|
7月前
L1-043 阅览室 (20 分)(在线模拟题)
L1-043 阅览室 (20 分)(在线模拟题)
57 0
|
7月前
|
算法
【错题集-编程题】腐烂的苹果(多源 BFS + 最短路)
【错题集-编程题】腐烂的苹果(多源 BFS + 最短路)
|
5月前
|
存储 定位技术
【天梯赛】L2-048 寻宝图 (DFS做法)
遇到一个非'0'字符(也就是'1'和 宝藏'2'到'9')就让ans++,同时将这个非'0'字符染色为'0',然后往四个方向(上、下、左、右)搜索,这里的目的是那一片岛屿(也就是那一片为'1'的部分)都染色为‘0’。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。为了判断有宝藏的岛屿,这里我开了一个全局变量f来判断这一片岛屿是否有宝藏(也就是有无字符'2'-'9'),当搜到字符'2'~'9'时就将f标记为1。在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。
89 5
|
6月前
|
算法
力扣经典150题第十五题:分发糖果
力扣经典150题第十五题:分发糖果
36 0
|
6月前
|
人工智能
技术心得记录:并查集—带权并查集—并查集的拓展域
技术心得记录:并查集—带权并查集—并查集的拓展域
38 0
|
算法 C++
【每日算法Day 109】五大解法,带你深入了解完全背包方案数
【每日算法Day 109】五大解法,带你深入了解完全背包方案数
109 0
|
人工智能 BI
力扣刷题记录——561. 数组拆分、566. 重塑矩阵、575. 分糖果
力扣刷题记录——561. 数组拆分、566. 重塑矩阵、575. 分糖果
143 0
力扣刷题记录——561. 数组拆分、566. 重塑矩阵、575. 分糖果
|
机器学习/深度学习 算法
LeetCode每日一题——882. 细分图中的可到达节点
给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。
95 0
LeetCode每日一题——882. 细分图中的可到达节点
L1-043 阅览室 (20 分)(在线模拟题
L1-043 阅览室 (20 分)(在线模拟题
121 0
L1-043 阅览室 (20 分)(在线模拟题
|
定位技术
【CCCC】L3-005 垃圾箱分布 (30分),Dijkstra跑n遍 = 多源最短路
【CCCC】L3-005 垃圾箱分布 (30分),Dijkstra跑n遍 = 多源最短路
143 0