#include #include #include #include using namespace std; const int D1[] = {0, -1}, D2[] = {-1, 0}; int N, M; char A[512][512]; bool is[502][502]; int nod[512][512]; vector V[250010]; int nodes; bool S[250002]; int niv[250002], T[250002]; int gomin[250002], result; void Dfs(int x) { S[x] = true; gomin[x] = 0x3f3f3f3f; for (vector::iterator it = V[x].begin(); it != V[x].end(); ++it) { if (!S[*it]) { niv[*it] = niv[x] + 1; T[*it] = x; Dfs(*it); } if (T[x] != *it) gomin[x] = min(gomin[x], min(niv[*it], gomin[*it])); } if (gomin[x] <= niv[x]) ++result; } int main() { cin.sync_with_stdio(false); cin >> N >> M; for (int i = 1; i <= N; ++i) cin >> (A[i] + 1); for (int i = 1; i <= N; ++i) for (int j = 1; j <= M; ++j) if (A[i][j] == '1') { nod[i][j] = ++nodes; for (int k = 0; k < 2; ++k) if (A[i + D1[k]][j + D2[k]] == '1') { V[nod[i][j]].push_back(nod[i + D1[k]][j + D2[k]]); V[nod[i + D1[k]][j + D2[k]]].push_back(nod[i][j]); } } for (int i = 1; i <= nodes; ++i) if (!S[i]) Dfs(i); cout << result << '\n'; }