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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
#define rep(i, n) for(ll (i) = 0; (i) < (n); (i)++)
#define rep1(i, n) for(ll (i) = 1; (i) <= (n); (i)++)
#define rrep(i, n) for(ll (i) = (n) - 1; (i) >= 0; (i)--)
#define rrep1(i, n) for(ll (i) = (n); (i) >= 1; (i)--)
const ll INF = 1145141919;
const ll MOD = 1000000007;
template<class T> void chmax(T &a, const T &b){if(a < b){a = b;}}
template<class T> void chmin(T &a, const T &b){if(a > b){a = b;}}

char mp[222][222];

ll b_flg[222][2];

int main(){

    ll N;
    cin >> N;
    rep1(i, N)rep1(j, N)cin >> mp[i][j];
    queue<P>Q;
    Q.push(P(1, 0));
    b_flg[1][0] = 1;
    while(!Q.empty()){
        ll idx = Q.front().first;
        ll b = Q.front().second;
        ll nxt_b = 1 ^ b;
        Q.pop();
        rep1(to, N){
            if(mp[idx][to] == '0')continue;
            if(b_flg[to][nxt_b] == 0){
                b_flg[to][nxt_b] = 1;
                Q.push(P(to, nxt_b));
            }
        }
    }
    rep1(i, N)if(b_flg[i][0] && b_flg[i][1]){
        cout << -1 << endl;
        return 0;
    }
    vector<ll>dep(N + 1, -1);
    dep[1] = 1;
    ll t_idx = 1;
    queue<ll>q;
    q.push(1);
    while(!q.empty()){
        ll idx = q.front();
        q.pop();
        if(dep[idx] > dep[t_idx])t_idx = idx;
        rep1(to, N){
            if(mp[idx][to] == '0')continue;
            if(dep[to] < 0){
                dep[to] = dep[idx] + 1;
                q.push(to);
            }
        }
    }
    dep = vector<ll>(N + 1, -1);
    dep[t_idx] = 1;
    q.push(t_idx);
    while(!q.empty()){
        ll idx = q.front();
        q.pop();
        if(dep[idx] > dep[t_idx])t_idx = idx;
        rep1(to, N){
            if(mp[idx][to] == '0')continue;
            if(dep[to] < 0){
                dep[to] = dep[idx] + 1;
                q.push(to);
            }
        }
    }
    cout << dep[t_idx] << endl;

    return 0;
}