コード例 #1
0
ファイル: D.cs プロジェクト: sono8stream/AtPractice
        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);
        }
コード例 #2
0
ファイル: 1600825.cs プロジェクト: qifanyyy/CLCDSA
    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);
    }