type InfiniteInt =
| Real of int
| Infinity
with
member this.toString =
match this with
| Real(n) -> n.ToString()
| Infinity -> "Infinity"
let inline (+) (x : InfiniteInt) (y : InfiniteInt) =
match (x, y) with
| (Infinity, _) -> Infinity
| (_, Infinity) -> Infinity
| (Real(n), Real(m)) -> Real(n + m)
let inline (>) (x : InfiniteInt) (y : InfiniteInt) =
match (x, y) with
| (Infinity, Real(_)) -> true
| (Infinity, Infinity) -> false
| (Real(_), Infinity) -> false
| (Real(n), Real(m)) -> n > m
let split (c : char) (n : System.String) = n.Split(c)
[<EntryPoint>]
let main argv =
let vertexes = int (System.Console.ReadLine())
let adjMatrix = Array2D.init<InfiniteInt> vertexes vertexes (fun _ __ -> Infinity)
for x in [0..(vertexes - 1)] do
adjMatrix.[x, x] <- Real(0)
let line = System.Console.ReadLine() |> split ' '
for y in [0 .. (Array.length line) - 1] do if line.[y] = "1" then adjMatrix.[x,y] <- Real(1)
for x in [0..(vertexes - 1)] do
for y in [0..(vertexes - 1)] do
for z in [0..(vertexes - 1)] do
let sum = adjMatrix.[y,x] + adjMatrix.[x, z]
if adjMatrix.[y, z] > sum then adjMatrix.[y, z] <- sum
let radius =
let maxRadiuses =
[for x in [0..(vertexes - 1)]
->
[for y in [0..(vertexes - 1)] -> adjMatrix.[x, y]] |> List.max
]
maxRadiuses |> List.min
printfn "%s" radius.toString
0
dHlwZSBJbmZpbml0ZUludCA9CiAgICB8IFJlYWwgb2YgaW50CiAgICB8IEluZmluaXR5CiAgICB3aXRoCiAgICAgICAgbWVtYmVyIHRoaXMudG9TdHJpbmcgPSAKICAgICAgICAgICAgbWF0Y2ggdGhpcyB3aXRoCiAgICAgICAgICAgIHwgUmVhbChuKSAtPiBuLlRvU3RyaW5nKCkKICAgICAgICAgICAgfCBJbmZpbml0eSAtPiAiSW5maW5pdHkiCgpsZXQgaW5saW5lICgrKSAoeCA6IEluZmluaXRlSW50KSAoeSA6IEluZmluaXRlSW50KSA9IAogICAgbWF0Y2ggKHgsIHkpIHdpdGgKICAgIHwgKEluZmluaXR5LCBfKSAtPiBJbmZpbml0eQogICAgfCAoXywgSW5maW5pdHkpIC0+IEluZmluaXR5CiAgICB8IChSZWFsKG4pLCBSZWFsKG0pKSAtPiBSZWFsKG4gKyBtKQoKbGV0IGlubGluZSAoPikgKHggOiBJbmZpbml0ZUludCkgKHkgOiBJbmZpbml0ZUludCkgPSAKICAgIG1hdGNoICh4LCB5KSB3aXRoCiAgICB8IChJbmZpbml0eSwgUmVhbChfKSkgLT4gdHJ1ZQogICAgfCAoSW5maW5pdHksIEluZmluaXR5KSAtPiBmYWxzZQogICAgfCAoUmVhbChfKSwgSW5maW5pdHkpIC0+IGZhbHNlCiAgICB8IChSZWFsKG4pLCBSZWFsKG0pKSAtPiBuID4gbQoKbGV0IHNwbGl0IChjIDogY2hhcikgKG4gOiBTeXN0ZW0uU3RyaW5nKSA9IG4uU3BsaXQoYykKCls8RW50cnlQb2ludD5dCmxldCBtYWluIGFyZ3YgPSAKICAgIGxldCB2ZXJ0ZXhlcyA9IGludCAoU3lzdGVtLkNvbnNvbGUuUmVhZExpbmUoKSkKICAgIGxldCBhZGpNYXRyaXggPSBBcnJheTJELmluaXQ8SW5maW5pdGVJbnQ+IHZlcnRleGVzIHZlcnRleGVzIChmdW4gXyBfXyAtPiBJbmZpbml0eSkKICAgIGZvciB4IGluIFswLi4odmVydGV4ZXMgLSAxKV0gZG8KICAgICAgICBhZGpNYXRyaXguW3gsIHhdIDwtIFJlYWwoMCkKICAgICAgICBsZXQgbGluZSA9IFN5c3RlbS5Db25zb2xlLlJlYWRMaW5lKCkgfD4gc3BsaXQgJyAnCiAgICAgICAgZm9yIHkgaW4gWzAgLi4gKEFycmF5Lmxlbmd0aCBsaW5lKSAtIDFdIGRvIGlmIGxpbmUuW3ldID0gIjEiIHRoZW4gYWRqTWF0cml4Llt4LHldIDwtIFJlYWwoMSkgCiAgICBmb3IgeCBpbiBbMC4uKHZlcnRleGVzIC0gMSldIGRvCiAgICAgICAgZm9yIHkgaW4gWzAuLih2ZXJ0ZXhlcyAtIDEpXSBkbwogICAgICAgICAgICBmb3IgeiBpbiBbMC4uKHZlcnRleGVzIC0gMSldIGRvCiAgICAgICAgICAgICAgICBsZXQgc3VtID0gYWRqTWF0cml4Llt5LHhdICsgYWRqTWF0cml4Llt4LCB6XQogICAgICAgICAgICAgICAgaWYgYWRqTWF0cml4Llt5LCB6XSA+IHN1bSB0aGVuIGFkak1hdHJpeC5beSwgel0gPC0gc3VtCiAgICBsZXQgcmFkaXVzID0KICAgICAgICBsZXQgbWF4UmFkaXVzZXMgPSAKICAgICAgICAgICAgW2ZvciB4IGluIFswLi4odmVydGV4ZXMgLSAxKV0gCiAgICAgICAgICAgICAgICAtPgogICAgICAgICAgICAgICAgICAgIFtmb3IgeSBpbiBbMC4uKHZlcnRleGVzIC0gMSldIC0+IGFkak1hdHJpeC5beCwgeV1dIHw+IExpc3QubWF4CiAgICAgICAgICAgIF0KICAgICAgICBtYXhSYWRpdXNlcyB8PiBMaXN0Lm1pbgogICAgcHJpbnRmbiAiJXMiIHJhZGl1cy50b1N0cmluZwogICAgMCA=
MTAKMCAxIDAgMCAxIDEgMCAwIDAgMAoxIDAgMSAwIDAgMCAxIDAgMCAwCjAgMSAwIDEgMCAwIDAgMSAwIDAKMCAwIDEgMCAxIDAgMCAwIDEgMAoxIDAgMCAxIDAgMCAwIDAgMCAxCjEgMCAwIDAgMCAwIDAgMSAxIDAKMCAxIDAgMCAwIDAgMCAwIDEgMQowIDAgMSAwIDAgMSAwIDAgMCAxCjAgMCAwIDEgMCAxIDEgMCAwIDAKMCAwIDAgMCAxIDAgMSAxIDAgMAo=
10
0 1 0 0 1 1 0 0 0 0
1 0 1 0 0 0 1 0 0 0
0 1 0 1 0 0 0 1 0 0
0 0 1 0 1 0 0 0 1 0
1 0 0 1 0 0 0 0 0 1
1 0 0 0 0 0 0 1 1 0
0 1 0 0 0 0 0 0 1 1
0 0 1 0 0 1 0 0 0 1
0 0 0 1 0 1 1 0 0 0
0 0 0 0 1 0 1 1 0 0