Exemple #1
0
    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);
    }
Exemple #2
0
    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();
    }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
    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);
    }