Exemple #1
0
    static object Solve()
    {
        Console.ReadLine();
        var(n, m) = Read2();
        var map = GraphConsole.ReadUnweightedMap(n + 1, m, true);

        var r  = map.Bfs(1);
        var dp = r.RawCosts.ToArray();

        var q = Enumerable.Range(1, n).Select(v => (v, d: r[v])).OrderBy(t => - t.d);

        foreach (var(v, d) in q)
        {
            foreach (var nv in map[v])
            {
                if (r[nv] <= r[v])
                {
                    dp[v] = Math.Min(dp[v], r[nv]);
                }
                else
                {
                    dp[v] = Math.Min(dp[v], dp[nv]);
                }
            }
        }
        return(string.Join(" ", dp[1..]));
Exemple #2
0
    static object Solve()
    {
        Console.ReadLine();
        var(n, m) = Read2();
        var map = GraphConsole.ReadUnweightedMap(n + 1, m, true);

        var r  = map.Bfs(1);
        var dp = Array.ConvertAll(new bool[n + 1], _ => - 1L);

        void Dfs(int v)
        {
            if (dp[v] >= 0)
            {
                return;
            }
            dp[v] = r[v];

            foreach (var nv in map[v])
            {
                if (r[nv] <= r[v])
                {
                    dp[v] = Math.Min(dp[v], r[nv]);
                }
                else
                {
                    Dfs(nv);
                    dp[v] = Math.Min(dp[v], dp[nv]);
                }
            }
        }

        Dfs(1);
        return(string.Join(" ", dp[1..]));
Exemple #3
0
    static object Solve()
    {
        var(n, m) = Read2();
        var es = GraphConsole.ReadEdges(m);
        var k  = int.Parse(Console.ReadLine());
        var p  = Read();

        var map   = new UnweightedMap(n + 1, es, true);
        var map_r = new UnweightedMap(n + 1, Array.ConvertAll(es, e => e.Reverse()), true);

        var r = map_r.Bfs(p.Last());

        var(min, max) = (0, 0);

        for (int i = 0; i < k - 1; i++)
        {
            if (r[p[i]] <= r[p[i + 1]])
            {
                min++;
                max++;
            }
            else
            {
                if (map[p[i]].Count(v => r[v] < r[p[i]]) > 1)
                {
                    max++;
                }
            }
        }
        return($"{min} {max}");
    }
Exemple #4
0
    static void Main()
    {
        var(n, m, s, t) = Read4();
        var p   = Read();
        var map = GraphConsole.ReadUnweightedMap(n + 1, m, false);

        int x = p[s - 1], y = 0;
        var u = new bool[n + 1];
        var q = PriorityQueue <int> .CreateWithKey(v => p[v - 1], true);

        u[s] = true;
        q.Push(s);

        while (q.Any)
        {
            var(v, pv) = q.Pop();
            if (x > pv)
            {
                x = pv;
                y++;
            }

            foreach (var nv in map[v])
            {
                if (u[nv])
                {
                    continue;
                }
                u[nv] = true;
                q.Push(nv);
            }
        }
        Console.WriteLine(y);
    }
Exemple #5
0
    static void Main()
    {
        var(h, w) = Read2();
        var s = GraphConsole.ReadEnclosedGrid(ref h, ref w);

        var sv = (h - 2, w - 1);
        var ev = (1, 1);

        var r = ShortestPath.ForGrid(h, w)
                .ForWeightedMap(v =>
        {
            var nes = new List <Edge <Point> >();
            var uv  = v - new Point(1, 0);
            var lv  = v - new Point(0, 1);
            if (s.GetValue(uv) != '#')
            {
                nes.Add(new Edge <Point>(v, uv, s.GetValue(uv) == 'S' ? 0 : 1));
            }
            if (s.GetValue(lv) != '#')
            {
                nes.Add(new Edge <Point>(v, lv, s.GetValue(lv) == 'E' ? 0 : 1));
            }
            return(nes.ToArray());
        })
                .BfsMod(2, sv, ev);

        Console.WriteLine(r[ev]);
    }
Exemple #6
0
    static void Main()
    {
        var(h, w) = Read2();
        var z  = Read();
        var sv = (z[0], z[1]);
        var ev = (z[2], z[3]);
        var s  = GraphConsole.ReadEnclosedGrid(ref h, ref w);

        var r1 = ShortestPath.ForGrid(h, w)
                 .ForUnweightedMap(v =>
        {
            var nvs = (v.i + v.j) % 2 == 0 ? Nexts1(v) : Nexts2(v);
            return(Array.FindAll(nvs, nv => s.GetValue(nv) != '#'));
        })
                 .Bfs(sv, ev);
        var r2 = ShortestPath.ForGrid(h, w)
                 .ForUnweightedMap(v =>
        {
            var nvs = (v.i + v.j) % 2 != 0 ? Nexts1(v) : Nexts2(v);
            return(Array.FindAll(nvs, nv => s.GetValue(nv) != '#'));
        })
                 .Bfs(sv, ev);

        var m = Math.Min(r1[ev], r2[ev]);

        Console.WriteLine(m == long.MaxValue ? -1 : m);

        Point[] Nexts1(Point v) => new[] { new Point(v.i - 1, v.j), new Point(v.i + 1, v.j) };
        Point[] Nexts2(Point v) => new[] { new Point(v.i, v.j - 1), new Point(v.i, v.j + 1) };
    }
Exemple #7
0
    static void Main()
    {
        var(n, m) = Read2();
        var map = GraphConsole.ReadUnweightedMap(n + 1, m, false);

        var r = map.Bfs(1);

        Console.WriteLine("Yes");
        Console.WriteLine(string.Join("\n", r.RawInVertexes[2..]));
Exemple #8
0
    static object Solve()
    {
        var(n, m) = Read2();
        var map = GraphConsole.ReadWeightedMap(n + 1, m, false);

        var r1 = map.Dijkstra(1);
        var r2 = map.Dijkstra(n);

        return(string.Join("\n", Enumerable.Range(1, n).Select(v => r1[v] + r2[v])));
    }
Exemple #9
0
    static object Solve()
    {
        var(h, w) = Read2();
        var sp = GraphConsole.ReadPoint();
        var ep = GraphConsole.ReadPoint();
        var s  = GraphConsole.ReadEnclosedGrid(ref h, ref w);

        int ToId(Point p) => p.i * w + p.j;
        int ToId2(int i, int j) => i * w + j;
        Point FromId(int id) => new Point(id / w, id % w);

        var u_tate = new bool[h, w];
        var u_yoko = new bool[h, w];

        var r = ShortestPathCore.Bfs(h * w, pid =>
        {
            var(pi, pj) = FromId(pid);

            var nexts = new List <int>();

            if (!u_tate[pi, pj])
            {
                u_tate[pi, pj] = true;
                for (int i = pi - 1; i >= 0 && s[i][pj] == '.'; i--)
                {
                    u_tate[i, pj] = true;
                    nexts.Add(ToId2(i, pj));
                }
                for (int i = pi + 1; i < h && s[i][pj] == '.'; i++)
                {
                    u_tate[i, pj] = true;
                    nexts.Add(ToId2(i, pj));
                }
            }
            if (!u_yoko[pi, pj])
            {
                u_yoko[pi, pj] = true;
                for (int j = pj - 1; j >= 0 && s[pi][j] == '.'; j--)
                {
                    u_yoko[pi, j] = true;
                    nexts.Add(ToId2(pi, j));
                }
                for (int j = pj + 1; j < w && s[pi][j] == '.'; j++)
                {
                    u_yoko[pi, j] = true;
                    nexts.Add(ToId2(pi, j));
                }
            }

            return(nexts.ToArray());
        },
                                     ToId(sp), ToId(ep));

        return(r[ToId(ep)] - 1);
    }
Exemple #10
0
    static void Main()
    {
        var(n, m) = Read2();
        var map = GraphConsole.ReadWeightedMap(n + 1, m, true);

        var r = new long[n + 1];

        for (int ev = 1; ev <= n; ev++)
        {
            var result = ShortestPathCore.Dijkstra(n + 1, v => v == 0 ? map[ev] : map[v], 0, ev);
            r[ev] = result.GetCost(ev);
        }
        Console.WriteLine(string.Join("\n", r[1..]));
Exemple #11
0
    static object Solve()
    {
        var(n, m) = Read2();
        var map = GraphConsole.ReadUnweightedMap(n + 1, m, true);

        var r = 0;

        for (int v = 1; v <= n; v++)
        {
            var result = map.Bfs(v);
            r += result.RawCosts.Count(x => x != long.MaxValue);
        }

        return(r);
    }
Exemple #12
0
    static object Solve()
    {
        var(h, w) = Read2();
        var a = GraphConsole.ReadIntGrid(h);
        var b = GraphConsole.ReadIntGrid(h - 1);

        Point sv = (0, 0);
        Point ev = (h - 1, w - 1);

        var r = ShortestPathCore.Dijkstra(h * 2, w, v =>
        {
            var es = new List <Edge>();

            if (v.i < h)
            {
                if (v.j < w - 1)
                {
                    es.Add(new Edge(v, v + (0, 1), a[v]));
Exemple #13
0
    static void Main()
    {
        var(h, w) = Read2();
        var s = GraphConsole.ReadEnclosedGrid(ref h, ref w);

        var sv = (h - 2, w - 1);
        var ev = (1, 1);

        var grid = ShortestPath.ForGrid(h, w);
        var dp   = grid.CreateMap(int.MaxValue);

        dp[sv] = 0;

        var r = grid.ForUnweightedMap(v =>
        {
            if (v.i == 0 || v.j == 0)
            {
                return(new Point[0]);
            }

            var lv = v - (0, 1);
            var uv = v - (1, 0);

            if (v.j == w - 1)
            {
                var nlv = dp[v] + (s.GetValue(lv) == 'E' ? 0 : 1);
                dp[lv]  = Math.Min(dp[lv], nlv);

                return(new[] { lv });
            }
            else
            {
                var nlv = dp[v] + (s.GetValue(lv) == 'E' ? 0 : 1);
                dp[lv]  = Math.Min(dp[lv], nlv);
                var nuv = dp[v] + (s.GetValue(uv) == 'S' ? 0 : 1);
                dp[uv]  = Math.Min(dp[uv], nuv);

                return(new[] { lv, uv });
            }
        }).Bfs(sv, (-1, -1));

        Console.WriteLine(dp[ev]);
    }
Exemple #14
0
    static void Main()
    {
        var(h, w) = (4, 4);
        var s = GraphConsole.ReadGrid(h);

        var rhw      = Enumerable.Range(0, h * w).ToArray();
        var toHash   = GridHelper.CreateToHash(w);
        var fromHash = GridHelper.CreateFromHash(w);

        var sx = rhw
                 .Where(i => s.GetValue(fromHash(i)) == '#')
                 .Aggregate(0, (p, i) => p | (1 << i));

        var map = rhw.Select(id => new List <int> {
            id
        }).ToArray();

        for (int i = 0; i < h; i++)
        {
            for (int j = 1; j < w; j++)
            {
                map[toHash((i, j))].Add(toHash((i, j - 1)));
Exemple #15
0
    static void Main()
    {
        var(h, w) = Read2();
        Point sv = Read2();
        var   s  = GraphConsole.ReadEnclosedGrid(ref h, ref w);

        const string arrows = "v^><";
        var          spp    = ShortestPath.ForGrid(h, w)
                              .ForUnweightedMap(v =>
        {
            var nvs = new List <Point>();
            var nva = v.Nexts();

            for (int k = 0; k < 4; k++)
            {
                var(i, j) = nva[k];
                if (s[i][j] == '.' || s[i][j] == arrows[k])
                {
                    nvs.Add(nva[k]);
                }
            }
            return(nvs.ToArray());
        })
                              .Bfs(sv, (-1, -1));

        Console.SetOut(new System.IO.StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });
        for (int i = 1; i < h - 1; i++)
        {
            for (int j = 1; j < w - 1; j++)
            {
                Console.Write(s[i][j] == '#' ? '#' : spp.IsConnected((i, j)) ? 'o' : 'x');
            }
            Console.WriteLine();
        }
        Console.Out.Flush();
    }
Exemple #16
0
    static bool Solve()
    {
        var(h, w) = Read2();
        var s = GraphConsole.ReadGrid(h);
        var t = GraphConsole.ReadGrid(h);

        GridHelper.EncloseGrid(ref h, ref w, ref s, delta: 10);

        if (Matches())
        {
            return(true);
        }
        t = GridHelper.RotateLeft(t);
        if (Matches())
        {
            return(true);
        }
        t = GridHelper.RotateLeft(t);
        if (Matches())
        {
            return(true);
        }
        t = GridHelper.RotateLeft(t);
        if (Matches())
        {
            return(true);
        }

        return(false);

        bool Matches()
        {
            var(th, tw) = (t.Length, t[0].Length);
            for (int di = 0; di < h - th + 1; di++)
            {
                for (int dj = 0; dj < w - tw + 1; dj++)
                {
                    if (Matches2(di, dj))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }

        bool Matches2(int di, int dj)
        {
            var(th, tw) = (t.Length, t[0].Length);
            for (int i = 0; i < th; i++)
            {
                for (int j = 0; j < tw; j++)
                {
                    if (t[i][j] == '#' && s[i + di][j + dj] == '#')
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
    }
Exemple #17
0
 public static void OpenConsole()
 {
     GraphConsole.ShowWindow();
 }
Exemple #18
0
    static void Main()
    {
        var(h, w) = Read2();
        var s = GraphConsole.ReadGrid(h);

        var k = s.Sum(l => l.Count(x => x == '#'));

        var map = new GridListMap <Point>(h, w);

        for (int i = 0; i < h; i++)
        {
            for (int j = 1; j < w; j++)
            {
                Point v  = (i, j);
                Point nv = (i, j - 1);
                if (s.GetValue(v) == '#' && s.GetValue(nv) == '#')
                {
                    map.Add(v, nv);
                    map.Add(nv, v);
                }
            }
        }
        for (int j = 0; j < w; j++)
        {
            for (int i = 1; i < h; i++)
            {
                Point v  = (i, j);
                Point nv = (i - 1, j);
                if (s.GetValue(v) == '#' && s.GetValue(nv) == '#')
                {
                    map.Add(v, nv);
                    map.Add(nv, v);
                }
            }
        }

        var q = new Stack <Point>();
        var u = new GridMap <bool>(h, w, false);

        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
            {
                if (s[i][j] == '.')
                {
                    continue;
                }
                q.Clear();
                u = new GridMap <bool>(h, w, false);
                Dfs((i, j), (-1, -1));
            }
        }

        void Dfs(Point v, Point pv)
        {
            q.Push(v);
            u[v] = true;
            if (q.Count == k)
            {
                Console.WriteLine(k);
                Console.WriteLine(string.Join("\n", q.Select(p => p + (1, 1))));
                Environment.Exit(0);
            }

            foreach (var nv in map[v])
            {
                if (nv == pv)
                {
                    continue;
                }
                if (u[nv])
                {
                    continue;
                }
                Dfs(nv, v);
            }
            q.Pop();
            u[v] = false;
        }
    }