- vừa được xem lúc

[DSA] Graphs

0 0 2

Người đăng: Tri Lương

Theo Viblo Asia

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); }

Bình luận

Bài viết tương tự

- vừa được xem lúc

[DSA] Linked list

Giới thiệu. Là một kiểu dữ liệu gồm đầu (head), đuôi (tail) và độ dài (length).

0 0 10

- vừa được xem lúc

[DSA] Trees Traversal

Giới thiệu. Trees Traversal (duyệt cây) là cách để lấy tất cả các node của cây.

0 0 7

- vừa được xem lúc

[DSA] Binary Heaps, Priority Queue

Binary Heaps. Giới thiệu.

0 0 7

- vừa được xem lúc

CTDL&GT dễ hiểu: 1. Các bước cơ bản khi tiến hành giải các bài toán tin học

Thức dậy lúc 7h sáng, Sanji bắt đầu công việc nấu ăn thường nhật của mình. Vừa vào bếp, nhìn thấy bãi chiến trường lộn xộn, Sanji biết ngay tối qua Luffy và Usopp đã xỉn quắc cần câu và lục tung tủ lạ

0 0 12

- vừa được xem lúc

CTDL & GT dễ hiểu: 2. Phân tích thời gian thực hiện giải thuật

2.1 Tại sao phải quan tâm thời gian chạy.

0 0 10

- vừa được xem lúc

"Hack" Não Số Lớn Với Digit DP!

Xin chào anh em, những chiến binh thuật toán kiên cường. Phản ứng đầu tiên của nhiều anh em (có cả tôi): "Ối dào, dễ! Quất cái for từ 1 đến 101810^{18}1018 rồi check thôi!".

0 0 13