【校技本題】バイトジャンプ

9146 ワード

Bytedance Efficiency Engineeringチームは8月20日に学清嘉創ビルに引っ越した.チームの移転の喜びを祝うために、バイト君はEEチーム全体を招待し、大規模な団建ゲーム-バイトジャンプの大突破を開催することにした.しかし、一つの问题に出会った:EEチームはn人で、みんな耻ずかしくて、知らない人と交流するのが苦手です.このn人は誰もがバイト君に自分の知っている人の名前を提供して、自分を含まない.AのリストにBが入っているか、BのリストにAが入っている場合は、AとBが互いに知り合いであることを意味します.また、AがBを知っていれば、BがCを知っていれば、AとCを代表してもすぐに知ることができます.結局、Bの紹介を通じて、二人はすぐにお互いを知ることができます.大きな関門を突破するために、ゲームがよりよくチームワークし、雰囲気がより活発になり、チームの中の人ができるだけ早く相互理解し、認識し、交流できるようにするために、バイト君はこのリストに基づいてチームをmグループに分け、グループごとに人数は異なるが、グループ内の誰もがグループ内の他のすべての人と直接または間接的に認識し、交流することにした.どのようにしてチームがmに分けて借りることができ、このmはできるだけ小さくすることができますか?
説明を入力:最初の行はn人を表す整数nで、1から番号を付けます.次にn行あり、x+1行目はx番の人が知っている人の番号k(1<=k<=n)を表し、各人のリストは0で終わる.
出力記述:整数mで、分割可能な最小のグループの個数を表す.
//     ,dfs   。               LeetCode         
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] matrix = new int[n + 1][n + 1];
        for (int i = 1; i <= n; i++){
            int num;
            matrix[i][i] = 1;
            while ((num = sc.nextInt()) != 0){
                matrix[i][num] = 1;
                matrix[num][i] = 1;
            }
        }

        int cnt = 0;
        boolean [] visit = new boolean[n + 1];
        for(int i = 1; i <= n; i++){
            if (!visit[i]){
                cnt++;
                dfs(matrix, visit, i);
            }
        }
        System.out.println(cnt);
    }

    private static void dfs(int[][] matrix, boolean[] visit, int i){
        visit[i] = true;
        for (int j = 1; j < matrix.length; j++){
             if(matrix[i][j] != 0 && !visit[j]){
                  dfs(matrix, visit, j);
             }
         }
    }