zer0-star / Nim-ACL

ACL (AtCoder Library) implementation in Nim
Creative Commons Zero v1.0 Universal
22 stars 3 forks source link

dijkstra.nimなどでinfが使われているが、infがimportされていないためエラーが起きる #35

Closed forest1102 closed 2 years ago

forest1102 commented 2 years ago

エラー

ac-library-nim/src/atcoder/extra/graph/dijkstra.nim(33, 28) Error: undeclared field: 'inf'

ソースコード

import sequtils,strutils,sugar
proc scanf(formatstr: cstring){.header: "<stdio.h>", varargs.}
proc getchar(): char {.header: "<stdio.h>", varargs.}
proc nextInt(): int = scanf("%lld",addr result)
proc nextFloat(): float = scanf("%lf",addr result)

import atcoder/extra/graph/graph_template
import atcoder/extra/graph/dijkstra

template times(n: int, body: untyped) =
  for _ in 0..<n:
    body

proc `$` [T](x: seq[T]): string = x.mapIt($it).join(" ")
proc `ceilDiv`[T: SomeInteger](x, y: T): T = x div y + ord(x mod y != 0)

proc main():void =
  let N, Q = nextInt()
  var g = initGraph[int](N)
  (N - 1).times:
    let a, b = nextInt() - 1
    g.addBiEdge(a, b)
  let dist = dijkstra[int](g, 0)[0]

main()

考えられる原因

dijkstra.nimの中でatcoder/extra/other/infがimportされていない

修正方法

when not declared ATCODER_EXTRA_DIJKSTRA_HPP:
  const ATCODER_EXTRA_DIJKSTRA_HPP* = 1
  import std/heapqueue, std/sequtils, std/algorithm
  import std/deques
  import atcoder/extra/graph/graph_template
+ import atcoder/extra/other/inf

  proc dijkstra01*[T](g:Graph[T], s:int): (seq[T],seq[int]) = 
    var
      n = g.len
      dist = newSeqWith(n,T.inf)
      prev = newSeqWith(n,-1)
      Q = initDeque[Edge[T]]()
    dist[s] = T(0)
    Q.addFirst(initEdge[T](-2,s,T(0)))
    while Q.len > 0:
      var e = Q.popFirst()
      if prev[e.dst] != -1: continue
      prev[e.dst] = e.src;
      for f in g[e.dst]:
        var w = e.weight + f.weight;
        if dist[f.dst] > w:
          dist[f.dst] = w;
          if f.weight == 0:
            Q.addFirst(initEdge[T](f.src, f.dst, w))
          else:
            Q.addLast(initEdge[T](f.src, f.dst, w))
    return (dist,prev)

  proc dijkstra*[T](g:Graph[T], s:int): (seq[T],seq[int]) = 
    var
      n = g.len
      dist = newSeqWith(n,T.inf)
      prev = newSeqWith(n,-1)
      Q = initHeapQueue[Edge[T]]()
    dist[s] = T(0)
    Q.push(initEdge[T](-2,s,T(0)))
    while Q.len > 0:
      var e = Q.pop()
      if prev[e.dst] != -1: continue
      prev[e.dst] = e.src;
      for f in g[e.dst]:
        var w = e.weight + f.weight;
        if dist[f.dst] > w:
          dist[f.dst] = w;
          Q.push(initEdge[T](f.src, f.dst, w))
      discard
    return (dist,prev)

  proc path*(prev: seq[int], t:int): seq[int] = 
    var u = t
    while u >= 0:
      result.add(u)
      u = prev[u]
    result.reverse()
# }}}
zer0-star commented 2 years ago

ありがとうございます!修正しておきます。