Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd Thuật toán Dijkstra và Floyd
Trang 1Thu t toán Dijkstra và Floyd ật toán Dijkstra và Floyd
1 Thu t toán Dijkstra tìm đ ật toán Dijkstra tìm đường đi ngắn nhất: ường đi ngắn nhất: ng đi ng n nh t: ắn nhất: ất:
Gi s cho đ th vô hả sử cho đồ thị vô hướng , có trọng số như hình vẽ : ử cho đồ thị vô hướng , có trọng số như hình vẽ : ồ thị vô hướng , có trọng số như hình vẽ : ị vô hướng , có trọng số như hình vẽ : ướng , có trọng số như hình vẽ : ng , có tr ng s nh hình vẽ : ọng số như hình vẽ : ố như hình vẽ : ư
G i n là s đ nh c a đ th , suy ra n= 6 ọng số như hình vẽ : ố như hình vẽ : ỉnh của đồ thị , suy ra n= 6 ủa đồ thị , suy ra n= 6 ồ thị vô hướng , có trọng số như hình vẽ : ị vô hướng , có trọng số như hình vẽ :
Bài toán yêu c u tìm đầu tìm đường đi ngắn nhất từ đỉnh A đến ường đi ngắn nhất từ đỉnh A đến ng đi ng n nh t t đ nh A đ n ắn nhất từ đỉnh A đến ất từ đỉnh A đến ừ đỉnh A đến ỉnh của đồ thị , suy ra n= 6 ến
đ nh F( tỉnh của đồ thị , suy ra n= 6 ương đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có ng đương đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có ng t đ nh 1 t i đ nh 6) T đ th , ta có ừ đỉnh A đến ỉnh của đồ thị , suy ra n= 6 ớng , có trọng số như hình vẽ : ỉnh của đồ thị , suy ra n= 6 ừ đỉnh A đến ồ thị vô hướng , có trọng số như hình vẽ : ị vô hướng , có trọng số như hình vẽ :
ma tr n tr ng s :ận trọng số : ọng số như hình vẽ : ố như hình vẽ :
0 1 2 0 0 0
1 0 2 2 3 0
2 2 0 5 4 0
0 2 5 0 3 2
0 3 4 3 0 4
0 0 0 2 4 0
Bướng , có trọng số như hình vẽ : c 1:
#include<conio.h>
#include<stdio.h>
#define max 100
void docfile(int A[max][max], int &n, int &dau, int &cuoi) {
FILE *f = fopen("dis.ini","r");
fscanf(f, "%d %d %d", &n, &dau, &cuoi);
int i,j;
printf("%d %d \n", dau, cuoi);
for (i = 1; i <= n; i++) {
Trang 2for (j = 1; j <= n; j++) {
fscanf(f, "%d", &A[i][j]);
printf("%d ", A[i][j]);
} printf("\n");
} fclose(f);
T đ th c a bài toán đã cho , ta bi u di n đ th dừ đỉnh A đến ồ thị vô hướng , có trọng số như hình vẽ : ị vô hướng , có trọng số như hình vẽ : ủa đồ thị , suy ra n= 6 ểu diễn đồ thị dưới dạng ma trận ễn đồ thị dưới dạng ma trận ồ thị vô hướng , có trọng số như hình vẽ : ị vô hướng , có trọng số như hình vẽ : ướng , có trọng số như hình vẽ : ạng ma trận i d ng ma tr n ận trọng số :
tr ng s r i l u vào file Ti n hành đ c file,b n có th l u file v i tên b t ọng số như hình vẽ : ố như hình vẽ : ồ thị vô hướng , có trọng số như hình vẽ : ư ến ọng số như hình vẽ : ạng ma trận ểu diễn đồ thị dưới dạng ma trận ư ớng , có trọng số như hình vẽ : ất từ đỉnh A đến
kỳ, nh ng tên file c n ph i trùng v i tên chư ầu tìm đường đi ngắn nhất từ đỉnh A đến ả sử cho đồ thị vô hướng , có trọng số như hình vẽ : ớng , có trọng số như hình vẽ : ương đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có ng trình mà b n vi t thu t ạng ma trận ến ận trọng số : toán, ch khác ph n đuôi file Đ d nh , tôi l u file v i tên dijkstra.txt ỉnh của đồ thị , suy ra n= 6 ầu tìm đường đi ngắn nhất từ đỉnh A đến ểu diễn đồ thị dưới dạng ma trận ễn đồ thị dưới dạng ma trận ớng , có trọng số như hình vẽ : ư ớng , có trọng số như hình vẽ : File được tạo sẽ có nội dung ạng ma trận c t o sẽ có n i dungội dung nh sauư :
6// n=6 đ nhỉnh của đồ thị , suy ra n= 6
2 5// 1 đ nh B và 6 ỉnh của đồ thị , suy ra n= 6 đ nh E( có ỉnh của đồ thị , suy ra n= 6
th thay đ i 2 ,5 tểu diễn đồ thị dưới dạng ma trận ổi 2 ,5 tương ứng bằng các số từ 1 đến 6 để tìm ương đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có ng ng b ng các s t 1 đ n 6 đ tìm ứng bằng các số từ 1 đến 6 để tìm ằng các số từ 1 đến 6 để tìm ố như hình vẽ : ừ đỉnh A đến ến ểu diễn đồ thị dưới dạng ma trận
đường đi ngắn nhất từ đỉnh A đến ng đi ng n nh t gi a các đ nh )ắn nhất từ đỉnh A đến ất từ đỉnh A đến ữa các đỉnh ) ỉnh của đồ thị , suy ra n= 6
0 1 2 0 0 0
1 0 2 2 3 0
2 2 0 5 4 0
0 2 5 0 3 2
0 3 4 3 0 4
0 0 0 2 4 0
Sau khi đ c file này xong, ta đóng file.ọng số như hình vẽ :
Bướng , có trọng số như hình vẽ : c 2 : in đường đi ngắn nhất từ đỉnh A đến ng đi
void in(int start, int finish, int save[]) {
if (start == finish) printf("%d ", finish);
else {
in(start, save[finish], save);
printf("-> %d ", finish);
Trang 3}
Ta khai báo đ nh đ u là start , đ nh cu i là finish, tr ng ỉnh của đồ thị , suy ra n= 6 ầu tìm đường đi ngắn nhất từ đỉnh A đến ỉnh của đồ thị , suy ra n= 6 ố như hình vẽ : ọng số như hình vẽ :
s c a đ th là s nguyên nên ta khai báo d ng int Ta ố như hình vẽ : ủa đồ thị , suy ra n= 6 ồ thị vô hướng , có trọng số như hình vẽ : ị vô hướng , có trọng số như hình vẽ : ố như hình vẽ : ạng ma trận dùng thu t toán đ quy đ tìm đận trọng số : ệ quy để tìm đường đi từ đỉnh đầu ểu diễn đồ thị dưới dạng ma trận ường đi ngắn nhất từ đỉnh A đến ng đi t đ nh đ u ừ đỉnh A đến ỉnh của đồ thị , suy ra n= 6 ầu tìm đường đi ngắn nhất từ đỉnh A đến
đ n đ nh cu i ến ỉnh của đồ thị , suy ra n= 6 ố như hình vẽ :
N u đ nh đ u mà b ng đ nh cu i, t c là đ th ch có 1 ến ỉnh của đồ thị , suy ra n= 6 ầu tìm đường đi ngắn nhất từ đỉnh A đến ằng các số từ 1 đến 6 để tìm ỉnh của đồ thị , suy ra n= 6 ố như hình vẽ : ứng bằng các số từ 1 đến 6 để tìm ồ thị vô hướng , có trọng số như hình vẽ : ị vô hướng , có trọng số như hình vẽ : ỉnh của đồ thị , suy ra n= 6
đ nh thì đ thì đó không có đỉnh của đồ thị , suy ra n= 6 ồ thị vô hướng , có trọng số như hình vẽ : ường đi ngắn nhất từ đỉnh A đến ng nào ngoài t n t i duy ồ thị vô hướng , có trọng số như hình vẽ : ạng ma trận
nh t đ nh đó Còn n u ngất từ đỉnh A đến ỉnh của đồ thị , suy ra n= 6 ến ược tạo sẽ có nội dung ạng ma trận c l i, ch ng h n v i bài trên ẳng hạn với bài trên ạng ma trận ớng , có trọng số như hình vẽ :
có 6 đ nh, sau khi th c hi n quy trình xong ta sẽ in ỉnh của đồ thị , suy ra n= 6 ực hiện quy trình xong ta sẽ in ệ quy để tìm đường đi từ đỉnh đầu
đường đi ngắn nhất từ đỉnh A đến ng đi ng n nh t gi a 2 đ nh đó ra Ph n hàm này ta ắn nhất từ đỉnh A đến ất từ đỉnh A đến ữa các đỉnh ) ỉnh của đồ thị , suy ra n= 6 ầu tìm đường đi ngắn nhất từ đỉnh A đến
sẽ k t h p v i các hàm sau.ến ợc tạo sẽ có nội dung ớng , có trọng số như hình vẽ :
Bướng , có trọng số như hình vẽ : c 3 : thu t toán dijkstra nh sauận trọng số : ư :
void dijkstra(int A[max][max], int n, int start, int finish) {
int i, j, begin = start;// luu lai dinh bat dau
int danhdau[max]; // danh dau dinh
int L[max]; // luu trong so
int save[max]; // luu dinh dau
for (i = 1; i <= n; i++)
{
L[i] = _INTEGRAL_MAX_BITS; // gan trong so
la vo cung
danhdau[i] = 0;
save[i] = -1;
}
L[start] = 0; // gan trong so bat dau la 0
save[start] = 1; // dinh dau tien la 1
int connect= -1;
do
Trang 4int min = _INTEGRAL_MAX_BITS;
for (i = 1; i <= n; i++)
if (danhdau[i] == 0) {
if (A[start][i] > 0 && A[start][i] + L[start] < L[i])
{
L[i] = A[start][i] + L[start]; save[i] = start; // luu dinh dau
}
if (min > L[i]) // tim trong so nho nhat
{
min = L[i];
connect = i;
} }
start = connect; // bat dau chay lai tu trong
so nho nhat
danhdau[start] = 1;
} while ( start != finish);
printf("Duong di ngan nhat tu dinh %d den dinh
%d co do dai la :%d\n ",begin,finish,L[finish]);
in(begin,finish,save);
} Lúc đ u, ta gán t t c đ u là vô cùng Ta c n ph i dùng m t bi n begin đ ầu tìm đường đi ngắn nhất từ đỉnh A đến ất từ đỉnh A đến ả sử cho đồ thị vô hướng , có trọng số như hình vẽ : ều là vô cùng Ta cần phải dùng một biến begin để ầu tìm đường đi ngắn nhất từ đỉnh A đến ả sử cho đồ thị vô hướng , có trọng số như hình vẽ : ội dung ến ểu diễn đồ thị dưới dạng ma trận
l u l i đ nh b t đ u, vì đ nh này có th thay đ i ư ạng ma trận ỉnh của đồ thị , suy ra n= 6 ắn nhất từ đỉnh A đến ầu tìm đường đi ngắn nhất từ đỉnh A đến ỉnh của đồ thị , suy ra n= 6 ểu diễn đồ thị dưới dạng ma trận ổi 2 ,5 tương ứng bằng các số từ 1 đến 6 để tìm
Sau đó, đ nh đ u tiên t c là đ nh A ( tỉnh của đồ thị , suy ra n= 6 ầu tìm đường đi ngắn nhất từ đỉnh A đến ứng bằng các số từ 1 đến 6 để tìm ỉnh của đồ thị , suy ra n= 6 ương đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có ng ng v i đ nh 1) sẽ đứng bằng các số từ 1 đến 6 để tìm ớng , có trọng số như hình vẽ : ỉnh của đồ thị , suy ra n= 6 ược tạo sẽ có nội dungc gán
b ng 0, còn l i các đ nh khác v n vô cùng Và ti n hành l u đ nh A này ằng các số từ 1 đến 6 để tìm ạng ma trận ỉnh của đồ thị , suy ra n= 6 ẫn vô cùng Và tiến hành lưu đỉnh A này ến ư ỉnh của đồ thị , suy ra n= 6
b ng l nh save.ằng các số từ 1 đến 6 để tìm ệ quy để tìm đường đi từ đỉnh đầu
S d ng vòng l p do- while đ ki m tra các đ nh còn l i Lúc này, ta ki m ử cho đồ thị vô hướng , có trọng số như hình vẽ : ! ặp do- while để kiểm tra các đỉnh còn lại Lúc này, ta kiểm ểu diễn đồ thị dưới dạng ma trận ểu diễn đồ thị dưới dạng ma trận ỉnh của đồ thị , suy ra n= 6 ạng ma trận ểu diễn đồ thị dưới dạng ma trận tra xem t đ nh đ u A đ n các đ nh còn l i có tr ng s kho ng cách bao ừ đỉnh A đến ỉnh của đồ thị , suy ra n= 6 ầu tìm đường đi ngắn nhất từ đỉnh A đến ến ỉnh của đồ thị , suy ra n= 6 ạng ma trận ọng số như hình vẽ : ố như hình vẽ : ả sử cho đồ thị vô hướng , có trọng số như hình vẽ : nhiêu, sau đó v i vòng l p for đ ki m tra tr ng s nh nh t trong các ớng , có trọng số như hình vẽ : ặp do- while để kiểm tra các đỉnh còn lại Lúc này, ta kiểm ểu diễn đồ thị dưới dạng ma trận ểu diễn đồ thị dưới dạng ma trận ọng số như hình vẽ : ố như hình vẽ : ỏ nhất trong các ất từ đỉnh A đến
Trang 5tr ng s đó và ch n Ti p các bọng số như hình vẽ : ố như hình vẽ : ọng số như hình vẽ : ến ướng , có trọng số như hình vẽ : c sau, n u tr ng s ti p theo l n h n 0 ến ọng số như hình vẽ : ố như hình vẽ : ến ớng , có trọng số như hình vẽ : ơng đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có
và c ng v i tr ng s đ u mà nh h n nó thì ta vi t s nh h n C ti p ội dung ớng , có trọng số như hình vẽ : ọng số như hình vẽ : ố như hình vẽ : ầu tìm đường đi ngắn nhất từ đỉnh A đến ỏ nhất trong các ơng đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có ến ố như hình vẽ : ỏ nhất trong các ơng đương từ đỉnh 1 tới đỉnh 6) Từ đồ thị , ta có ứng bằng các số từ 1 đến 6 để tìm ến
t c vòng l p cho đ n khi h t t t c các đ nh ! ặp do- while để kiểm tra các đỉnh còn lại Lúc này, ta kiểm ến ến ất từ đỉnh A đến ả sử cho đồ thị vô hướng , có trọng số như hình vẽ : ỉnh của đồ thị , suy ra n= 6
Bướng , có trọng số như hình vẽ : c 4 : hàm main Ta ti n hành g i các hàm trên đ ến ọng số như hình vẽ : ở trên để ểu diễn đồ thị dưới dạng ma trận
t o thành bài hoàn ch nh.ạng ma trận ỉnh của đồ thị , suy ra n= 6
2. Thu t toán Floyd ật toán Dijkstra và Floyd