您的位置:首页 > 其它

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

2017-06-27 00:17 239 查看

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);
}
}
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: