마법의 나무

방향 그래프에서 정점을 하나씩 마법으로 만들고, 마법이거나 보호받는 정점이 자신이 좋아하는 정점을 보호할 때, 마법이면서 보호받지 않는 정점 수의 최댓값을 구한다.

보통6그래프그리디아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

도현이는 나무를 마법의 나무로 바꾸는 인큐베이터를 하나 가지고 있다.

도현이의 화단에는 나무가 NN개 있고, 1번부터 NN번까지 번호가 매겨져 있다. 일부 나무는 다른 나무를 좋아한다. 이 좋아함은 대칭이 아니고, 자기 자신을 좋아하는 나무도 있을 수 있다. 나무 ii가 나무 jj를 좋아하면 Li,j=1L_{i,j} = 1이고, 그렇지 않으면 Li,j=0L_{i,j} = 0이다.

모든 나무에는 속성이 두 개 있다. isMagical은 마법의 나무이면 True, 아니면 False이다. isProtected는 다른 나무에게 보호받고 있으면 True, 아니면 False이다. 처음에는 모든 나무의 isMagical과 isProtected가 False이다.

도현이는 나무 하나를 골라 그 나무의 isMagical을 False에서 True로 바꿀 수 있다. 이렇게 나무 하나를 마법의 나무로 바꾸면 아래 변화가 연쇄적으로 일어난다.

  • isMagical이 True인 나무 ii는 자신이 좋아하는 나무 jj를 보호한다. 즉, Li,j=1L_{i,j} = 1이면 나무 jj의 isProtected가 True로 바뀐다.
  • isProtected가 True인 나무 ii는 자신이 좋아하는 나무 jj를 보호한다. 즉, Li,j=1L_{i,j} = 1이면 나무 jj의 isProtected가 True로 바뀐다.

더 이상 바뀌는 나무가 없을 때까지 이 변화가 이어진다. 변화가 모두 끝나면 도현이는 다시 나무 하나를 마법의 나무로 바꾼다. 이 과정을 원하는 만큼 반복한다.

도현이는 마법의 나무이면서 보호받지 않는 나무의 수를 최대로 만들려고 한다. 즉, isMagical이 True이고 isProtected가 False인 나무의 수를 가장 많게 하려고 한다. 그 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 나무의 수 NN (1N501 \le N \le 50)이 주어진다.

다음 NN개 줄에는 길이가 NN인 0과 1로 이루어진 문자열이 한 줄씩 주어진다. ii번째 줄의 jj번째 문자가 Li,jL_{i,j}이다.

출력

마법의 나무이면서 보호받지 않는 나무의 수의 최댓값을 출력한다.

힌트

나무가 두 개이고 1번 나무만 2번 나무를 좋아하는 경우에는 1번 나무를 마법의 나무로 바꾸면 된다. 1번 나무는 마법의 나무이면서 보호받지 않는다.

나무가 세 개이고 1번이 2번을, 2번이 3번을 좋아하는 경우에는 3번 나무를 먼저 마법의 나무로 바꾸고, 이어서 1번 나무를 마법의 나무로 바꾼다. 그러면 1번이 2번을 보호하고, 2번이 3번을 보호한다. 1번 나무는 마법의 나무이면서 보호받지 않고, 2번 나무는 일반 나무이면서 보호받고, 3번 나무는 마법의 나무이면서 보호받는다.