A B∩ C Tổng quát: Giả sử
3.3.5. Bμi toán tìm đ−ờng đi ngắn nhất.
Đơn đồ thị vô h−ớng (có h−ớng) G = (V, E) đ−ợc gọi lμ đồ thị có trọng số nếu mỗi cạnh (cung) e ∈ E đ−ợc đặt t−ơng ứng với một số thực w, số thực nμy đ−ợc gọi lμ trọng số của cạnh (cung) e.
Các mô hình sử dụng đồ thị có trọng số đ−ợc thể hiện trong nhiều bμi toán thực tiễn. Chẳng hạn nếu xét một mạng hμng không, trong đó mỗi sân bay lμ một đỉnh, cạnh đ−ợc nối hai đỉnh khi có đ−ờng bay giữa hai sân bay t−ơng ứng. Khi đó trọng số có thể đ−ợc hiểu theo một trong các đại l−ợng: Thời gian bay giữa sân bay nọ đến sân bay kia, hoặc khoảng cách giữa hai sân bay, hoặc chi phí vận chuyển trên một đơn vị hμng hóa, ....
Ví dụ. Ơ
Với các đồ thị có trọng số, bμi toán đặt ra một cách tự nhiên lμ xác định đ−ờng đi giữa hai đỉnh cho tr−ớc sao cho tổng trọng số của các cạnh (cung)
thuộc đ−ờng đi lμ nhỏ nhất. Bμi toán nμy đ−ợc gọi lμ ”Bμi toán tìm đ−ờng đi
ngắn nhất trong đồ thị có trọng số”.
Để giải bμi toán tìm đ−ờng đi ngắn nhất trong đồ thị có trọng số, ta sẽ sử dụng khái niệm ma trận trọng số sau đâỵ
Ma trận trọng số của đồ thị G lμ ma trận W =wij trong đó wij lμ trọng số của cạnh (cung) nối đỉnh vi với đỉnh vj trong tr−ờng hợp có cạnh (cung) nối hai đỉnh vi vμ vj vμ tùy theo từng tình huống thực tế, nếu không có cạnh (cung) nối hai đỉnh đó thì wij có thể đ−ợc đồng loạt gán cho một trong các giá trị −∞,0,∞.
Theo định nghĩa trên, các phần tử của ma trận trọng số có thể lμ số âm. Một đồ thị không có trọng số cũng có thể hiểu lμ một đồ thị có trọng số khi ta coi trọng số của các cạnh (cung) lμ 1, vμ khi đó ma trận kề sẽ lμ ma trận trọng số.
Thuật toán Dijkstrạ
Y t−ởng giải thuật. Thuật toán nμy xác định đ−ờng đi ngắn nhất từ đỉnh a = 0 đến đỉnh z = n vμ độ dμi của đ−ờng đi đó trong đơn đồ thị G. Các đỉnh đ−ợc đánh số từ 1 đến n với ma trận trọng số (cấp n) lμ ma trận
W = [wi,j], wi,j =∞ khi vμ chỉ khi không có cạnh nối đỉnh i với đỉnh j. Mỗi đỉnh sẽ đ−ợc gán nhãn gồm một bộ 2 thμnh phần (li, ti) trong đó li lμ một số thực chỉ độ dμi của đ−ờng đi từ đỉnh a đến đỉnh i tại thời điểm đang xét, ti lμ tên của đỉnh tr−ớc đỉnh i trong đ−ờng đi đang xét. Ta sẽ duyệt lần l−ợt các đỉnh từ đỉnh a theo các đ−ờng đi có thể, các đỉnh đã đ−ợc duyệt sẽ đ−ợc l−u trữ trong tập S. Công việc sẽ hoμn tất khi đỉnh z đã đ−ợc duyệt. Khi đó độ dμi của đ−ờng đi ngắn nhất sẽ lμ lz vμ đ−ờng đi nμy sẽ đ−ợc xác định ng−ợc bởi các nhãn tz, ttz, ttz, ....
B−ớc khởi đầu: (Khởi tạo các nhãn l vμ tập S) với i:=1 đến n
l[i]:=100; (khởi tạo độ dμi đ−ờng đi, thay vô cùng bởi 100)
l[a]:=0;
S:=[];
Các b−ớc lặp: (Duyệt các đỉnh cho đến khi đỉnh z đ−ợc duyệt) Khi z không thuộc S, thực hiện
tìm đỉnh u không thuộc S có nhãn nhỏ nhất
SS :=S;
Với mỗi đỉnh thuộc tập các đỉnh ch−a đ−ợc duyệt vμ có cạnh (cung) từ u đến v thực hiện
Nếu l(u) +wuv < l(v) thì
l(v) := l(u) +wuv ;
t(v) := u;
Sau đây lμ đoạn mã ch−ơng trình Pascal thể hiện thuật toán trên BEGIN
SS:=[1..n]; {tap tat ca cac dinh} khoitao(a,s,l);
SS:=SS-S; {tap cac dinh khong thuoc S} while z in ss do
begin
u:=minnhan(SS);{tim dinh u khong thuoc s co nhan nho nhat} S:=S+[u];
SS:=SS-S;
Với mỗi đỉnh thuộc tập các đỉnh ch−a đ−ợc duyệt vμ có cạnh (cung) từ u đến v thực hiện Nếu l(u) +wuv < l(v) thì l(v) := l(u) +wuv ; t(v) := u; end; END; Ví dụ. Tìm đờng đi ngắn nhất từ đỉnh a1 đến đỉnh a4 trong đồ thị
Ta sẽ thực hiện từng b−ớc theo thuật toán trên (xem bảng ở d−ới): B−ớc khởi đầu: (Khởi tạo các nhãn l vμ tập S) (dòng 1)
Các b−ớc lặp: Các dòng 2 đến dòng 6, tại cột đầu của mỗi dòng có bổ sung thêm đỉnh đã đ−ợc duyệt. Trên mỗi dòng, các đỉnh đã đ−ợc duyệt đ−ợc vây bởi hình oval.
Vậy đ−ờng đi ngắn nhất từ a1 đến a4 có độ dμi lμ 33. Đ−ờng đi đó đi qua các đỉnh:
Tr−ớc a4 lμ a2, tr−ớc a2 lμ a1, tức lμ đ−ờng đi a1, a2, a4.
Để ý rằng có hai đ−ờng đi cùng có độ dμi 33 từ a1 đến a4 (đ−ờng đi
a1, a3, a4).
3.4. Đồ thị phẳng vμ tô mμu đồ thị.
Khi thiết kế các mạch in cho các bo mạch trong lĩnh vực điện tử, ng−ời ta th−ờng dùng mô hình đồ thị gồm các đỉnh lμ các điểm rẽ nhánh của các đoạn mạch, các cạnh thể hiện đoạn mạch. Vấn đề đặt ra lμ vẽ (thể hiện) trên mặt phẳng nh− thế nμo để các cạnh không đ−ợc cắt nhau tại vị trí không phải lμ điểm rẽ nhánh (đỉnh) của đồ thị vì nếu không thỏa mãn yêu cầu nμy thì gây chập mạch. Điều đó dẫn đến khái niệm đồ thị phẳng mμ ta sẽ xem xét sau đâỵ