@algorithm.ts/bipartite-graph-matching
TypeScript icon, indicating that this package has built-in type declarations

2.0.14 • Public • Published

@algorithm.ts/bipartite-graph-matching


A typescript implementation of the algorithm to find the maximum matching of the bipartite graph.

The following definition is quoted from Wikipedia (https://en.wikipedia.org/wiki/Matching_(graph_theory)):

A maximal matching is a matching $M$ of a graph $G$ that is not a subset of any other matching. A matching $M$ of a graph $G$ is maximal if every edge in $G$ has a non-empty intersection with at least one edge in $M$.

A maximum matching (also known as maximum-cardinality matching) is a matching that contains the largest possible number of edges. There may be many maximum matchings. The matching number $\displaystyle \nu (G)$ of a graph $G$ is the size of a maximum matching. Every maximum matching is maximal, but not every maximal matching is a maximum matching. The following figure shows examples of maximum matchings in the same three graphs.

Install

  • npm

    npm install --save @algorithm.ts/bipartite-graph-matching
  • yarn

    yarn add @algorithm.ts/bipartite-graph-matching
  • deno

    import { createBipartiteGraphMatching } from 'https://raw.githubusercontent.com/guanghechen/algorithm.ts/main/packages/bipartite-graph-matching/src/index.ts'

Usage

  • Simple

    import { createBipartiteGraphMatching } from '@algorithm.ts/bipartite-graph-matching'
    
    const matching = createBipartiteGraphMatching()
    matching.init(4)
    matching.maxMatch() // => 0
    
    matching.addEdge(0, 1)
    matching.addEdge(0, 2)
    matching.addEdge(0, 3)
    matching.maxMatch() // => 1
    
    matching.addEdge(2, 3)
    matching.maxMatch() // => 2

Example

  • A solution for leetcode "Maximum Students Taking Exam" (https://leetcode.com/problems/maximum-students-taking-exam/):

    import { createBipartiteGraphMatching } from '@algorithm.ts/bipartite-graph-matching'
    
    export function maxStudents(seats: string[][]): number {
      const R: number = seats.length
      if (R <= 0) return 0
    
      const C: number = seats[0].length
      if (C <= 0) return 0
    
      let total = 0
      const seatCodes: number[][] = new Array(R)
      for (let r = 0; r < R; ++r) seatCodes[r] = new Array(C).fill(-1)
    
      for (let r = 0; r < R; ++r) {
        for (let c = 0; c < C; ++c) {
          if (seats[r][c] === '.') {
            seatCodes[r][c] = total
            total += 1
          }
        }
      }
    
      if (total <= 0) return 0
      if (total === 1) return 1
    
      const matching = createBipartiteGraphMatching()
      matching.init(total)
      for (let r = 0; r < R; ++r) {
        for (let c = 0; c < C; ++c) {
          const u: number = seatCodes[r][c]
          if (u > -1) {
            if (r > 0) {
              // Check upper left
              if (c > 0 && seatCodes[r - 1][c - 1] > -1) {
                matching.addEdge(u, seatCodes[r - 1][c - 1])
              }
    
              // Check upper right
              if (c + 1 < C && seatCodes[r - 1][c + 1] > -1) {
                matching.addEdge(u, seatCodes[r - 1][c + 1])
              }
            }
    
            // Check left
            if (c > 0 && seatCodes[r][c - 1] > -1) {
              matching.addEdge(u, seatCodes[r][c - 1])
            }
          }
        }
      }
    
      const totalPaired: number = matching.maxMatch()
      return total - totalPaired
    }

Related

/@algorithm.ts/bipartite-graph-matching/

    Package Sidebar

    Install

    npm i @algorithm.ts/bipartite-graph-matching

    Weekly Downloads

    16

    Version

    2.0.14

    License

    MIT

    Unpacked Size

    12.6 kB

    Total Files

    6

    Last publish

    Collaborators

    • lemonclown