[LeetCode] 547. Friend Circles

来源:互联网 发布:文件管理网站源码 编辑:程序博客网 时间:2024/06/07 11:44

Problem:

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: 2Explanation: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: 1Explanation: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:

  1. N is in range [1,200].
  2. M[i][i] = 1 for all students.
  3. If M[i][j] = 1, then M[j][i] = 1.

题意分析:本题要求我们找出朋友圈的数目,朋友圈的定义很简单,若B是A的朋友(矩阵表示为M[A][B] = M[B][A] = 1),

C是B的朋友,那么A、B、C三人在一个朋友圈中,若D跟三人中的任何一人是朋友,则D也在该朋友圈中,若D跟三人

都不是朋友,则D不在此朋友圈中,但是D一人也能构成一个朋友圈,所以总的来说n个人至少构成1个朋友圈,最多则有

n个朋友圈。


解题思路:典型的深度优先问题,对每个人,用深度优先算法找出其直接或间接的朋友,做相应的标记,并且使用一个

counter记录朋友圈的个数即可。


Solution:

class Solution {public:    int findCircleNum(vector<vector<int>>& M) {        int count = 0;        vector<int> visited(M.size(), 0);        for (int i = 0; i < M.size(); i++) {            if (visited[i] == 0) {                visited[i] = 1;                count++;                dfs(M, i, visited);            }        }        return count;    }        void dfs(vector<vector<int>>& M, int next, vector<int>& visited) {        for (int i = 0; i < M[next].size(); i++) {            if (visited[i] == 0 && M[next][i] == 1) {                visited[i] = 1;                dfs(M, i, visited);            }        }    }};