Hướng dẫn code thuật toán Floyd bằng ngôn ngữ c
Bạn nhập ma trận bên dưới vào một tập tin có đuôi txt và bỏ nó vào ổ đĩa phù hợp với phần define bên dưới đoạn code.
Ma trận mẫu
#include <stdio.h> #include <conio.h> #define MAX 100 #define input “g:/test-1.txt” #define VOCUC 1000 int Sau_Nut[MAX][MAX]; int L[MAX][MAX]; typedef struct graph{ int n; int a[MAX][MAX]; }DOTHI; int DocFile(DOTHI &g,char text[MAX]){ FILE *f; f=fopen(text,”rt”); if(f==NULL){ printf(“\n Khong tim thay file”); return 0; } fscanf(f,”%d”,&g.n); for(int i=0;i<g.n;i++){ for(int j=0; j<g.n;j++) fscanf(f,”%d”,&g.a[i][j]); } fclose(f); return 1; } void XuatDoThi(DOTHI g){ printf(“\n So dinh: %d”,g.n); printf(“\n Ma tran: \n”); for(int i=0; i<g.n;i++){ printf(“\t”); for(int j=0; j<g.n; j++) printf(“%d “,g.a[i][j]); printf(“\n”); } } void Floyd(DOTHI g){ int i,j; for(i=0;i<g.n;i++){ for(j=0;j<g.n;j++){ if(g.a[i][j] >0){ Sau_Nut[i][j] = j; L[i][j] = g.a[i][j]; } else{ Sau_Nut[i][j] = -1; L[i][j] = VOCUC; } } } for(int k=0; k<g.n;k++){ for(i=0;i<g.n;i++){ for(j=0;j<g.n;j++){ if(L[i][j] > L[i][k] + L[k][j]){ L[i][j] = L[i][k] + L[k][j]; Sau_Nut[i][j] = Sau_Nut[i][k]; } } } } //xuat ket qua tim duong di ngan nhat s–>f int S,F; printf(“Nhap vao dinh bat dau: “); scanf(“%d”,&S); printf(“Nhap vao dinh ket thuc: “); scanf(“%d”,&F); if(Sau_Nut[S][F] == -1){ printf(“Khong co duong di tu dinh %d den dinh %d la: \n”,S,F); } else{ printf(“Duong di ngan nhat tu dinh %d den dinh %d la: \n”,S,F); printf(“\t%d”,S); int u=S; while(Sau_Nut[u][F] != F){ u = Sau_Nut[u][F]; printf(“–>%d”,u); } printf(“–>%d”,F); printf(“\n\Voi tong trong so la %d”,L[S][F]); } } int main(){ DOTHI g; if(DocFile(g,input)==1){ printf(“\n Doc do thi thanh cong”); XuatDoThi(g); printf(“Bam 1 phim bat ki de bat dau tim duong di ngan nhat theo thuat toan Floyd …\n\n”); getch(); Floyd(g); } getch(); } |