2.0.14 • Published 3 years ago

@algorithm.ts/dijkstra-bigint v2.0.14

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

A typescript implementation of the dijkstra algorithm (bigint version).

The following definition is quoted from Wikipedia (https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm):

Dijkstra's algorithm (/ˈdaɪkstrəz/ DYKE-strəz) is an algorithm for finding the shortest paths between nodes in a graph, which may represent, for example, road networks. It was conceived by computer scientist Edsger W. Dijkstra in 1956 and published three years later.

Install

  • npm

    npm install --save @algorithm.ts/dijkstra-bigint
  • yarn

    yarn add @algorithm.ts/dijkstra-bigint
  • deno

    import dijkstra from 'https://raw.githubusercontent.com/guanghechen/algorithm.ts/main/packages/dijkstra-bigint/src/index.ts'

Usage

  • Simple

    import dijkstra from '@algorithm.ts/dijkstra-bigint'
    
    const dist: bigint[] = dijkstra({
      N: 4,
      source: 0,
      edges: [
        { to: 1, cost: 2n },
        { to: 2, cost: 2n },
        { to: 3, cost: 2n },
        { to: 3, cost: 1n },
      ],
      G: [[0], [1, 2], [3], []],
    })
    // => [0n, 2n, 4n, 4n]
    // 
    //    Which means:
    //      0 --> 0: cost is 0n
    //      0 --> 1: cost is 2n
    //      0 --> 2: cost is 4n
    //      0 --> 3: cost is 4n
  • Pass custom dist array.

    import dijkstra from '@algorithm.ts/dijkstra-bigint'
    
    const dist: bigint[] = []
    dijkstra({
      N: 4,
      source: 0,
      edges: [
        { to: 1, cost: 2n },
        { to: 2, cost: 2n },
        { to: 3, cost: 2n },
        { to: 3, cost: 1n },
      ],
      G: [[0], [1, 2], [3], []],
      dist,
    })
    
    dist // => [0n, 2n, 4n, 4n]

Example

  • A solution for leetcode "Number of Ways to Arrive at Destination" (https://leetcode.com/problems/number-of-ways-to-arrive-at-destination/):

    import type { IEdge } from '@algorithm.ts/dijkstra-bigint'
    import dijkstra from '@algorithm.ts/dijkstra-bigint'
    
    const MOD = BigInt(1e9 + 7)
    export function countPaths(N: number, roads: number[][]): number {
      const edges: IEdge[] = []
      const G: number[][] = new Array(N)
      for (let i = 0; i < N; ++i) G[i] = []
      for (const [from, to, _cost] of roads) {
        const cost = BigInt(_cost)
    
        G[from].push(edges.length)
        edges.push({ to, cost })
    
        G[to].push(edges.length)
        edges.push({ to: from, cost })
      }
    
      const source = 0
      const target = N - 1
      const dist: bigint[] = dijkstra({ N, source: target, edges, G, dist: customDist }, { INF: BigInt(1e12) })
    
      const dp: bigint[] = new Array(N).fill(-1n)
      return Number(dfs(source))
    
      function dfs(o: number): bigint {
        if (o === target) return 1n
    
        let answer = dp[o]
        if (answer !== -1n) return answer
    
        answer = 0n
        const d = dist[o]
        for (const idx of G[o]) {
          const e: IEdge = edges[idx]
          if (dist[e.to] + e.cost === d) {
            const t = dfs(e.to)
            answer = modAdd(answer, t)
          }
        }
        dp[o] = answer
        return answer
      }
    }

Related

2.0.14

3 years ago

2.0.13

3 years ago

2.0.12

3 years ago

2.0.8-alpha.0

3 years ago

2.0.7-alpha.1

3 years ago

2.0.7-alpha.0

3 years ago

2.0.5

3 years ago

2.0.4

3 years ago

2.0.11

3 years ago

2.0.7

3 years ago

2.0.6

3 years ago

2.0.9

3 years ago

2.0.10

3 years ago

2.0.8

3 years ago

2.0.3

3 years ago

2.0.2

3 years ago

2.0.1

3 years ago

2.0.0

3 years ago

2.0.0-alpha.0

3 years ago