Вы находитесь на странице: 1из 15

Cấu trúc dữ liệu và Giải thuật

Cấu trúc dữ liệu và Giải thuật


1843 ORD
SFO

802
4
17

337
1233
LAX
DFW
Chương V: Cấu trúc Đồ thị

Chương V: Đồ thị

z Nội dung
– Các khái niệm cơ bản
– Biểu diễn đồ thị
z Ma trận lân cận
z Danh sách lân cận
– Duyệt đồ thị
– Bài toán áp dụng
z Bài toán bao đóng truyền ứng
z Bài toán sắp xếp tô pô

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 1


Cấu trúc dữ liệu và Giải thuật

Đồ thị

– Một đồ thị G = (V, E) trong đó


z V: tập các đỉnh (vertices)
z E: tập các cung (edges) nối các đỉnh trong V
– Một cung e = (u,v) là một cặp đỉnh
– Ví dụ:

a b V= {a,b,c,d,e}

E=
c
{(a,b),(a,c),(a,d),
(b,e),(c,d),(c,e),
d e (d,e)}

Các trường hợp sử dụng của đồ thị

z Mạch điện
CS16

z Mạng lưới giao thông, mạng lưới chuyến bay, mạng


truyền thông

JFK

LAX
LAX STL
HNL
DFW
FTL

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 2


Cấu trúc dữ liệu và Giải thuật

Các thuật ngữ liên quan đến đồ thị

– Đồ thị có hướng và Đồ thị vô hướng

1 2 1 2

3 4 3 4

Trong một cung, thứ tự của Trong một cung, thứ tự của
các đỉnh là quan trọng các đỉnh là không quan trọng
Cung (u,v) khác với cung (v,u) Cung (u,v) cũng giống như cung (v,u)

Các thuật ngữ liên quan đến đồ thị


z Đỉnh lân cận (Adjacent vertices) 1 2
– Trong đồ thị có hướng:
z 2, 4 là lân cận của 1;
z 1,2 là lân cận của 3
3 4
z …

– Trong đồ thị vô hướng


z 1, 2 là lân cận của nhau
1 2
z 1,3 là lân cận của nhau
5
z ….
3 4
z Cung kề (Incident edges)
– Nếu có cung (u,v) thì cung này là cung kề của hai đỉnh u
và v

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 3


Cấu trúc dữ liệu và Giải thuật

Các thuật ngữ liên quan đến đồ thị


z Bậc của một đỉnh (Degree): Là số cung kề với đỉnh
– Trong một đồ thị có hướng, với 1 đỉnh có hai khái niệm liên
quan
z Bậc trong (in-degree)

z Bậc ngoài (out-degree)

– Ví dụ:
z Đỉnh 1 có bậc 3

z Đỉnh 1 có bậc trong là 1 và bậc ngoài là 2

1 2

3 4

Các thuật ngữ liên quan đến đồ thị


z Đường đi
– Dãy các đỉnh v1,v2,. . .vk mà tồn tại cung (vi, vi+1) trong đồ
thị
1 2

z Đường đi đơn
– Đường đi với các đỉnh không lặp lại 3 4
z Chu trình
– Đường đi đơn với đỉnh đầu và cuối
trùng nhau Path : 1, 2, 4, 3, 1, 4
z Độ dài đường đi
– Số cung trên đường đi

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 4


Cấu trúc dữ liệu và Giải thuật

Các thuật ngữ liên quan đến đồ thị

z Đồ thị liên thông (Connected Graph)


1 2
1 2
5

3 4 3 4
5
Đồ thị liên thông 1 2
1 2

3 3 4

Đồ thị không liên thông

Các thuật ngữ liên quan đến đồ thị

z Đồ thị trọng số (Weight Graph)

5 60
1 2
140
100 100

3 4
110

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 5


Cấu trúc dữ liệu và Giải thuật

Kiểu dữ liệu trừu tượng Đồ thị


z Dữ liệu: Một tập không rỗng các đỉnh chứa các phần tử
có kiểu nhất định, một tập không rỗng các cạnh có thể
biểu diễn các phần tử có kiểu nhất định
z Các thao tác cơ bản
– Graph create() – endVertices(e)
– insertVertex( o) – opposite(v, e)
– insertEdge(u, v, o) – areAdjacent(v, w)
– removeVertex(v) – adjacentVertices(v)
– removeEdge(e ) – incidentEdges(v)
– vertices()
– edges()
– numVertices()
– numEdges()

Biểu diễn đồ thị

– Biểu diễn bằng ma trận lân cận


z Đánh số các đỉnh trong tập V từ 1 đến n
z Ma trận biểu diễn đồ thị A (n x n)
– Aij = 1 nếu trong G tồn tại cung (i,j)
– Aịj = 0 nếu trong G không tồn tại cung đó
z Với đồ thị vô hướng thì nếu Aij = 1 thì Aji = 1
z A được gọi là ma trận lân cận của G

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 6


Cấu trúc dữ liệu và Giải thuật

Biểu diễn đồ thị bằng ma trận lân cận

z Ví dụ

1 2 ⎡0 1 0 1⎤
⎢0 0 0 1⎥⎥

⎢1 1 0 0⎥
3 4 ⎢ ⎥
⎣0 1 1 0⎦

⎡0 1 1 0 1⎤
⎢1 0 1 0 0⎥⎥
1 2 ⎢
5
⎢1 1 0 1 0⎥
⎢ ⎥
3 4
⎢0 0 1 0 1⎥
⎢⎣1 0 0 1 0⎥⎦

Biểu diễn đồ thị bằng ma trận lân cận

Thao tác Độ phức tạp


endVertices, opposite, areAdjacents, O(1)
numVertices, numEdges, insertEdge,
removeEdge
adjacentVertices, incidentEdges, vertices O(n)
edges O(m)
insertVertex, removeVertex O(n2)

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 7


Cấu trúc dữ liệu và Giải thuật

Biểu diễn đồ thị bằng danh sách lân cận

– Biểu diễn bằng danh sách lân cận


z Mỗi đỉnh trong đồ thị sẽ ứng với một danh sách móc nối chứa
các đỉnh lân cận của nó
z Mỗi nút trong danh sách có quy cách
VERTEX LINK

– VERTEX chứa giá trị tương ứng với số thứ tự của đỉnh lân cận
– LINK chứa con trỏ trỏ tới nút tiếp theo trong danh sách
z Mỗi danh sách như vậy có một nút đầu danh sách
z Các nút đầu này là các phần tử của một vector V có kích
thước n. Phần tử V[i] ứng với danh sách lân cận của nút thứ i

Biểu diễn đồ thị bằng danh sách lân cận

z Ví dụ
1 2 V[1] 2 4
V[2] 4
V[3] 1 2
3 4
V[4] 2 3

z 1: (2,4)
2: (4)
3: (1, 2)
4: (2, 3)

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 8


Cấu trúc dữ liệu và Giải thuật

Biểu diễn đồ thị bằng danh sách lân cận

V[1] 2 3 5
1 2 1
V[2] 3

5 V[3] 1 2 4

3 4 V[4] 3 5

V[5] 1 4

z 1: (2,3,5)
2: (1,3)
3: (1,2,4)
4: (3,5)
5: (1,4)

Biểu diễn đồ thị bằng danh sách lân cận

typedef struct node *node_pointer;


typedef struct node {
int vertex;
struct node *link;
};
node_pointer graph[MAX_VERTICES];
int n=0; /* vertices currently in use */

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 9


Cấu trúc dữ liệu và Giải thuật

Biểu diễn đồ thị bằng danh sách lân cận

Thao tác Độ phức tạp


endVertices, opposite, numVertices, numEdges, O(1)
insertEdge, insertVertex
vertices O(n)

edges O(m)

incidentEdges(v), adjacentVertices(v) , O(deg(v))


removeVertex(v)
areAdjacent(u,v) , removeEdge O(min(deg(u),
deg(v)))

Phép duyệt đồ thị

z Cho một đồ thị G(V,E) và một đỉnh v thuộc V. Duyệt


đồ thị là thăm mọi đỉnh liên thông với v
– Có 2 phương pháp
z Phương pháp duyệt theo chiều sâu (Depth First Search)
z Phương pháp duyệt theo chiều rộng ( Breadth First Search)

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 10


Cấu trúc dữ liệu và Giải thuật

Duyệt theo chiều sâu

Algorithm DFS(G, v)
Input đồ thị G và đỉnh bắt đầu duyệt v trong G
Output đánh dấu các cung trong G trong phần đồ thị liên thông với đỉnh v
thành hai loại cung khám phá (discovery edges) và cung quay lui (back
edges)

setLabel(v, VISITED) // đỉnh v đã được thăm


for all e ∈ G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w ← opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
DFS(G, w)
else
setLabel(e, BACK)

Duyệt đồ thị theo chiều sâu


A
A Đỉnh chưa thăm
A Đỉnh đã thăm
B D E
Cung chưa thăm
Cung khám phá C
Cung quay lui

A A

B D E B D E

C C
Bắt đầu xuất phát từ A

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 11


Cấu trúc dữ liệu và Giải thuật

Duyệt đồ thị theo chiều sâu


A A

B D E B D E

C C Tất cả các cung


kề của D đã duyệt
Xét tiếp các cung
kề của đỉnh C
A A

B D E B D E

C C

Duyệt đồ thị theo chiều sâu


z Duyệt theo chiều sâu trên đồ thị có hướng
– Đi theo chiều của các cung trên đồ thị

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 12


Cấu trúc dữ liệu và Giải thuật

Duyệt đồ thị theo chiều rộng


Algorithm BFS(G, s)
Q = một queue rỗng
Q.enqueue(s)
setLabel(s, VISITED)
while not Q.isEmpty()
v = Q.dequeue()
for all e ∈ G.incidentEdges(v)
if getLabel(e) = UNEXPLORED
w ← opposite(v,e)
if getLabel(w) = UNEXPLORED
setLabel(e, DISCOVERY)
setLabel(w, VISITED)
Q.enqueue(w)
else
setLabel(e, BACK)

Duyệt đồ thị theo chiều rộng


L0
A Đỉnh chưa thăm A
A Đỉnh đã thăm L1
B C D
Cung chưa thăm
Cung khám phá E F
Cung quay lui

L0 L0
A A

L1 L1
B C D B C D

E F E F

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 13


Cấu trúc dữ liệu và Giải thuật

Duyệt đồ thị theo chiều rộng


L0 L0
A A

L1 L1
B C D B C D

L2
E F E F

L0 L0
A A

L1 L1
B C D B C D

L2 L2
E F E F

Duyệt đồ thị theo chiều rộng


L0 L0
A A

L1 L1
B C D B C D

L2 L2
E F E F

L0
A

L1
B C D

L2
E F

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 14


Cấu trúc dữ liệu và Giải thuật

Duyệt đồ thị theo chiều sâu


z Duyệt đồ thị theo chiều rộng trên đồ thị có hướng

Đỗ Bích Diệp - Khoa CNTT - ĐHBK HN 15

Вам также может понравиться

  • Bé Gi
    Bé Gi
    Документ1 страница
    Bé Gi
    api-19906585
    Оценок пока нет
  • CX CT
    CX CT
    Документ13 страниц
    CX CT
    api-19906585
    Оценок пока нет
  • CTDL2008 8timkiem
    CTDL2008 8timkiem
    Документ31 страница
    CTDL2008 8timkiem
    api-19906585
    Оценок пока нет
  • CTDL2008 7sapxep
    CTDL2008 7sapxep
    Документ31 страница
    CTDL2008 7sapxep
    api-19906585
    Оценок пока нет
  • CTDL2008 5cay
    CTDL2008 5cay
    Документ29 страниц
    CTDL2008 5cay
    api-19906585
    Оценок пока нет
  • CTDL2008 6dothi P2
    CTDL2008 6dothi P2
    Документ26 страниц
    CTDL2008 6dothi P2
    api-19906585
    Оценок пока нет
  • CTDL2008 2GTDequi
    CTDL2008 2GTDequi
    Документ19 страниц
    CTDL2008 2GTDequi
    api-19906585
    Оценок пока нет
  • CTDL2008 4StackvaQueue
    CTDL2008 4StackvaQueue
    Документ24 страницы
    CTDL2008 4StackvaQueue
    api-19906585
    Оценок пока нет
  • CTDL2008 3Mang&Danhsach
    CTDL2008 3Mang&Danhsach
    Документ21 страница
    CTDL2008 3Mang&Danhsach
    api-19906585
    Оценок пока нет
  • CTDL2008 1TongquanGT
    CTDL2008 1TongquanGT
    Документ25 страниц
    CTDL2008 1TongquanGT
    api-19906585
    Оценок пока нет
  • CTDL2008 0gioithieu
    CTDL2008 0gioithieu
    Документ6 страниц
    CTDL2008 0gioithieu
    api-19906585
    Оценок пока нет