【校招真题】字节跳动

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);
             }
         }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值