void Solve() { //input H = io.Int; W = io.Int; c = new int[10, 10]; A = new int[H, W]; for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { c[i, j] = io.Int; } } for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { A[i, j] = io.Int; } } //cal var wf = new WarshallFloyd(10, false); for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { wf.AddPath(i, j, c[i, j]); } } wf.Run(); var ans = 0L; for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { if (A[i, j] != -1) { ans += wf.MinCost(A[i, j], 1); } } } //ret WriteLine(ans); }
void Solve() { io.i(out h, out w); io.ini(out c, 10, 10); io.ini(out a, h, w); var wf = new WarshallFloyd(10, false); c.Fun((i, j) => wf.AddPath(i, j, c[i, j])); wf.Run(); var score = 0L; a.Fun((i, j) => { if (a[i, j] != -1) { score += wf.MinCost(a[i, j], 1); } }); score.Prt(); }
public override IEnumerable <object> Solve(TextReader inputStream) { var(citiesCount, roadsCount, tankCapacity) = inputStream.ReadValue <int, int, int>(); var roadGraph = new WeightedGraph(citiesCount); for (int i = 0; i < roadsCount; i++) { var(a, b, fuel) = inputStream.ReadValue <int, int, int>(); a--; b--; roadGraph.AddEdge(new WeightedEdge(a, b, fuel)); roadGraph.AddEdge(new WeightedEdge(b, a, fuel)); } var distanceWarshallFloyd = new WarshallFloyd <BasicNode, WeightedEdge>(roadGraph); var distances = distanceWarshallFloyd.GetDistances(); // こっちの初期化手法はあまり使わないか…… var refuelEdges = Enumerable.Range(0, citiesCount) .SelectMany(from => Enumerable.Range(0, citiesCount) .Select(to => new { from, to }) .Where(pair => distances[pair.from, pair.to] <= tankCapacity) .Select(pair => new WeightedEdge(pair.from, pair.to))); var refuelGraph = new WeightedGraph(citiesCount, refuelEdges); var refuelWarshallFloyd = new WarshallFloyd <BasicNode, WeightedEdge>(refuelGraph); var refuelCounts = refuelWarshallFloyd.GetDistances(); var queries = inputStream.ReadInt(); for (int q = 0; q < queries; q++) { var(from, to) = inputStream.ReadValue <int, int>(); from--; to--; var refuelCount = refuelCounts[from, to]; var output = refuelCount < long.MaxValue ? (refuelCount - 1).ToString() : (-1).ToString(); } yield return(string.Empty); }
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); }