1. Băi toân tìm đường đi ngắn nhất từ một đỉnh 2. Tìm đường đi ngắn nhất giữa câc cặp đỉnh 3. Băi toân bao đóng chuyển tiếp
4. Băi toân cđy trùm tối tiểu
Trong nhiều băi toân của khoa học mây tính, toân học, kỹ thuật vă nhiều ngănh khoa học khâc, chúng ta đôi khi cần biểu diễn mối quan hệ của câc đối tượng. Một mô hình thích hợp cho việc biểu diễn như vậy lă đồ thị (Graph).Trong chương năy chúng ta sẽ tìm hiểu câc giải thuật thường gặp trín đồ thị cũng như câc cấu trúc dữ liệu cơ bản thường dùng để biểu diễn đồ thị trín mây tính.
Ị CÂC ÐỊNH NGHĨA
TOP Người ta thường dùng ký hiệu G = (V, E) để ký hiệu cho đồ thị G có tập hợp câc đỉnh lă V (còn được gọi lă câc nút - node hay câc điểm - point) vă một tập hợp câc cung nối giữa một số đỉnh gọi lă tập cạnh Ẹ Hai đỉnh có cung nối được gọi lă 2 đỉnh kề nhau, cạnh nối 2 đỉnh trùng nhau được gọi lă khuyín, đỉnh không được nối bởi 1 cạnh năo cả được gọi lă đỉnh đơn độc. Một cung nối giữa 2 đỉnh i, j có thể coi lă một cặp điểm (i, j). Nếu cặp năy có thứ tự thì ta có cung có thứ tự, ngược lại thì cung không có thứ tự. Nếu tập câc cung của đồ thị G có thứ tự thì G được gọi lă đồ thị có hướng (Directed Graph). Nếu tập câc cung của đồ thị G không có thứ tự thì G được gọi lă đồ thị vô hướng (Undirected Graph). Trong câc phần sau ta sẽ dùng thuật ngữ đồ thị (Graph) để chỉ đồ thị nói chung, khi năo cần phđn biệt ta sẽ nói rõ đồ thị có hướng hay vô hướng. Câc hình vẽ dưới đđy chỉ đồ thị vô hướng (hình a) vă đồ thị có hướng (hình b) :
trong câc đồ thị năy câc đỉnh được biểu diễn bằng câc vòng tròn có ghi tín đỉnh, câc cạnh được biểu diễn bằng câc đoạn thẳng có hướng (đồ thị có hướng) vă không có hướng (đồ thị vô hướng) vă có một tín gọị
Thông thường trong một đồ thị, câc đỉnh sẽ biểu diễn cho câc đối tượng còn câc cung thì biễu diễn cho câc quan hệ giữa câc đối tượng đó. Chẳng hạn câc đỉnh có thể biễu diễn cho câc thănh phố còn câc cạnh sẽ biễu diễn cho câc đường giao thông giữa 2 thănh phố.
Ðường đi gọi lă đơn giản nếu mọi đỉnh trín đường đi đều khâc nhau, ngoại trừ đỉnh đầu vă đỉnh cuối có thể trùng nhaụ Một đường đi có đỉnh đầu vă đỉnh cuối trùng nhau được gọi lă một chu trình (cycle). Một chu trình đơn lă một đường đi đơn có đỉnh đầu trùng với đỉnh cuối vă có độ dăi ít nhất lă 1.
Trong nhiều ứng dụng ta thường kết hợp câc giâ trị (value) hay nhên (label) với câc đỉnh vă / hoặc câc cạnh của đồ thị, khi ấy ta gọi lă đồ thị có nhên. Nhên kết hợp với câc đỉnh vă / hoặc cạnh có thể biễu diễn tín, giâ của đường đi, khoảng câch,... Nói chung nhên có thể có kiểu tùy ý. Hình dưới đđy cho ví dụ về đồ thị có nhên lă câc số nguyín biểu diễn cho cước phí vận chuyển của một đơn vị hăng hóa giữa câc thănh phố. Trong một đồ thị câc đỉnh có thể có tín vă có một nhên. Trong trường hợp không phđn biệt rõ thì tín hay nhên của một đỉnh lă không quan trọng, ta có thể nói 1 lă tín của đỉnh 1 hay lă nhên của đỉnh năỵ
IỊ KIỂU DỮ LIỆU TRỪU TƯỢNG ÐỒ THỊ TOP
Trín kiểu dữ liệu trừu tượng đồ thị người ta định nghĩa một số phĩp toân sau: + Ðọc nhên của một đỉnh. + Ðọc nhên của một cạnh. + Thím một đỉnh văo đồ thị. + Thím một cạnh văo đồ thị. + Xóa một đỉnh khỏi đồ thị. + Xóa một cạnh khỏi đồ thị.
+ Tìm đường đi từ đỉnh năy sang đỉnh khâc.
Thông thường trong câc giải thuật trín đồ thị, ta sẽ gặp câc đoạn chương trình có dạng như sau:
For (mỗi đỉnh w kề với v ) do Câc thao tâc cần thực hiện
Ðể căi đặt câc giải thuật như vậy ta cần bổ sung thím khâi niệm về chỉ số của câc đỉnh kề với v. Hơn nữa chúng ta cần phải định nghĩa thím câc phĩp toân sau:
+ First (v) : Trả về chỉ số của đỉnh đầu tiín kề với đỉnh v. Nếu v không có đỉnh kề thì hăm trả về giâ trị Null. Giâ trị Null lă giâ trị đặt biệt được chọn tùy theo cấu trúc dữ liệu được chọn để căi đặt đồ thị.
+ Next (v, i) : Trả về chỉ số của đỉnh kề với đỉnh v sau ị Nếu sau i không có đỉnh năo kề với đỉnh v thì trả về giâ trị Null.
+ Vertex (v, i) : Trả về đỉnh có chỉ số i trong số câc đỉnh kề với đỉnh v.
IIỊ BIỂU DIỄN ÐỒ THỊ TRÍN MÂY TÍNH TOP
Có một số cấu trúc dữ liệu được dùng để biễu diễn cho đồ thị. Việc chọn cấu trúc dữ liệu năo tùy thuộc văo câc phĩp toân trín câc cung vă đỉnh của đồ thị. Hai cấu trúc thường gặp lă biễu diễn đồ thị bằng ma trận kề (adjacency matrix) hay biễu diễn đồ thị bằng danh sâch câc đỉnh kề (adjacency list).
1. Biểu diễn đồ thị bằng ma trận kề
TOP
Dùng một mảng 2 chiều có kiểu lă Boolean để biểu diễn cho câc đỉnh kề. Nếu đồ thị có n đỉnh thì dùng mảng có kích thước lă nxn. Giả sử câc đỉnh được đânh số từ 1..n thì ta dùng một mảng 2 chiều A để biểu diễn cho đồ thị với A[i,j] = True nếu có cạnh nối giữa 2 đỉnh i vă j, ngược lại ta cho A[i,j] = Falsẹ Rõ răng nếu G lă đồ thị vô hướng thì A sẽ lă ma trận đối xứng. Chẳng hạn đồ thị hình a có thể được biểu diễn bằng ma trận kề như sau :
Ta cũng có thể biễu diễn True lă 1 vă False lă 0 . Với câch biểu diễn năy thì đồ thị hình b có thể được biễu diễn bằng ma trận kề như sau :
Với câch biễu diễn đồ thị bằng ma trận kề như trín, chúng ta có thể định nghĩa chỉ số của đỉnh lă số nguyín chỉ đỉnh đó (theo câch đânh số thứ tự câc đỉnh) vă ta sẽ căi đặt câc phĩp toân First, next, vertex như sau :
Const Null = 0 ;
Var A : array [1.. max, 1.. max ] of Boolean ; { Mảng ma trận kề }
Function First (v : Integer) : Integer ;
Var i : Integer ; Begin
For i:= 1 to max do
If a[v, i] then
Return (i)
Else Return (Null) ; End;
Function Next (v : Integer ; i : Integer) : Integer ;
Var j : Integer ; Begin
For j:= i + 1 to max do
If a[v, i] then
Return (i)
Else Return (Null) ; End ;
Còn Vertex (v, i) chỉ đơn giản lă trả ra giâ trị ị Vòng lặp trín câc đỉnh kề của v có thể được căi đặt như sau :
i:= First (v) ; If i < > Null do Begin
w := Vertex (v, i) ; { Câc thao tâc trín w } i : = Next (v, i) ; End ;
Trín đồ thị có nhên thì ma trận kề cũng có thể ghi nhận nhên của câc cung, ví dụ như cung giữa i vă j có nhên lă a thì A [i, j ] : = ạ Ví dụ ma trận kề của đồ thị có trọng số đê cho ở ví dụ trước có thể được biễu diễn như sau :
Ðối với câc cặp đỉnh không có cạnh nối ta có thể để trống hoặc đối với một số ứng dụng chẵng hạn như đối với băi toân tìm đường đi ngắn nhất , trong đó câc giâ trị số nguyín biễu diễn cho khoảng câch giữa 2 thănh phố thì câc cặp thănh phố không có cạnh nối ta sẽ gân cho nó một giâ trị đặc biệt lăĠ.
Câch biễu diễn đồ thị bằng ma trận kề cho phĩp kiểm tra một câch trực tiếp 2 đỉnh năo đó có kề với nhau không ? Nhưng nó phải mất thời gian duyệt qua toăn bộ mảng để xâc định tất cả câc đỉnh vă cạnh của đồ thị. Thời gian năy độc lập với số đỉnh vă số cạnh của đồ thị. Ngay cả trong trường hợp đồ thị có số đỉnh rất nhỏ ta cũng cần có một mảng gồm n x n phần tử để lưu trữ. Do vậy, nếu ta cần lăm việc thường xuyín với câc cạnh của đồ thị thì ta cần có một câch biễu diễn khâc phù hợp hơn.
2. Biễu diễn đồ thị bằng danh sâch câc đỉnh kề TOP
Trong câch biễu diễn năy, ta sẽ lưu trữ câc đỉnh kề với đỉnh i trong một danh sâch liín kết theo một thứ tự năo đó. Như vậy, ta cần một mảng Head có chiều dăi n phần tử để biễu diễn cho một đồ thị có n đỉnh. Head [i] lă con trỏ trỏ tới danh sâch câc đỉnh kề với đỉnh ị Ví dụ :