Advertisement
GTnik

Untitled

May 9th, 2019
488
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.51 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <random>
  4. #include <chrono>
  5.  
  6. #include <iostream>
  7.  
  8. using namespace std;
  9.  
  10. int32_t rand_max = 4549;
  11. mt19937 mt_generator(static_cast<unsigned>(time(nullptr)));
  12. uniform_int_distribution<> uniformIntDistribution(1, rand_max);
  13.  
  14. class DanceTriples {
  15.     void init_tutte_matrix() {
  16.         tutte.clear();
  17.         tutte.resize(2 * males + females);
  18.  
  19.         for (int32_t i = 0; i < 2 * males + females; ++i) {
  20.             tutte[i].resize(2 * males + females, 0);
  21.         }
  22.  
  23.         for (int32_t i = 0; i < links.size(); ++i) {
  24.             int32_t from = links[i].first;
  25.             int32_t to = links[i].second;
  26.             int32_t rand_v = uniformIntDistribution(mt_generator);
  27.  
  28.             tutte[from][to] = rand_v;
  29.             tutte[to][from] = rand_max - rand_v;
  30.         }
  31.  
  32. //        for (size_t i = 0; i < 2 * males + females; i++) {
  33. //            for (size_t j = 0; j < 2 * males + females; j++) {
  34. //                cout << tutte[i][j] << "\t";
  35. //            }
  36. //            cout << "\n";
  37. //        }
  38.     }
  39.  
  40.     int32_t get_invert_coeff(uint32_t x, uint32_t p) {
  41.         uint32_t p_dcr = p - 2;
  42.         long long k = 1;
  43.         long long j = x;
  44.  
  45.         while (p_dcr > static_cast<unsigned>(0)) {
  46.             if ((p_dcr & static_cast<unsigned>(1)) > 0) {
  47.                 k = (k * j) % p;
  48.             }
  49.  
  50.             j = (j * j) % p;
  51.             p_dcr = p_dcr >> static_cast<unsigned>(1);
  52.         }
  53.  
  54.         return static_cast<int32_t>(k % p);
  55.     }
  56.  
  57.     int32_t get_tutte_rank_v2() {
  58.         int32_t size = 2 * males + females;
  59.         int32_t rank = 0, row = 0, col = 0;
  60.  
  61.         while (max(row, col) < size) {
  62.             int32_t swap_index = 0;
  63.             bool index_set = false;
  64.             for (int32_t j = row; j < size; ++j) {
  65.                 if (tutte[j][col] != 0) {
  66.                     ++rank;
  67.                     swap_index = j;
  68.                     index_set = true;
  69.                     if (row != swap_index) {
  70.                         swap(tutte[row], tutte[swap_index]);
  71.                     }
  72.                     break;
  73.                 }
  74.             }
  75.             if (!index_set) {
  76.                 ++col;
  77.             } else {
  78.                 for (int32_t i = row + 1; i < size; ++i) {
  79.                     int32_t factor = (tutte[i][col] * get_invert_coeff(tutte[row][col], rand_max)) % rand_max;
  80.                     for (int32_t j = col; j < size; ++j) {
  81.                         if (j == col) {
  82.                             tutte[i][j] = 0;
  83.                         } else {
  84.                             tutte[i][j] = ((rand_max - ((tutte[row][j] * factor) % rand_max)) + tutte[i][j]) % rand_max;
  85.                         }
  86.                     }
  87.                 }
  88.                 ++col;
  89.                 ++row;
  90.             }
  91.         }
  92.         return rank;
  93.     }
  94.  
  95.     int32_t males = 0;
  96.     int32_t females = 0;
  97.     vector<pair<int32_t, int32_t>> links;
  98.     vector<vector<int32_t>> tutte;
  99.  
  100. public:
  101.     DanceTriples(istream &input) {
  102.         input >> males >> females;
  103.  
  104.         // first  males located, than males dups, than females
  105.         for (int32_t i = 0; i < males; i += 1) {
  106.             links.push_back(make_pair(i, i + males));
  107.         }
  108.  
  109.         for (int32_t i = 0; i < males; ++i) {
  110.             string linkeage;
  111.             input >> linkeage;
  112.  
  113.             for (int32_t j = 0; j < females; ++j) {
  114.                 if (linkeage[j] == '1') {
  115.                     links.push_back(make_pair(i, 2 * males + j));
  116.                     links.push_back(make_pair(i + males, 2 * males + j));
  117.                 }
  118.             }
  119.         }
  120.     }
  121.  
  122.     int32_t get_triples_num() {
  123.         int32_t max_checks = 5;
  124.         int32_t max_triples = 0;
  125.  
  126.         for (int i = 0; i < max_checks; ++i) {
  127.             init_tutte_matrix();
  128.             int32_t rank_v2 = get_tutte_rank_v2();
  129.             int32_t triples = (rank_v2 / 2) - males;
  130.             max_triples = max(triples, max_triples);
  131.         }
  132.  
  133.         return max_triples;
  134.     }
  135. };
  136.  
  137.  
  138. int main() {
  139.     ifstream input_stream;
  140.     input_stream.open("triples.in");
  141.  
  142.     ofstream output_stream;
  143.     output_stream.open("triples.out");
  144.  
  145.     int32_t dance_parties = 0;
  146.     input_stream >> dance_parties;
  147.  
  148.     for (int32_t i = 0; i < dance_parties; ++i) {
  149.         DanceTriples dance_party(input_stream);
  150.         int32_t triples = dance_party.get_triples_num();
  151.         output_stream << triples << '\n';
  152.     }
  153.  
  154.     input_stream.close();
  155.     output_stream.close();
  156.  
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement