【並查集】B004_AW_社會叢集(儲存每個愛好對應的人的編號)
阿新 • • 發佈:2020-09-11
二、社會叢集
輸出格式
第一行輸出總叢集數量。
第二行按非遞增順序輸出每個叢集的人數。
數字之間空格隔開,行尾不得有多餘空格。
資料範圍
1≤N≤1000,
Ki>0,
愛好種類最多 1000 種,編號範圍 [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
樣例解釋
共 3 個叢集:
4 人叢集 {2,4,6,8},他們都有共同的愛好 4。
3 人叢集 {3,5,7},其中 3 和 5 有共同的愛好 3,3 和 7 有共同的愛好 5。
1 人叢集 {1}
import java.util.*; import java.math.*; import java.io.*; public class Main{ static class Solution { int N=1005, fa[]; List<Integer> g[]; int find(int u) { if (fa[u]==u) return u; return fa[u]=find(fa[u]); } void merge(int u, int v) { int fu=find(u), fv=find(v); if (fu!=fv) { fa[fu]=fv; } } void init() { Scanner sc = new Scanner(new BufferedInputStream(System.in)); int n=sc.nextInt(); g=new ArrayList[N]; fa=new int[N]; for (int i=1; i<N; i++) {g[i]=new ArrayList<>(); fa[i]=i;} sc.nextLine(); for (int i=1; i<=n; i++) { String[] line = sc.nextLine().split(" "); for (int j=1; j<line.length; j++) { g[Integer.parseInt(line[j])].add(i); } } for (int i=1; i<N; i++) for (int j=1; j<g[i].size(); j++) { merge(g[i].get(0), g[i].get(j)); } int cnt[]=new int[N], c=0; for (int i=1; i<=n; i++) { cnt[find(i)]++; } List<Integer> ans = new ArrayList<>(); for (int i=1; i<=n; i++) if (cnt[i]!=0) { ans.add(cnt[i]); c++; } Collections.sort(ans, (e1, e2) -> { return e2-e1; }); System.out.println(c); System.out.print(ans.get(0)); for (int i=1; i<ans.size(); i++) { System.out.print(" "+ans.get(i)); } } } public static void main(String[] args) throws IOException { Solution s = new Solution(); s.init(); } }