题目:
https://leetcode.com/problems/friend-circles/
There are N students in a class. Some of them are friends, while some are not. Their friendship is transitive in nature. For example, if A is a direct friend of B, and B is a direct friend of C, then A is an indirect friend of C. And we defined a friend circle is a group of students who are direct or indirect friends.
Given a N*N matrix M representing the friend relationship between students in the class. If M[i][j] = 1, then the ith and jth students are direct friends with each other, otherwise not. And you have to output the total number of friend circles among all the students.
Example 1:
Input: [[1,1,0], [1,1,0], [0,0,1]] Output: 2 Explanation:The 0th and 1st students are direct friends, so they are in a friend circle.
The 2nd student himself is in a friend circle. So return 2.
Example 2:
Input: [[1,1,0], [1,1,1], [0,1,1]] Output: 1 Explanation:The 0th and 1st students are direct friends, the 1st and 2nd students are direct friends,
so the 0th and 2nd students are indirect friends. All of them are in the same friend circle, so return 1.
Note:
- N is in range [1,200].
- M[i][i] = 1 for all students.
- If M[i][j] = 1, then M[j][i] = 1.
分析:
有n个学生,如果a和b是朋友,b和c是朋友,那么a和c也是朋友,求出学生中的朋友圈个数(a,b,c同属一个朋友圈)
朋友之间的关系由矩阵表示,1表示是朋友关系,同时自己和自己也是朋友关系。
首先我们从第一个学生开始遍历,利用M[i][i]是否等于1来判断是否访问过这个学生,然后从这个学生开始去扫描其他的学生是否和这个学生是朋友关系,如果是的话,将他们的关系修改为非朋友,同时继续搜索下去,直到这个圈子不再有新的学生了,同时结果加1,因为这个朋友圈所有的人我们都遍历过了,然后再继续访问后面的学生,如果有M[i][i]等于1的话,意味着有新的圈子出现,继续搜索即可,处理完一个朋友圈结果记得加一。
程序:
C++
class Solution { public: int findCircleNum(vector<vector<int>>& M) { if(M.size() == 0) return 0; m = M.size(); int res = 0; for(int i = 0; i < m; ++i){ if(M[i][i] == 1){ dfs(M, i); res++; } } return res; } private: void dfs(vector<vector<int>>& M, int i){ if(M[i][i] == 0) return; M[i][i] = 0; for(int k = 0; k < m; ++k){ if(M[k][i] == 1){ M[k][i] = M[i][k] = 0; dfs(M, k); } } } int m; };
Java
class Solution { public int findCircleNum(int[][] M) { if(M.length == 0) return 0; m = M.length; int res = 0; for(int i = 0; i < m; ++i){ if(M[i][i] == 1){ dfs(M, i); res++; } } return res; } private void dfs(int[][] M, int i){ if(M[i][i] == 0) return; M[i][i] = 0; for(int k = 0; k < m; ++k){ if(M[k][i] == 1){ M[k][i] = M[i][k] = 0; dfs(M, k); } } } private int m; }