Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. #include <iostream>
  2. #define NUMAR_MAXIM_FILIALE 7
  3. using namespace std;
  4.  
  5. // stiva folosita pentru backtracking
  6. int stiva[NUMAR_MAXIM_FILIALE];
  7.  
  8. // date de intrare
  9. int numar_legaturi, numar_filiale, filiala_cautata;
  10.  
  11. // matrice de adiacenta pentru reprezentarea datelor de intrare sub forma de graf
  12. int legatura[NUMAR_MAXIM_FILIALE + 1][NUMAR_MAXIM_FILIALE + 1];
  13.  
  14. // tablou in care se retine drumul de cost minim
  15. int ruta_cost_minim[NUMAR_MAXIM_FILIALE], cost_minim = -1;
  16.  
  17. // tablou folosit pentru parcurgerea functiei exista_drum_intoarcere
  18. bool vizitat[NUMAR_MAXIM_FILIALE + 1];
  19.  
  20. bool valid(int);
  21. bool solutie(int);
  22. void backtracking(int);
  23. void retine_solutie();
  24. void reseteaza_vizitat();
  25. void exista_drum_intoarcere(int);
  26.  
  27.  
  28. int main()
  29. {
  30.     cout << "Introduceti numarul de filiale: ";
  31.     cin >> numar_filiale;
  32.     cout << "Introduceti numarul de legaturi directe dintre filiale: ";
  33.     cin >> numar_legaturi;
  34.     cout << "Introduceti legaturile directe si costurile atasate:\n";
  35.     for(int i = 0; i < numar_legaturi; i++) {
  36.         int filiala1, filiala2, cost;
  37.         cin >> filiala1 >> filiala2 >> cost;
  38.         legatura[filiala1][filiala2] = cost; //legaturile sunt presupuse a fi unidirectionale
  39.     }
  40.  
  41.     cout << "Introduceti filiala de la care pleaca datele: ";
  42.     int filiala_start;
  43.     cin  >> filiala_start;
  44.     stiva[0] = filiala_start;
  45.     backtracking(1);
  46.  
  47.     // afisare
  48.     cout << "Costul minim este " << cost_minim << endl;
  49.     cout << "Ruta de cost minim cu drum de intoarcere este: ";
  50.     for(int i = 0; i < numar_filiale; i++) {
  51.         cout << ruta_cost_minim[i] << " ";
  52.     }
  53.     cout << endl;
  54. }
  55.  
  56. bool valid(int k)
  57. {
  58.     // se verifica existenta unei legaturi intre ultima filiala generata si filiala curenta
  59.     if(!legatura[stiva[k-1]][stiva[k]])
  60.         return 0;
  61.  
  62.     int cost_curent = 0;
  63.     // se verifica ca filiala sa nu fi fost vizitata precedent
  64.     for(int i = 0; i < k; i++) {
  65.         if(stiva[i] == stiva[k])
  66.             return false;
  67.         cost_curent += legatura[stiva[i]][stiva[i + 1]];
  68.     }
  69.  
  70.     // costul curent nu trebuie sa depaseasca minimul
  71.     if(cost_minim != -1 && cost_curent >= cost_minim)
  72.         return false;
  73.  
  74.     return true;
  75. }
  76.  
  77. void reseteaza_vizitat()
  78. {
  79.     for(int i = 0; i < NUMAR_MAXIM_FILIALE; i++)
  80.         vizitat[i] = false;
  81. }
  82.  
  83. bool solutie(int k)
  84. {
  85.     reseteaza_vizitat();
  86.     exista_drum_intoarcere(stiva[k]);
  87.     if(k == numar_filiale - 1 && vizitat[stiva[0]])
  88.         return true;
  89.     return false;
  90. }
  91.  
  92. void retine_solutie()
  93. {
  94.     cost_minim = 0;
  95.     for(int i = 0 ; i < numar_filiale; i++) {
  96.         cost_minim += legatura[i][i + 1];
  97.         ruta_cost_minim[i] = stiva[i];
  98.     }
  99. }
  100.  
  101. void backtracking(int k)
  102. {
  103.     // se presupune ca numerotarea filialelor incepe de la 1
  104.     for(int i = 1; i <= numar_filiale; i++) {
  105.         stiva[k] = i;
  106.         if(valid(k)) {
  107.             if(solutie(k))
  108.                 retine_solutie();
  109.             else {
  110.                 backtracking(k+1);
  111.                 stiva[k] = 0;
  112.             }
  113.         }
  114.     }
  115. }
  116.  
  117. void exista_drum_intoarcere(int filiala_curenta)
  118. {
  119.     vizitat[filiala_curenta] = true;
  120.  
  121.     for(int i = 1; i <= numar_filiale; i++) {    
  122.         if(legatura[filiala_curenta][i] && !vizitat[i]) {
  123.             exista_drum_intoarcere(i);
  124.         }
  125.     }
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement