题目:
一月份看来是个图论月了。
这道题其实学过离散数学的话就不难。就是一道给定邻接矩阵去找连通分量的题目。用广度优先或者深度优先都能解决。这里我使用的是深度优先。
官方题解比较精炼,我就拿来标上注释直接用了,自己写的太难看。
C++代码(附带测试):
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
void dfs(vector<vector<int>>& isConnected, vector<int>& visited, int provinces, int i) {
for (int j = 0; j < provinces; j++) {
if (isConnected[i][j] == 1 && !visited[j]) {//属于同一个联通分量且没有被访问过
visited[j] = 1;
dfs(isConnected, visited, provinces, j);
}
}
}
int findCircleNum(vector<vector<int>>& isConnected) {
int provinces = isConnected.size();
vector<int> visited(provinces);
int circles = 0;//数量
for (int i = 0; i < provinces; i++) {//深度优先遍历
if (!visited[i]) {
dfs(isConnected, visited, provinces, i);
circles++;
}
}
return circles;
}
};
int main()
{
vector<vector<int>> isConnected = {{1,1,0},{1,1,0},{0,0,1}};
Solution s;
cout<<s.findCircleNum(isConnected)<<endl;
}