static void Method(string[] args) { int[] hw = ReadInts(); int h = hw[0]; int w = hw[1]; bool[,] grid = new bool[h, w]; for (int i = 0; i < h; i++) { string s = Read(); for (int j = 0; j < w; j++) { grid[i, j] = s[j] == '.'; } } int all = h * w; /*int res = 0; * for(int i = 0; i < all; i++) * { * for(int j = 0; j < all; j++) * { * if (!grid[i / w, i % w] || !grid[j / w, j % w]) continue; * Queue<int[]> que = new Queue<int[]>(); * que.Enqueue(new int[2] { i, 0 }); * bool[,] visited = new bool[h, w]; * while (que.Count > 0) * { * int[] val = que.Dequeue(); * int now = val[0]; * int cost = val[1]; * if (visited[now / w, now % w]) continue; * if (now == j) * { * res = Max(res, cost); * break; * } * * if (now / w > 0 && grid[now / w - 1, now % w] * && !visited[now / w - 1, now % w]) * { * que.Enqueue(new int[2] { now - w, cost + 1 }); * } * if (now / w + 1 < h && grid[now / w + 1, now % w] * && !visited[now / w + 1, now % w]) * { * que.Enqueue(new int[2] { now + w, cost + 1 }); * } * if (now %w>0 && grid[now / w, now % w-1] * && !visited[now / w, now % w-1]) * { * que.Enqueue(new int[2] { now - 1, cost + 1 }); * } * if (now % w+1< w && grid[now / w, now % w + 1] * && !visited[now / w, now % w + 1]) * { * que.Enqueue(new int[2] { now + 1, cost + 1 }); * } * } * } * } * WriteLine(res); */ WarshallFloyd warshall = new WarshallFloyd(all); for (int i = 0; i < all; i++) { for (int j = 0; j < all; j++) { warshall.costs[i, j] = int.MaxValue; if (i == j) { warshall.costs[i, j] = 0; } if ((i / w > 0 && i - j == w) || (i / w + 1 < h && j - i == w) || (i % w > 0 && i - j == 1) || (i % w + 1 < w && j - i == 1)) { warshall.costs[i, j] = 1; } } } warshall.Calculate(grid, w); long res = 0; for (int i = 0; i < all; i++) { for (int j = 0; j < all; j++) { if (!grid[i / w, i % w] || !grid[j / w, j % w]) { continue; } if (warshall.costs[i, j] == int.MaxValue) { continue; } res = Max(res, warshall.costs[i, j]); } } WriteLine(res); }
static void Solve(IO io) { var n = io.I; var a = new long[n, n]; var gr = new AdjacencyMatrix <long>(n, new Monoid <long>(0, Sum), new Monoid <long>(long.MaxValue, Min)); for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { gr[i, j] = a[i, j] = io.L; } } var wf = new WarshallFloyd <long>(gr); wf.Calculate(); var sum = 0L; for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { sum += wf.GetMinCost(i, j); } } if (a.Cast <long>().Sum() != sum) { io.Write(-1); return; } var ans = 0L; for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { var flg = true; for (var k = 0; k < n; k++) { if (i == j || i == k || j == k) { continue; } if (a[i, j] >= a[i, k] + a[k, j]) { flg = false; break; } // Error.WriteLine($"{i} {j} {k} {a[i, j]} {a[i, k]} {a[k, j]} {(a[i, j] < a[i, k] + a[k, j] ? '!' : ' ')}"); } if (flg) { ans += a[i, j]; } } } io.Write(ans >> 1); }