CHƯƠNG 2

BIỂU DIỄN ĐỒ THỊ  TRÊN MÁY TÍNH

Tôn Quang Toại Khoa CNTT, Đại học Ngoại ngữ ‐ Tin học TP.HCM

Nội dung

Biểu diễn đồ thị bằng Ma  trận kề, ma trận số

Biểu diễn đồ thị bằng Danh sách kề

Biểu diễn đồ thị bằng Danh sách cạnh

BIỂU DIỄN ĐỒ THỊ BẰNG MA TRẬN KỀ, MA TRẬN TRỌNG SỐ

Ma trận kề

Đồ thị G=(V, E) có n đỉnh (

) và m cạnh.

, trong đó

cho biết G

Ma trận kề (adjacency matrix) của G là một mảng 2 chiều chứa những cạnh (i,j) hay không

𝑣 𝑖, 𝑗 (cid:3404) (cid:4682)

1 𝑛ế𝑢 𝑐ạ𝑛ℎ (cid:4666)𝑖, 𝑗(cid:4667) ∈ 𝐸 0 𝑛ế𝑢 𝑐ạ𝑛ℎ (cid:4666)𝑖, 𝑗(cid:4667) ∉ 𝐸

Ma trận kề

Ví dụ: Graph vô hướng

2

4

5

0

3

1

0 1 2 3 4 5

0

1

2 v = 3

4

5

Ma trận kề

Ví dụ: Graph có hướng

2

4

5

0

1

3

0 1 2 3 4 5

0

1

2 v = 3

4

5

Ma trận kề

Cấu trúc dữ liệu

int[,] v; int n;

Cấu trúc file dữ liệu của ma trận kề

Số đỉnh

Ma trận kề

Graph.INP 6 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0

Ma trận kề

Một số tính chất của ma trận kề

Ma trận kề của đồ thị vô hướng là ma trận đối xứng:

Ngược lại, ma trận đối xứng (0,1) bậc n sẽ tương ứng với đồ thị vô hướng n đỉnh

Nếu đồ thị vô hướng: Số lượng số 1 trên dòng thứ i = Số lượng số 1 trên cột thứ i = deg(i)

Nếu đồ thị có hướng:

• Số lượng số 1 trên dòng i = tổng bậc ra của đỉnh i = deg+(i) • Số lượng số 1 trên cột i = tổng bậc vào của đỉnh i = deg ‐(i)

Ma trận kề

Một số thao tác cơ bản trên cấu trúc Graph Kiểm tra có 1 cạnh nối đỉnh u đến đỉnh v không Xét các đỉnh kề với đỉnh u cho trước Thêm 1 cạnh nối đỉnh u đến đỉnh v nếu chưa có cạnh đó Xóa cạnh nối đỉnh u đến đỉnh v nếu có cạnh đó Xóa cạnh nối đỉnh u đến đỉnh v nếu có cạnh đó nhưng cho phép phục hồi lại sau này Xóa các cạnh kề với đỉnh u và xóa cả đỉnh u

Ma trận trọng số

Đồ thị có trọng số: Mỗi cạnh e=(u,v) của đồ thị được gán với một con số w(u, v) gọi là trọng số của cạnh e.

Trong trường hợp đồ thị có trọng số, thay vì dùng ma trận kề, chúng ta biểu diễn đồ thị bằng ma trận trọng số như sau

𝑣 𝑖, 𝑗 (cid:3404) (cid:4682)

𝑤(cid:4666)𝑖, 𝑗(cid:4667) 𝑛ế𝑢 𝑐ạ𝑛ℎ (cid:4666)𝑖, 𝑗(cid:4667) ∈ 𝐸 𝑛ế𝑢 𝑐ạ𝑛ℎ (cid:4666)𝑖, 𝑗(cid:4667) ∉ 𝐸

0

Ma trận trọng số

4

2

6

Ví dụ:

3

3

4

5

0

1

3

9

5

2

3

1

0 1 2 3 4 5

0

1

2 v = 3

4

5

GIỚI THIỆU COLLECTION

Một số loại collection cơ bản

Collection tuyến tính

LinkedList Tuple Stack Queue

Collection không tuyến tính

SortedSet SortedDictionary

LinkedList

LinkedList: LinkedList là một cấu trúc dữ liệu cho phép chúng ta thêm, xóa phần tử với thời gian O(1)

Tạo LinkedList và thêm các phần tử vào list

LinkedList list = new LinkedList(); list.AddLast(4); list.AddLast(7); list.AddLast(3);

LinkedList

Truy cập các phần tử trong LinkedList

foreach (int x in list)

Console.Write(x + " ");

for (LinkedListNode node = list.First; node!=null; node=node.Next)

Console.Write(node.Value + " ");

LinkedList

Properties First Last Count

Methods

AddLast() AddFirst() Find()

Tuple

Tuple: Tuple là một cấu trúc dữ liệu có một số phần tử tuần tự

Tạo tuple chứa 2 số nguyên

Tuple tuple; tuple= new Tuple(2,3);

Console.Write(tuple.Item1 + " " + tuple.Item2);

Stack

Stack: Stack là cấu trúc dữ liệu cung cấp 2 phép  toán có thời gian chạy O(1):

Thêm phần tử vào đầu (top) stack Xóa phần tử ở đầu stack

Stack s = new Stack(); s.Push(5); s.Push(7);

Console.Write(s.Peek()); s.Pop(); Console.Write(s.Peek());

Stack

Property Count

Methods Push() Pop() Peek()

Queue

Queue: Queue là cấu trúc dữ liệu cung cấp 2  phép toán có thời gian chạy O(1): Thêm phần tử vào cuối queue Xóa phần tử đầu tiên trong queue

Queue q = new Queue(); q.Enqueue(5); q.Enqueue(7);

Console.Write(q.Peek()); q.Dequeue(); Console.Write(q.Peek());

Queue

Properties Count

Methods

Enqueue() Dequeue() Peek()

SortedSet

SortedSet: SortedSet là cấu trúc dữ liệu để  chứa tập hợp các phần tử. Các phép toán cơ  bản trên tập hợp là: Thêm, Xóa, Tìm kiếm với  thời gian

SortedSet s = new SortedSet(); s.Add(2); s.Add(2); s.Add(3); s.Add(1); Console.Write(s.Count);

foreach (int x in s)

Console.Write(x + " ");

SortedSet

Properties Count Max Min

Methods Add() Remove() Contains()

SortedDictionary

SortedDictionary: SortedDictionary là mảng tổng quát gồm các cặp key‐value

Key của mảng thông thường: 0, 1, 2, …, n‐1  Key của dictionary là bất kỳ kiểu nào Thời gian truy cập phần tử là

SortedDictionary d = new SortedDictionary(); d["a"] = 4; d["b"] = 8; d["c"] = 2;

foreach (KeyValuePair x in d)

Console.Write(x.Value);

SortedDictionary

Properties Count Values Keys

Methods Add() Remove() ContainsValue(), ContainsKey()

BIỂU DIỄN ĐỒ THỊ BẰNG DANH SÁCH KỀ

Danh sách kề

Trong biểu diễn danh sách kề (Adjacency list)  của đồ thị G = (V,E), mỗi đỉnh v của đồ thị  chúng ta lưu trữ danh sách các đỉnh kề với v.

Nếu đồ thị không có trọng số

LinkedList[] v;

Danh sách kề

LinkedList[] v = new LinkedList[4]; v[0] = new LinkedList(); v[0].AddLast(1); v[0].AddLast(2);

2

3

0

v[1] = new LinkedList(); v[1].AddLast(0); v[1].AddLast(2); v[1].AddLast(3);

1

v[2] = new LinkedList(); v[2].AddLast(0); v[2].AddLast(1); v[2].AddLast(3);

v[3] = new LinkedList(); v[3].AddLast(1); v[3].AddLast(2);

Danh sách kề

Nếu đồ thị có trọng số

LinkedList>[] v;

2

1

3

4

8 5

0

7

1

Danh sách kề

LinkedList>[] v = new LinkedList>[4]; v[0] = new LinkedList>(); v[0].AddLast(new Tuple(1, 7)); v[0].AddLast(new Tuple(2, 4));

v[1] = new LinkedList>(); v[1].AddLast(new Tuple(0, 7)); v[1].AddLast(new Tuple(2, 8)); v[1].AddLast(new Tuple(3, 5));

v[2] = new LinkedList>(); v[2].AddLast(new Tuple(0, 4)); v[2].AddLast(new Tuple(1, 8)); v[2].AddLast(new Tuple(3, 1));

v[3] = new LinkedList>(); v[3].AddLast(new Tuple(1, 5)); v[3].AddLast(new Tuple(2, 1));

Danh sách kề

Cấu trúc file dữ liệu của danh sách kề

Graph.INP

2

4

Số đỉnh

0

3

Danh sách các đỉnh kề  của các đỉnh 0, 1, …, 4

1

5 1 2 0 2 4 0 1 4 4 1 2 3

BIỂU DIỄN ĐỒ THỊ BẰNG DANH SÁCH CẠNH

Danh sách cạnh

Danh sách cạnh (edge list): chứa tất cả các  cạnh của đồ thị theo một trật tự.

Danh sách cạnh rất tiện dụng khi thuật toán:

Xử lý tất cả các cạnh của đồ thị Không cần tìm các cạnh của một đỉnh

LinkedList> e

Danh sách cạnh

2

4

0

1

3

e.AddLast(new Tuple(0, 1)); e.AddLast(new Tuple(0, 2)); e.AddLast(new Tuple(1, 3)); e.AddLast(new Tuple(2, 1)); e.AddLast(new Tuple(2, 4)); e.AddLast(new Tuple(3, 4)); e.AddLast(new Tuple(4, 1));

Danh sách cạnh

Cấu trúc file dữ liệu của danh sách cạnh

Graph.INP

Số cạnh Số đỉnh

Danh sách cạnh

6 9 0 1 0 2 1 2 1 3 1 4 2 4 3 4 3 5 4 5

Danh sách cạnh

Nếu đồ thị có trọng số

LinkedList> e;

2

1

3

4

8 5

0

7

1

Chọn cách biểu diễn đồ thị trên máy tính

Chọn lựa cách biểu diễn đồ thị: Phụ thuộc vào

Thuật toán xử lý trên đồ thị Số lượng đỉnh

Chú ý:

Có thể kết hợp một số cách biểu diễn với nhau Có thể chọn các cấu trúc dữ liệu khác để biểu diễn đồ thị

Tóm tắt chương 2

Có 3 cách thông thường để biểu diễn đồ thị

Ma trận kề, Ma trận trọng số

Danh sách kề

Danh sách cạnh