connected components
wikipedia
solution:
class Solution {
public:
int countComponents(int N, vector<vector<int>>& edges) {
vector< vector<int> > AL(N);
vector<int> seen(N);
for (const vector<int>& e : edges) {
AL[e[0]].push_back(e[1]);
AL[e[1]].push_back(e[0]);
}
int cnt = 0;
for (int i = 0;i < N;++i) {
if (!seen[i]) {
++cnt;
stack<int> s;
s.push(i);
seen[i] = 1;
while (!s.empty()) {
int v = s.top();
s.pop();
for (int o : AL[v]) {
if (!seen[o]) s.push(o);
seen[o] = 1;
}
}
}
}
return cnt;
}
};
solution:
#include<iostream>
#include<vector>
#include<stack>
#include<string>
using namespace std;
#define REP(i,N) for (int i = 0;i < N;++i)
#define ll long long
bool inBounds(const pair<int, int>& p, int N, int M) {
return p.first >= 0 && p.first < N && p.second >= 0 && p.second < M;
}
int main() {
int N, M;
cin >> N >> M;
vector<string> A(N);
REP(i, N) {
cin >> A[i];
}
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
stack<pair<int, int> > st;
vector< vector<int> > seen(N, vector<int>(M));
int out = 0;
REP(i, N) {
REP(j, M) {
if (A[i][j] == '.') {
st.push({i, j});
}
}
}
while (!st.empty()) {
pair<int, int> p = st.top();
st.pop();
if (!seen[p.first][p.second]) {
++out;
seen[p.first][p.second] = 1;
}
REP(i, 4) {
pair<int, int> next(p.first + dx[i], p.second + dy[i]);
if (inBounds(next, N, M) && A[next.first][next.second] == '.' && !seen[next.first][next.second]) {
seen[next.first][next.second] = 1;
st.push(next);
}
}
}
cout << out << endl;
}