Professional Documents
Culture Documents
NHÓM :10
NHÓM : 10
1.........Tổng quan..................................................................................................................
1.1......Khái niệm...................................................................................................................
1.2......Ý tưởng cơ bản..........................................................................................................
1.3......Ưu nhược điểm của thuật toán................................................................................
1.4......Ứng dụng....................................................................................................................
2.........Kỹ thuật......................................................................................................................
2.1......Mô tả thuật toán........................................................................................................
2.2......Thời gian chạy...........................................................................................................
2.3......Chứng minh thuật toán...........................................................................................
Chương 2 - Giải thuật_lưu đồ thuật toán dijkstra.............................................................
1.........Phân tích...................................................................................................................
2.........Giải thuật tìm đường đi ngắn nhất giữa một cặp đỉnh........................................
3.........Giải thuật Dijkstra..................................................................................................
Chương 3 – Cài đặt thuật toán.............................................................................................
Lý thuyết đồ thị là một lĩnh vực nghiên cứu đã có từ lâu đờivà có nhiều ứng
dụng hiện đại.Những tư tưởng cơ bản của lý thuyết đồ thị đươc đề xuất từ những
năm đầu của thế kỷ 18 bởi nhà toán học lỗi lạc người Thụy Sĩ Leonhard
Euler.Chính ông là người đã sử dụng đồ thị để giải bài toán nổi tiếng về các cái
cầu ở thàng phố Konigsberg.
Đồ thị được sử dụng để giải quyết các bài toán trong nhiều lĩnh vực khác
nhau .Chẳng hạn , đồ thị có thể sử dụng để xác định các mạch vòng trong vấn đề
giải tích mạch điện.Chúng ta có thể phân biệt các hợp chất hoá học hữu cơ khác
nhau với cùng công thức phân tử nhưng khác nhau về cấu trúc phân tử nhờ đồ
thị.Chúng ta có thể xác định xem hai máy tính trong mạng có thể trao đổi thông tin
được với nhau hay không nhờ mô hình đồ thị của mạng máy tính. Đồ thị có trọng
số trên các cạnh có thể sử dụng để giải các bài toán như : tìm đường đi ngắn nhất
giữa hai thành phố trong cùng một mạng giao thông . Chúng ta còn sử dụng đồ thị
để giải các bài toán về lập lịch,thời khoá biểu,và phân bố tần số cho các trạm phát
thanh và truyền hình....
Mục đích ta tìm hiểu là nhằm giới thiệu các khái niệm cơ bản,các bài toán
ứng dụng quan trọng của lý thuyết đồ thị như bài toán cây khung nhỏ nhất , bài
toán tìm đường đi ngắn nhất và những thuật toán để giải quyết chúng đã được
trình bày chi tiết cùng với việc phân tích và hướng dẫn cài đặt chương trình
trên máy tính.
Củng cố và rèn luyện kỹ năng lập trình, nhớ lại các thuật toán mà đặc biệt là
thuật toán Dijkstra.
Chương 1 : Lý thuyết về thuật toán tìm đường đi ngắn nhất.
Chương 2 : Giải thuật_lưu đồ thuật toán dijkstra
Chương 3 : Cài đặt thuật toán.
BẢNG PHÂN CHIA CÔNG VIỆC
trong Tdk và Tem lần lượt là sự phức tạp của các phép
toán giảm và trích xuất tối thiểu trong Q.
Phiên bản đơn giản nhất của thuật toán Djikstra lưu trữ tập đỉnh Q trong
mảng được liên kết hoặc danh sách và các cạnh trong danh sách hoặc ma trận liền
kề. Trong trường hợp này, extract-minimum chỉ là một tìm kiếm tuyến tính qua tất
thời gian trong trường hợp xấu nhất (trong đó log biểu thị
logarit nhị phân log2). Đối với các đồ thị kết nối, giới hạn thời gian này có thể
được đơn giản thành đống Fibonacci cải thiện điều này thành
Khi sử dụng đống nhị phân, độ phức tạp thời gian trường hợp trung bình thấp
hơn trường hợp xấu nhất. Ví dụ, giả sử chi phí cạnh được tính riêng cho phân phối
xác suất chung, số lượng phép toán giảm khóa dự kiến bị giới hạn bởi
Định nghĩa 1.3. Gọi à (u,v) là tập tất cả đường đi từ u đến v. Độ dài
đường đi ngắn nhất từ đỉnh u đến đỉnh v được xác định bởi:
Định nghĩa 1.4. Đường đi ngắn nhất pmin(u,v) từ đỉnh u đến đỉnh v là
a. Nội dung
Có rất nhiều giải thuật đã được phát triển để giải bài toán tìm đường đi ngắn
nhất giữa một cặp đỉnh, trong khuôn khổ bài viết này em chỉ xin giới thiệu giải
thuật Dijkstra. Giải thuật Dijkstra là một giải thuật để giải bài toán đường đi ngắn
nhất nguồn đơn trên một đồ thị có trọng số cạnh mà tất cả các trọng số đều không
âm. Nó xác định đường đi ngắn nhất giữa hai đỉnh cho trước, từ đỉnh a đến đỉnh b.
Ở mỗi đỉnh v, giải thuật Dijkstra xác định 3 thông tin: k v, dv và pv. kv:
mang giá trị boolean xác định trạng thái được chọn của đỉnh v.
Ban đầu ta khởi tạo tất cả các đỉnh v chưa được chọn, nghĩa là:
kv = false, v ∈ V.
dv: là chiều dài đường đi mà ta tìm thấy cho đến thời điểm đang xét từ a
đến v.
B1. Khởi tạo: Đặt kv:= false "v ∈ V; dv:= ¥,"v ∈ V \ {a}, da:=0. B2.Chọn
v ∈ V sao cho kv = false và dv = min {dt / t∈ V, kt = false} Nếu dv = ¥ thì kết thúc,
không tồn tại đường đi từ a đến b.
B3. Đánh dấu đỉnh v, kv:= true.
B4. Nếu v = b thì kết thúc và db là độ dài đường đi ngắn nhất từ a đến b.
Ngược lại nếu v ¹ b sang B5.
B5. Với mỗi đỉnh u kề với v mà ku = false, kiểm tra Nếu du > dv + w(v,u)
thì du:= dv + w(v,u)
Ghi nhớ đỉnh v: pu:= v.Quay lại B2.
Do đó: f(n) £ 2(n-1)n < O(|V|2) Vậy độ phức tạp của giải thuật
Dijkstra là O(|V|2).
*** Trường hợp sử dụng danh sách kề
Độ phức tạp của giải thuật Dijkstra là O((|V| + |E|)lg|V|).
c. Lưu đồ thuật toán Dijkstra
d. Tạo bảng dữ liệu chạy tay
V T a b e c f d độ
0 ¥ ¥ ¥ ¥ ¥
dài
a bcdef * 4 2* ¥ ¥ ¥
e bcfd 3* * 10 12 ¥ từ
b cfd * 8* 12 ¥ a-
c fd * 12* 14
>f
f d * 15
d * là
15
Chương 3 – Cài đặt thuật toán
Đề tài : Chương trình tìm đường đi ngắn nhất từ đỉnh S đến đỉnh T theo
thuật toán Dijkstra _Sử dụng ngôn ngữ lập trình C
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#define Max 50
int final[Max];
int V; // So Dinh
int start, end; // Diem Xuat Phat va Ket Thuc
while (i != start){
printf("%d <-- ", i);
i = truoc[i];
}
printf("%d", start);
printf("\n Do Dai Duong Di la: %d", d[end]);
getch();
}
truoc[start] = 0;
d[start] = 0;
final[start] = 1;
while (!final[end]){
minp = 2000;
for (v = 1; v <= V; v++){
if (!final[v] && (minp > d[v])){
u = v;
minp = d[v];
}
}
Init (CP);
Dijkstra(CP, truoc, d);
Display (truoc, d);
return 0;
}
TÀI LIỆU THAM KHẢO