0

[DSA] Graphs

Giới thiệu

Graph là một cấu trúc dữ liệu gồm:

  • Các đỉnh (Vertices hoặc Nodes)
  • Các cạnh (Edges): Kết nối các đỉnh

image.png

Các loại graph

Loại Đặc điểm
Directed graph (Đồ thị có hướng) Cạnh có hướng (A→B).
Undirected graph (Đồ thị vô hướng) Cạnh không có hướng (A↔B).
Weighted Graph (Độ thị có trọng số) Mỗi cạnh có một giá trị (khoảng cách, chi phí).
Unweighted Graph (Độ thị không có trọng số) Các cạnh không có giá trị gắn kèm.

Biểu diễn Graph

Adjacency Matrix (ma trận kề)

// A B C D
// 0 1 2 3
const matrix = [
  [0, 1, 1, 0], // A
  [1, 0, 0, 1], // B
  [1, 0, 0, 0], // C
  [0, 1, 0, 0], // D
];

Dựa vào ma trận trên ta thấy:

  • A kết nối với B, D (do matrix[0][1]=1matrix[0][2]=1).
  • B Kết nối với A, D.

Adjacency List (danh sách kề)

const graph = {
  A: ["B", "C"],
  B: ["A", "D"],
  C: ["A"],
  D: ["B"]
};

Ta thấy:

  • A kết nối với B, C.
  • B kết nối với A, D.

Khởi tạo

class Graph {
  adjacencyList;
  constructor() {
    this.adjacencyList = {};
  }
}

Khởi tạo các method

addVertex

  addVertex(vertex) {
    if (!this.adjacencyList[vertex]) {
      this.adjacencyList[vertex] = [];
    }
  }

addEdge

 addEdge(v1, v2) {
    this.adjacencyList[v1].push(v2);
    this.adjacencyList[v2].push(v1);
  }

removeVertex

  removeVertex(vertex) {
    while (this.adjacencyList?.[vertex]?.length) {
      const vertexIn = this.adjacencyList[vertex].pop();
      this.removeEdge(vertex, vertexIn);
    }

    delete this.adjacencyList[vertex];
  }

removeEdge

 removeEdge(v1, v2) {
    this.adjacencyList[v1] = this.adjacencyList[v1]?.filter((v) => v !== v2);
    this.adjacencyList[v2] = this.adjacencyList[v2]?.filter((v) => v !== v1);
  }

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí