leetcode第十六周解题总结--图

547. 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.

题意解析: 求一个无向图中的连通分量。

解题思路: 从一个节点开始搜索,若还存在无法访问的节点,则加一个连通分量,并从该点继续进行搜索,一直进行,直到所有节点都被访问。

  • 广度优先搜索BFS
class Solution {
public:
    int findCircleNum(vector<vector<int>>& M) {
        int n = M.size();
        vector<int> a(n);
        int count = 0;

        stack<int> g;
        g.push(0);
        a[0] = 1;
        while(g.size()!=0) {
            int i = g.top();
            g.pop();
            for(int j = 0; j < n; j++) {
                if(M[i][j] == 1 && a[j] != 1) {
                    a[j] = 1;
                    g.push(j);
                }
            }

            if(g.size() == 0){
               count ++;
               for(int p = 0; p < n; p ++) {
                   if(a[p] == 0) {
                       g.push(p);
                       a[p] = 1;
                       break;
                   }
               }
            } 
        }
        return count;
    }
};
  • 深度优先搜索DFS
class Solution {
public:
    int findCircleNum(vector<vector<int>>& M) {
        int n = M.size();
        vector<int> a(n);
        int count = 0;

        for(int i = 0; i < n; i++) {
            if(a[i] == 0) {
                dfs(i,M,a);
                count ++;
            }

        }

        return count;

    }

    void dfs(int i,vector<vector<int>>& M, vector<int>& a){
        a[i] = 1;
        for(int j = 0; j < a.size(); j++) {
            if(M[i][j] == 1 && a[j] == 0){
                dfs(j,M,a);
            }
        }
    }


};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值