Advertisement
Nita_Cristian

Campanie electorala

Dec 20th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("orase.in");
  6. ofstream fout("orase.out");
  7.  
  8. int n, x, i, j, a[101][101], ap[101], minim;
  9. vector< pair<int, int> > l[101];
  10. vector<int> sol;
  11. bool stop;
  12.  
  13. bool comp( pair<int, int>& a)
  14. {
  15.     return a.second == j;
  16. }
  17.  
  18. void afisare(int cost)
  19. {
  20.     if(cost < minim)
  21.     {
  22.         minim = cost;
  23.  
  24.         fout.close();
  25.         fout.open("orase.out", ios :: out);
  26.  
  27.         fout << minim << '\n';
  28.  
  29.         for(const auto it : sol)
  30.         {
  31.             fout << it << ' ';
  32.         }
  33.         fout << sol[0] << endl;
  34.     }
  35.  
  36.     stop = true;
  37. }
  38.  
  39. bool solutie()
  40. {
  41.     j = 1;
  42.     return sol.size() == n && (find_if(l[sol[n-1]].begin(), l[sol[n-1]].end(), comp) != l[sol[n-1]].end());
  43. }
  44.  
  45. void backt(int crt, int cost = 0)
  46. {
  47.     if(cost > minim)
  48.     {
  49.         return;
  50.     }
  51.  
  52.     for(auto i = l[crt].begin(); i != l[crt].end() && !stop; i++)
  53.     {
  54.         if(!ap[i -> second] || i -> second == 1 && sol.size() == n)
  55.         {
  56.             ap[i -> second] = 1;
  57.             sol.push_back(i -> second);
  58.  
  59.             if(solutie())
  60.             {
  61.                 j = sol[n-1];
  62.  
  63.                 afisare(i->first + cost + find_if(l[sol[0]].begin(), l[sol[0]].end(), comp)-> first);
  64.             }
  65.             else
  66.             {
  67.                 backt(i -> second, cost + i -> first);
  68.             }
  69.  
  70.             ap[i -> second] = 0;
  71.             sol.pop_back();
  72.         }
  73.     }
  74. }
  75.  
  76. void rezolvare()
  77. {
  78.     for(int i = 1; i <= n; i++)
  79.     {
  80.         ap[i] = 1;
  81.         sol.push_back(i);
  82.  
  83.         backt(i);
  84.  
  85.         stop = false;
  86.  
  87.         ap[i] = 0;
  88.         sol.pop_back();
  89.     }
  90. }
  91.  
  92. int main()
  93. {
  94.     fin >> n;
  95.     minim = INT_MAX;
  96.     for(i = 1; i <= n; i++)
  97.     {
  98.         for(j = 1; j <= n; j++)
  99.         {
  100.             fin >> x;
  101.  
  102.             if( x && i > j)
  103.             {
  104.                 l[i].push_back({x,j});
  105.                 l[j].push_back({x,i});
  106.             }
  107.         }
  108.     }
  109.  
  110.     for(int i = 1; i <= n; i++)
  111.     {
  112.         sort(l[i].begin(), l[i].end());
  113.     }
  114.  
  115.     rezolvare();
  116.  
  117.     return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement