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);
}
}
}