Ellie29

Untitled

Dec 8th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <string>
  4. #include<fstream>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <windows.h>
  8. #include <stdlib.h>
  9. #include <ctime>
  10. #include "k.h"
  11. #include <mutex>
  12. #include <thread>
  13.  
  14. using std::string;
  15. using std::cout;
  16. using std::endl;
  17. using std::vector;
  18. std::mutex mutex;
  19.  
  20. int K::dynamic(int pos, long long visited, int id, int *waga)
  21. {
  22.  
  23.     if (threads > matrix.size() - 1)threads = matrix.size() - 1;
  24.     if (id > matrix.size() - 1)return 0;
  25.    
  26.     if (visited == (long long)(pow(2, matrix.size()) - 1))
  27.         return matrix[pos][0];
  28.     if (dp[pos][visited] != INT_MAX )
  29.     {
  30.         return dp[pos][visited];
  31.     }
  32.    
  33.  
  34.     for (int i = 0; i < matrix.size(); ++i)
  35.     {
  36.         // can't visit ourselves unless we're ending & skip if already visited
  37.         if (i == pos || (long long)(visited & (long long)(pow(2, i))))
  38.             continue;
  39.  
  40.         if (pos == 0 && i == (1 + ((int)(matrix.size() - 1) / threads)*id) && id != threads) {
  41.             return 0;
  42.         }
  43.         if (pos == 0 && i < (((int)(matrix.size() - 1) / threads) * (id - 1)) + 1 ){
  44.             continue;
  45.         }
  46.  
  47.         *waga = matrix[pos][i] + dynamic(i, (visited + pow(2, i)), id, waga);//OR
  48.  
  49.         if (*waga < dp[pos][visited]){
  50.             dp[pos][visited] = *waga;
  51.             k[pos][visited] = i;
  52.         }
  53.     }
  54.     return dp[pos][visited];
  55. }
  56.  
  57.  
  58. void K::d(){
  59.  
  60.     cout << 0 << "->" << k[0][1] << "->";
  61.     int p = k[k[0][1]][(1 | (1 << k[0][1]))];
  62.     int q = (1 | (1 << k[0][1]));
  63.  
  64.     for (int i = 0; i < N - 3; i++)//poprzedniki i nastepniki
  65.     {
  66.         cout << p << "->";
  67.         q = (q | (1 << p));
  68.         p = k[p][(q | (1 << p))];
  69.  
  70.     }cout << p << "->" << 0 << endl;
  71.  
  72. }
  73.  
  74. void K::pobierz(string s)
  75. {
  76.     v.erase(v.begin(), v.end());
  77.     h.erase(h.begin(), h.end());
  78.     std::ifstream plik;
  79.     plik.open(s.c_str());
  80.     plik >> this->N;
  81.     matrix = vector<vector<int>>(N, vector<int>(N));
  82.     for (int i = 0; i < N && !plik.eof(); i++)
  83.     {
  84.         for (int j = 0; j < N && !plik.eof(); j++){
  85.  
  86.             plik >> matrix[i][j];
  87.         }
  88.  
  89.     }
  90.     plik.close(); cout << "close" << endl;
  91.  
  92.     v = vector<vector<int>>(N-1, vector<int>(N-1));
  93.     for (int j = 0; j < N-1; j++)
  94.     {
  95.         v[j][0] = j + 1;
  96.         for (int i = 1, k = 1; i < N - 1; i++,k++)
  97.         {
  98.             if (j+1==i)k++;
  99.             v[j][i]=k;
  100.         }
  101.     }
  102.     long long ss = pow(2, matrix.size()) - 1;
  103.  
  104.     dp = vector<vector<int>>(matrix.size());
  105.     k = vector<vector<int>>(matrix.size());
  106.     for (auto& neighbors : dp)
  107.         neighbors = vector<int>(ss, INT_MAX);
  108.     for (auto& neighbors : k)
  109.         neighbors = vector<int>(ss, NULL);
  110. }
  111.  
  112. int bf(vector<vector<int>>matrix, vector<int>v,int N)
  113. {
  114.     int best_w = INT_MAX;
  115.     do{
  116.         int weight = 0;
  117.         for (int i = 0; i < N - 1; i++)
  118.         {
  119.             if (i == 0){ weight += matrix[0][v[0]]; }
  120.             else{
  121.                 weight += matrix[v[i - 1]][v[i]];
  122.             }
  123.         }
  124.         weight += matrix[v[N - 2]][0];
  125.         if (best_w > weight){ best_w = weight;  }
  126.  
  127.     } while (std::next_permutation(v.begin()+1, v.end()));
  128.     cout <<"bbb = "<< best_w << endl;
  129.     return best_w;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment