【校技本題】バイトジャンプ
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で、分割可能な最小のグループの個数を表す.
説明を入力:最初の行は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);
}
}
}