题目描述:
当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。
输入格式:
输入在第一行给出一个正整数 N(≤1000),为社交网络平台注册的所有用户的人数。于是这些人从 1 到 N 编号。随后 N 行,每行按以下格式给出一个人的兴趣爱好列表:
[j]是第j个兴趣爱好的编号,为区间 [1, 1000] 内的整数。
输出格式:
首先在一行中输出不同的社交集群的个数。随后第二行按非增序输出每个集群中的人数。数字间以一个空格分隔,行末不得有多余空格。
输入样例:
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
解题思路:
核心思路是并查集,再用两个数组分别存放某一个人的其中一个爱好、每个集群的人数
*注:*并查集参考部落(pta)(并查集) Java以及C++
代码:
package text2; import java.util.Arrays; import java.util.Scanner; public class 社交集群 { static int p[] = new int[1005]; static int arr[] = new int[1005]; // 记录某人的一个爱好,用于代表该人 static int count[] = new int[1005];// 每个集合所有人数的数量 public static void main(String[] args) { // TODO Auto-generated method stub for(int i=0;i<1005;i++) p[i] = i; Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); for(int i=0;i<n;i++) { String s[] = scanner.nextLine().replace(":","").split(" "); int m = Integer.parseInt(s[0]); arr[i] = Integer.parseInt(s[1]);//用第一个兴趣代表该人 for(int j=1;j<m;j++) { int a = Integer.parseInt(s[j]); int b = Integer.parseInt(s[j+1]); Union(a, b); } } for(int i=0;i<n;i++) {//找集合个数 int p = Find(arr[i]); count[p]++; } Arrays.sort(count); int s= 0; for(int i=0;i<1005;i++) if(count[i]!=0) s++; System.out.println(s); int nu = count.length; System.out.print(count[nu-1]); for(int i=1;i<s;i++) System.out.print(" "+count[nu-i-1]); } public static int Find(int a) { if(a!=p[a]) return Find(p[a]); return p[a]; } public static void Union(int a,int b) { a = Find(a); b = Find(b); if(a!=b) p[a]=b; } }