예제 #1
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);
    }
예제 #2
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..]));
예제 #3
0
    static void Main()
    {
        var(n, m) = Read2();
        var es = Array.ConvertAll(new bool[m], _ => Read());

        var map = EdgesToMap2(n + 1, es, false);

        // 辺を静的に構築すると MLE。
        var r = ShortestPathCore.Dijkstra(n + 1, 51, v =>
        {
            if (v.j == 0)
            {
                return(Array.ConvertAll(map[v.i].ToArray(), e => new Edge(v, (e[1], e[2]), 0)));
            }
예제 #4
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]));
예제 #5
0
    static void Main()
    {
        var(n, m) = Read2();
        var es = Array.ConvertAll(new bool[m], _ => (Edge)Read());

        var map = new WeightedMap(n + 1, es, false);

        var id      = n;
        var idMap   = new int[n + 1, 51];
        var idMap_r = new List <(int v, long w)>(Enumerable.Range(0, n + 1).Select(i => (i, 0L)));

        void InitId(int v, long w)
        {
            if (idMap[v, w] != 0)
            {
                return;
            }
            idMap[v, w] = ++id;
            idMap_r.Add((v, w));
        }

        foreach (var(v, u, w) in es)
        {
            InitId(v, w);
            InitId(u, w);
        }

        // 辺を静的に構築すると MLE。
        var r = ShortestPathCore.Dijkstra(id + 1, v =>
        {
            if (v <= n)
            {
                return(Array.ConvertAll(map[v], e => new Edge(v, idMap[e.To, e.Cost], 0)));
            }
            else
            {
                var(v0, w) = idMap_r[v];
                return(Array.ConvertAll(map[v0], e => new Edge(v, e.To, (w + e.Cost) * (w + e.Cost))));
            }
        }, 1);

        Console.WriteLine(string.Join(" ", Enumerable.Range(1, n).Select(v => r.GetCost(v))));
    }
예제 #6
0
        public static UnweightedResult Bfs(int vertexesCount, int[][] edges, bool directed, int startVertexId, int endVertexId = -1)
        {
            var map = UnweightedEdgesToMap(vertexesCount, edges, directed);

            return(ShortestPathCore.Bfs(vertexesCount, v => map[v], startVertexId, endVertexId));
        }
예제 #7
0
 public WeightedResult BfsMod(int m, int startVertex, int endVertex = -1)
 {
     return(ShortestPathCore.BfsMod(m, VertexesCount, v => this[v], startVertex, endVertex));
 }
예제 #8
0
 public WeightedResult Dijkstra(int startVertex, int endVertex = -1)
 {
     return(ShortestPathCore.Dijkstra(VertexesCount, v => this[v], startVertex, endVertex));
 }
예제 #9
0
 public WeightedResult BfsMod(int m, Point startVertex, Point endVertex)
 {
     return(ShortestPathCore.BfsMod(m, Height, Width, v => this[v], startVertex, endVertex));
 }
예제 #10
0
 public WeightedResult Dijkstra(Point startVertex, Point endVertex)
 {
     return(ShortestPathCore.Dijkstra(Height, Width, v => this[v], startVertex, endVertex));
 }
예제 #11
0
 public UnweightedResult Bfs(Point startVertex, Point endVertex)
 {
     return(ShortestPathCore.Bfs(Height, Width, v => this[v], startVertex, endVertex));
 }