dude2099

Comis Voiajor

Dec 3rd, 2019
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. int x[10], a[10][10], n, nrsol,smin=10000,sol[100];
  6.  
  7. void init(int k)
  8. {
  9.     x[k]=1;
  10. }
  11. int cont(int k)
  12. {
  13.     for(int i=2; i<k; i++)
  14.         if(x[k]==x[i])
  15.             return 0;
  16.     if(a[x[k-1]][x[k]]==0)
  17.            return 0;
  18.     if(k==n)
  19.         if(a[x[n]][x[1]]==0)
  20.             return 0;
  21.     return 1;
  22. }
  23. int existaSuccesor(int k)
  24. {
  25.     return x[k]<n;
  26. }
  27. int solutie(int k)
  28. {
  29.     int s=0;
  30.     if(k==n)
  31.     {
  32.         for(int i=1;i<n;i++)
  33.             s+=a[x[i]][x[i+1]];
  34.         s+=a[x[n]][1];
  35.         if(s<smin)
  36.         {
  37.             smin=s;
  38.             for(int j=1;j<=n;j++)
  39.                 sol[j]=x[j];
  40.         }
  41.         return 1;
  42.     }
  43.     return 0;
  44. }
  45. void tipar()
  46. {
  47.     nrsol++;
  48.     for(int i=1; i<=n; i++)
  49.         cout<<x[i]<<" ";
  50.     cout<<endl;
  51. }
  52. void back()
  53. {
  54.     int k=2;
  55.     init(k);
  56.     while(k>1)
  57.     {
  58.         if(existaSuccesor(k))
  59.         {
  60.             x[k]=x[k]+1;
  61.             if(cont(k))
  62.                if(solutie(k))
  63.                   tipar();
  64.                else
  65.                {
  66.                    k++;
  67.                    init(k);
  68.                }
  69.         }
  70.         else k--;
  71.     }
  72. }
  73. int main()
  74. {
  75.     ifstream f("intrare.in");
  76.     f>>n;
  77.     for(int i=1; i<n; i++)
  78.         for(int j=i+1; j<=n; j++)
  79.         {
  80.             f>>a[i][j];
  81.             a[j][i]=a[i][j];
  82.         }
  83.     x[1]=1;
  84.     back();
  85.     cout<<"Numarul de solutii este: "<<nrsol;
  86.     cout<<"\nDrumul minim este: ";
  87.     for(int i=1;i<=n;i++)
  88.         cout<<sol[i]<<" ";
  89.     cout<<"si are lungimea "<<smin<<".";
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment