假设有N个用户,其中有些人是朋友,有些则不是。A和B是朋友,B和C是朋友,这样ABC就是一个朋友圈,请计算给定的朋友关系的朋友圈数。
给定一个 N * N 的矩阵 M,表示用户之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个人互为朋友关系,否则为不知道。你必须输出所有用户中的已知的朋友圈总数。
第一行输入为表示用户数N第2到1+N行表示朋友之间关系,如果值为1表示有朋友关系
输出朋友圈数
3 1,1,0 1,1,0 0,0,1
2
第0个用户和第1个用户组成一个朋友圈,第2个用户组成一个朋友圈
3 1,1,0 1,1,1 0,1,1
1
第0,1,2个用户组成了一个朋友圈
如果M[i][j] = 1 那么 如果M[j][i] = 1,用户自己和自己肯定是朋友关系即M[i][i]=1用户数量不超过10000
从每个未访问过的节点(用户)出发,进行 dfs 搜索。
dfs 的次数,就是朋友圈的数目。
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String[][] relations = new String[n][n];
for (int i = 0; i < n; i++) {
relations[i] = scanner.next().split(",");
}
scanner.close();
System.out.println(friendCircle(relations));
}
private static int friendCircle(String[][] relations) {
int n = relations.length;
// graph[i] -> 用户 i 的所有朋友
Set[] graph = new HashSet[n];
for (int i = 0; i < n; i++) {
graph[i] = new HashSet();
for (int j = 0; j < n; j++) {
int relation = Integer.parseInt(relations[i][j]);
if (relation == 1) {
graph[i].add(j);
}
}
}
int ans = 0;
boolean[] visited = new boolean[n];
for (int i = 0; i < n; i++) {
if (!visited[i]) {
ans++;
dfs(graph, i, visited);
}
}
return ans;
}
private static void dfs(Set[] graph, int cur, boolean[] visited) {
visited[cur] = true;
for (int next : graph[cur]) {
if (!visited[next]) {
dfs(graph, next, visited);
}
}
}
}