02/10/2018, 15:08

Bài 2: Danh sách cạnh C++ Lý thuyết đồ thị

Bài viết này là phần 2 trong 7 bài của Series Lý thuyết đồ thị căn bản Lý thuyết đồ thị căn bản Bài 1: Ma trận kề C++/Pascal Lý thuyết đồ thị Bài 2: Danh sách cạnh C++ Lý thuyết đồ thị Bài 3: Danh sách kề C++ Lý thuyết đồ thị Bài 4: Thuật toán tìm kiếm theo chiều sâu DFS ...

Bài viết này là phần 2 trong 7 bài của Series Lý thuyết đồ thị căn bản

Lý thuyết đồ thị căn bản
  • Bài 1: Ma trận kề C++/Pascal Lý thuyết đồ thị
  • Bài 2: Danh sách cạnh C++ Lý thuyết đồ thị
  • Bài 3: Danh sách kề C++ Lý thuyết đồ thị
  • Bài 4: Thuật toán tìm kiếm theo chiều sâu DFS pascal c++
  • Bài 5: Thuật toán tìm kiếm theo chiều rộng BFS pascal c++
  • Bài 6: Thuật toán loang trên ma trận
  • Cấu trúc dữ liệu Disjoint Sets

Danh sách cạnh trong lý thuyết đồ thị là một cách tổ chức dữ liệu thường được dùng trong thuật toán tìm cây khung nhỏ nhất Kruskal, nó giúp bạn tiết kiệm chi phí lưu trữ và chi phí duyệt với đồ thị thưa.

1. Tổng quan về danh sách cạnh trong lý thuyết đồ thị

Danh sách cạnh trong lý thuyết đồ thị được lưu trữ vào mảng một chiều, mỗi phần tử của mảng sẽ thể hiện thông tin của 2 đỉnh kề nhau.

Với mô tả bên trên bạn có thể tạo cho riêng mình một struct dữ liệu của một cạnh gồm 2 thông tin, và khai báo một mảng thuộc dữ liệu đó. Tuy nhiên trong code tham khảo về nhập dữ liệu cho danh sách cạnh trong lý thuyết đồ thị dưới đây, mình sẽ tạo 2 mảng riêng mà không dùng struct.

a. Code biểu diễn đồ thị bằng danh sách cạnh c++

minh họa ma trận đơn vô hướng không trọng số tổ chức bằng danh sách cạnh

Hình ảnh minh họa ma trận đơn vô hướng không trọng số

b. Mô phỏng dữ liệu tổ chức danh sách cạnh theo ví dụ

Các bạn có thể tham khảo thêm thuật toán tìm cây khung nhỏ nhất kruskal, được biểu diễn đồ thị bằng danh sách cạnh:

Cây khung nhỏ nhất QBMST spoj: Kruskal, Prim heap

2. Ưu điểm và nhược điểm khi dùng danh sách cạnh trong lý thuyết đồ thị

Dễ dàng biết được 2 đỉnh nào kề với nhau.

Cách tổ chức này khá dễ viết, chúng thường được dùng trong thuật toán căn bản như tìm cây khung kruskal.

Nếu chi phí duyệt và không gian lưu trữ của ma trận kề là N^2 thì phương án tổ chức dữ liệu bằng danh sách cạnh chỉ mất 2*m. Giảm được rất nhiều về chi phí và thời gian duyệt nếu đồ thị thưa (đồ thị có ít cạnh)

Nhưng khi ta muốn duyệt tất cả cạnh kề của một đỉnh nào đó, lúc này chẳng có cách nào ngoài việc duyệt hết danh sách cạnh đó và lọc ra để xử lí, đặc biệt là khi đồ thị dày (đồ thị có nhiều cạnh) thì thời gian duyệt sẽ tăng lên rất nhiều. Chính vì thế mà Kiểu tổ chức dữ liệu bằng danh sách kề được ra đời.

0