Thuật toán floyd tìm đường đi ngắn nhất

*

Nội dungThuật tân oán DijkstraThuật toán thù FloydCode nâng cấp cho tất cả 2 thuật toán

Trong bài viết này chỉ đề cùa đến các thuật toán tra cứu lối đi ngắn độc nhất vô nhị Dijkstra và Floyd, một số thuật ngử liên quan bản thân sẽ không giải thích tuyệt định nghĩa, các bạn từ bỏ khám phá vào sách hoặc trên mạng.

You watching: Thuật toán floyd tìm đường đi ngắn nhất

Bài tân oán lối đi ngắn tuyệt nhất nguồn solo là bài xích toán tìm kiếm một lối đi giữa nhì đỉnh làm thế nào cho tổng những trọng số của các cạnh tạo cho đường đi sẽ là nhỏ dại duy nhất. Hay nói một biện pháp tân oán học tập là:Cho 1-1 đồ gia dụng thị liên thông, có trọng số G=(V,E). Tìm khoảng cách d(a,b) xuất phát từ 1 đỉnh a đến trước đến một đỉnh b ngẫu nhiên của G và kiếm tìm lối đi nđính thêm độc nhất trường đoản cú a mang đến b.

Nhỏng title bài viết, họ sẽ mày mò 2 thuật toán nhằm giải quyết và xử lý bằng cách thực hiện cơ mà trận kề cảu thứ thị(để ý ta xét trọng số của đồ thị là ko âm).

Ma trận kề của đồ thị có n đỉnh là ma trận vuông G bao gồm số mặt hàng số cột là n. G là độ lâu năm lối đi từ đỉnh i tới đỉnh j. Nếu xét đồ dùng thị vô phía thì G = G. Độ dài từ một đỉnh cho tới thiết yếu nó luôn là 0 (G = 0). Nếu thân 2 cạnh i cùng j của thiết bị thị không tồn tại lối đi thì G = khôn cùng (∞). Tuy nhiên khi màn biểu diễn trong máy tính thì quý giá ∞ được đặt là một hằng số rất to lớn Hoặc là tổng những cực hiếm vào ma trận (tổng độ lâu năm các cạnh).

1. Thuật toán thù Dijkstra

Về thuật toán Dijkstra có 2 loại là tra cứu lối đi ngắn duy nhất từ 1 đỉnh nguồn tới 1 đỉnh đích cùng search lối đi ngắn thêm độc nhất từ một đỉnh mối cung cấp tới các đỉnh còn lại của đồ vật thị, cùng tại chỗ này mình đang nói về các loại thứ 1. (các loại vật dụng nhì chúng ta cũng có thể tra cứu bên trên mạng hoặc chỉ cần đổi khác loại while (s == 0) (chiếc 43 của code 1 & dòng 76 của code 2) thành vòng for chăm chú từ bỏ 0 cho n-một là đang kiếm được toàn bộ những đỉnh).

– Dùng 1 mảng Len<> – Len là khoảng cách nđính độc nhất vô nhị trường đoản cú đỉnh a cho tới đỉnh i.

– Dùng 1 mảng S lưu lại các đỉnh i quan trọng (những đỉnh i nhưng lúc này thì đường đi từ bỏ a cho tới i là nđính thêm nhất).

– Dùng mảng P<> khắc ghi lối đi. P = i trường hợp i là đỉnh đi trước j trong lối đi ngắn nhất.

See more: Top 9 Camera Hành Trình Tốt Nhất Hiện Nay 2017 Giá Rẻ, Camera Hành Trình Nào Tốt Nhất Hiện Nay 2021

– Đặt lại quý giá hết sức cho những cặp đỉnh không có lối đi.

– Khởi sản xuất toàn bộ những đường đi từ bỏ a đên những đỉnh khác bởi khôn cùng.

– Khởi sản xuất lối đi trường đoản cú a đến chính a = 0.

– Duyệt hết các đỉnh V của trang bị thị

+ Tìm đỉnh i không nằm trong S mà đường đi từ bỏ a tới i là nthêm duy nhất để mang vào S. Nếu không tìm kiếm được đỉnh như thế nào tức thị sẽ chăm sóc hết các đỉnh hoàn toàn có thể đi cơ mà vẫn không thấy đỉnh đích => chẳng thể đi được.

+ Nếu kiếm được đỉnh i thì săn sóc tất cả những đỉnh j không phía bên trong S. Nếu Len + G

Lưu ý: Do trong C, mảng bắt đầu từ 0. Do vậy những đỉnh Khi tính toán thì và tính trường đoản cú đỉnh 0 cho đỉnh n-1. Tuy nhiên Lúc hiển thị ra thì vẫn cần là trường đoản cú đỉnh 1 đến n và trong file đầu vào.inp thì đỉnh đầu với đỉnh cuối cũng sẽ được tính từ một cho n. Do kia vào code trước khi tính tân oán ta nên sút đỉnh đầu và đỉnh cuối đi 1 đơn vị. Sau Lúc tính tân oán dứt thì khi xuất kết quả lại yêu cầu tăng các đỉnh trong đường đi tìm kiếm được lên 1 đơn vị nhằm hiển thị đúng (VD ta ao ước tính đường đi từ đỉnh 4 mang lại đỉnh 8, thì đỉnh 4 tương ứng cùng với địa điểm thiết bị 3 vào mảng, đỉnh 8 ứng với địa điểm lắp thêm 7 bắt buộc ta buộc phải bớt 4 xuống 3, 8 xuống 7 nhằm tính toán. khi tìm kiếm được lối đi, trả sử là 3 -> 5 -> 4 -> 7 thì nên in ra là 4 -> 6 -> 5 -> 8).

See more: Cách Hiển Thị Phần Trăm Pin Trên Samsung Galaxy S20

Chúng ta đang đi thực hành thực tế cùng với đồ thị sau theo 2 code là có tác dụng ngay lập tức trong main cùng triển khai theo những hàm:

*

tệp tin input đầu vào.inp: hàng đầu tiên miêu tả có 8 điểm, đi trường đoản cú điểm 4 tới điểm 8. ma trận 8×8 sống bên dưới là ma trận kề của thiết bị thị.

#include #include #define INPhường "đầu vào.inp"#define OUT "output.out" int main() FILE *fi = fopen(INP., "r"); FILE *fo = fopen(OUT, "w"); int n, a, b, i, sum = 0; // nhap du lieu tu file đầu vào fscanf(fi, "%d%d%d", &n, &a, &b); int G; int S, Len, P; // nhap ma tran va tinc gia tri vo cung (sum) for (i = 0; i a la 0 // tlặng duong di ngan nhat tu 1 dinc den moi dinch khac thi rứa bang vong for: //for (int k = 0; k =n tuc la duyet het cac dinch ma khong the tyên gắng dinc b -> thoat if (i >= n) printf("done dijkstra "); break; for (int j = 0; j Len) i = j; S = 1; // mang lại i vao danh sach xet roi for (int j = 0; j 0 && Len liên kết dự phòng

* Code theo từng hàmTrong code theo hàm bao gồm hàm:– readData triển khai gọi ban bố từ file đầu vào.– dijkstra triển khai thuật toán– back triển khai trả về chuỗi là đường đi tìm kiếm được– outResult tiến hành in ra tệp tin output kết quả

#include #include #include #define INPhường. "input đầu vào.inp"#define OUT "output.out" // read data in file inputint readData(int ***G, int *n, int *a, int *b) FILE *fi = fopen(INP, "r"); if (fi == NULL) printf("file input not found! "); return 0; printf("start read file "); fscanf(fi, "%d %d %d", n, a, b); *G = (int **) malloc((*n) * sizeof(int)); for (int i = 0; i a la 0 int i; // tlặng duong di ngan nhat tu 1 dinch den moi dinch khac thi thế bang vong for: //for (int k = 0; k =n tuc la duyet het cac dinc ma khong the tyên núm dinch b -> thoat if (i >= n) printf("done dijkstra "); return 0; for (int j = 0; j Len) i = j; S = 1; // mang đến i vao danh sach xet roi for (int j = 0; j = 0; i--) sprintf(temp, "%d", point); strcat(path, temp); if (i > 0) sprintf(temp, " --> "); strcat(path, temp); printf("done find path ");} void outResult(int len, char* path) FILE *fo = fopen(OUT, "w"); if (len > 0) fprintf(fo, " Length of %c to lớn %c is %d ", path<0>, path, len); fprintf(fo, "path: %s ", path); fclose(fo); int main() int **G, n, a, b, len; if (readData(&G, &n, &a, &b) == 0) return 0; char *path = (char *) malloc((10 * n) * sizeof(char)); int P; len = dijkstra(G, n, a, b, P); if (len > 0) back(a, b, Phường., n, path); outResult(len, path); else char *path = (char *) malloc((n * 10) * sizeof(char)); sprintf(path, "khong teo duong di tu %d den %d ", a, b); outResult(len, path); printf("done - open file output to lớn see result "); return 0;liên kết dự phòng