Problem:
Score : 500 points

Problem Statement

Given is a connected undirected graph with N vertices and M edges. The vertices are numbered 1 to N, and the edges are described by a grid of characters S.
If S_{i,j} is 1, there is an edge connecting Vertex i and j; otherwise, there is no such edge.

Determine whether it is possible to divide the vertices into non-empty sets V_1, \dots, V_k such that the following condition is satisfied. If the answer is yes, find the maximum possible number of sets, k, in such a division.

Every edge connects two vertices belonging to two "adjacent" sets. More formally, for every edge (i,j), there exists 1\leq t\leq k-1 such that i\in V_t,j\in V_{t+1} or i\in V_{t+1},j\in V_t holds.

Constraints

2 \leq N \leq 200

S_{i,j} is 0 or 1.

S_{i,i} is 0.

S_{i,j}=S_{j,i}

The given graph is connected.

N is an integer.

Input

Input is given from Standard Input in the following format:

N
S_{1,1}...S_{1,N}
:
S_{N,1}...S_{N,N}

Output

If it is impossible to divide the vertices into sets so that the condition is satisfied, print -1.
Otherwise, print the maximum possible number of sets, k, in a division that satisfies the condition.

Sample Input 1

2
01
10

Sample Output 1

2

We can put Vertex 1 in V_1 and Vertex 2 in V_2.

Sample Input 2

3
011
101
110

Sample Output 2

-1

Sample Input 3

6
010110
101001
010100
101000
100000
010000

Sample Output 3

4

Solution in C (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <stdio.h>
#include <string.h>
#define NUM 210

int search(int now,int num);

int adjmap[NUM][NUM];
int adjnum[NUM]={0};
int n,outflag=0;

int blst[NUM]={0};

int main()
{
	int i,j,k,l;

	char c[NUM];
	scanf("%d" ,&n);
	for(i=0;i<n;i++)
    {
	    scanf("%s",c);
	    for(j=0;j<n;j++)
        {
	        if(c[j]=='1')
            {
	            adjmap[i][adjnum[i]]=j;
                adjnum[i]++;
            }
        }
    }
	/*
	for(i=0;i<n;i++)
    {
	    for(j=0;j<adjnum[i];j++)
        {
	        printf("%d ",adjmap[i][j]+1);
        }
	    printf("\n");
    }
    */

	int max=-2;
	int karimax=-2;
	for(i=0;i<n;i++)
    {
	    for(j=0;j<n;j++)blst[j]=0;

	    blst[i]=1;

	    karimax=search(i,1);
	    if(max<karimax)max=karimax;
    }
	if(outflag)printf("-1");
	else printf("%d",max);
}

int search(int now,int num)
{
    int si,sj;
    for(si=0;si<adjnum[now];si++)
    {
        if(blst[adjmap[now][si]]==num)outflag=1;
        if(blst[adjmap[now][si]]==0)blst[adjmap[now][si]]=num+1;

    }
    int flag=0;

    for(sj=0;sj<n;sj++)
    {
        if(blst[sj]==0)flag=1;
    }
    if(flag==0)return num+1;

    int ans=-1;
    int kari=-1;

    for(si=0;si<adjnum[now];si++)
    {
        int next=adjmap[now][si];
        if(blst[next]!=0)continue;
        kari=search(next,num+1);
        if(kari>ans)ans=kari;
    }
    return ans;
}