Giải thích thuật toán Dijkstra?

e đang làm đồ án cơ sở về thuật toán Dijkstra nhưng mà do hồi trước học toán rời rạc nghỉ nhiều quá nên phần này ko hiểu. e có 1 đoạn code bằng C++ rồi nhưng chưa chạy được và 1 số phần e vẫn chưa hiểu rõ nên nhờ các bro giải thích từng dòng code và những kiến thức về C++ liên quan giúp e.thank các bro.

dưới đây là đoạn code:

#include <stdio.h>
 #include <conio.h>
 #include <iostream.h>
 #include <values.h>
 #define max 100
 #define FileIn "Bai6.inp"
void Doc_File(int A[max][max], int &n, int &D, int &C) {
 FILE*f = fopen(FileIn,"rb");
 fscanf(f,"%d%d%d",&n,&D,&C);
 cout<<"Ma Tran Lien Ket Tuong Ung.\n";
 cout<<D<<" "<<C<<endl;
 for(int i =0;i<n;i++) {
  for(int j =0;j<n;j++) {
   fscanf(f,"%d",&A[i][j]);
   cout<<A[i][j]<<" ";
  }
  cout<<endl; 
 }
 fclose(f);
 D--; C--;
}
void Dijkstra(int A[max][max], int n, int D, int C) {
 char DanhDau[max];
 int Nhan[max], Truoc[max], XP, min;
 for(int i=0; i<n; i++){
  Nhan[i] = MAXINT;
  DanhDau[i] = 0;
  Truoc[i] = D;
 }
 Nhan[D] = 0;
 DanhDau[D] = 1;
 XP = D;
 while(XP != C){
  for(int j=0; j<n; j++)
   if(A[XP][j]>0 && Nhan[j]>A[XP][j]+Nhan[XP] && DanhDau[j]==0) {
    Nhan[j] = A[XP][j]+Nhan[XP];
    Truoc[j] = XP;
   }
   min = MAXINT;
  for(j = 0; j<n; j++)
  if(min>Nhan[j]&& DanhDau[j]==0){
   min = Nhan[j];
   XP = j;
  }
  DanhDau[XP] = 1;
 }
 cout<<"Duong Di Ngan Nhat La:"<<Nhan[C]<<endl;
 cout<<C+1<<" <-"<<Truoc[C]+1;
 i = Truoc[C];
 while(i!=D){
  i = Truoc[i];
  cout<<" <-"<<i+1;
 }
}
void main() {
 int A[max][max],n,Dau,Cuoi;



 Doc_File(A,n,Dau,Cuoi);
 Dijkstra(A,n,Dau,Cuoi);
 getch();

} 

cái này do a viết hay sao ạ?

cái này là C mà a ơi, đâu phải C++, C++ có mỗi cout thôi

1 Like

Bạn có thể xem thuật toán + lời giải thích chi tiết tại đây:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?