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
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 1010; int course[maxn] = {0}; int father[maxn]; int isRoot[maxn] = {0}; int findFather(int x){ int a = x; while(x != father[x]){ x = father[x]; } while(a != father[a]){ int z = a; a = father[a]; father[z] = x; } return x; } void Union(int a,int b){ int faA = findFather(a); int faB = findFather(b); if(faA != faB) father[faA] = faB; } void init(int n){ for(int i = 1; i <= n; i++){ father[i] = i; } } bool cmp(int a,int b){ return a > b; } int main(){ int n,k,h; scanf("%d",&n); init(n); for(int i = 1; i <= n; i++){ scanf("%d:",&k); for(int j = 0; j < k; j++){ scanf("%d",&h); if(course[h] == 0){ course[h] = i; } Union(i,findFather(course[h])); //将course[h] == i号人归类 } } for(int i = 1; i <= n; i++){ isRoot[findFather(i)]++; //i的根节点的个数为社交圈的个数 } int ans = 0; for(int i = 1; i <= n; i++){ if(isRoot[i] != 0) ans++; } printf("%d\n",ans); sort(isRoot+1,isRoot+n+1,cmp); for(int i = 1; i <= ans; i++){ printf("%d",isRoot[i]); if(i < ans)printf(" "); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)