30/09/2018, 16:26

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.
";
    
     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();
    
    
    
    } 

Sáng Béo viết 18:30 ngày 30/09/2018

e có 1 đoạn code bằng C++ rồi nhưng chưa chạy được

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

giải thích từng dòng code và những kiến thức về C++ liên quan

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

Quân viết 18:38 ngày 30/09/2018

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

Cách Học – 13 Oct 13

[Thuật toán] Tìm đường đi ngắn nhất Dijkstra, Floyd - Cách Học

Update 25/05/2014: Do một số góp ý của các bạn nên mình đã viết thêm 1 chương trình của thuật toán Dijkstra theo cấu trúc hàm và cũng nhân tiện chỉnh lại chút code cho sáng sủa và chính xác hơn ^^. Update 27/09/2014: bổ xung code pascal của thuật...

Bài liên quan
0