假设有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); } } } }