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); }
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..]));
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))); }
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]));
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)))); }
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)); }
public WeightedResult BfsMod(int m, int startVertex, int endVertex = -1) { return(ShortestPathCore.BfsMod(m, VertexesCount, v => this[v], startVertex, endVertex)); }
public WeightedResult Dijkstra(int startVertex, int endVertex = -1) { return(ShortestPathCore.Dijkstra(VertexesCount, v => this[v], startVertex, endVertex)); }
public WeightedResult BfsMod(int m, Point startVertex, Point endVertex) { return(ShortestPathCore.BfsMod(m, Height, Width, v => this[v], startVertex, endVertex)); }
public WeightedResult Dijkstra(Point startVertex, Point endVertex) { return(ShortestPathCore.Dijkstra(Height, Width, v => this[v], startVertex, endVertex)); }
public UnweightedResult Bfs(Point startVertex, Point endVertex) { return(ShortestPathCore.Bfs(Height, Width, v => this[v], startVertex, endVertex)); }