1. 程式人生 > 實用技巧 >【並查集】B004_AW_社會叢集(儲存每個愛好對應的人的編號)

【並查集】B004_AW_社會叢集(儲存每個愛好對應的人的編號)

二、社會叢集

輸出格式
第一行輸出總叢集數量。
第二行按非遞增順序輸出每個叢集的人數。
數字之間空格隔開,行尾不得有多餘空格。
資料範圍
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();
    }
}