#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define MAXN 550 #define INF 100000000 int N, M; char S[MAXN]; int A[MAXN][MAXN]; int idx[MAXN][MAXN]; int low[MAXN][MAXN]; int ans, crtIdx; int di[] = { 0, 1, 0, -1 }; int dj[] = { 1, 0, -1, 0 }; void dfs(int pi, int pj, int prev) { idx[pi][pj] = ++crtIdx; low[pi][pj] = INF; for(int d = 0; d < 4; d++) { int ni = pi + di[d]; int nj = pj + dj[d]; if(ni >= 0 && ni < N && nj >= 0 && nj < M && A[ni][nj] == 1 && idx[ni][nj] != prev) { if(idx[ni][nj] == 0) { dfs(ni, nj, idx[pi][pj]); low[pi][pj] = min(low[pi][pj], low[ni][nj]); } else low[pi][pj] = min(low[pi][pj], idx[ni][nj]); } } if(low[pi][pj] <= idx[pi][pj]) ans++; } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); scanf("%d %d\n", &N, &M); for(int i = 0; i < N; i++) { fgets(S, sizeof(S), stdin); for(int j = 0; j < M; j++) A[i][j] = (S[j] == '1'); } crtIdx = 0; ans = 0; for(int i = 0; i < N; i++) for(int j = 0; j < M; j++) if(idx[i][j] == 0 && A[i][j] == 1) dfs(i, j, -1); printf("%d\n", ans); return 0; }